TOPy[W > TOP > > b̃foO
@wywm@z[y[W

@@wywm@@
@|b̃foO|@@
ŏIXVF2025N12

@CvÕfoOɂ‚čl܂B

@1̕@́AvOprintf()(C̎v֐Q)āAvO̗ǂƂƂɁAϐ̒lj^邱ƂłBƂāAK̊֐strpbrk()֐ƔrȂAȉ̓l@\̎֐strpbrk_1()(ܘ_܂)AfoOĂ݂܂B

int strpbrk_1(char *pc1, char *pc2) {
char c1, c2;

while(c1 = *pc1++) {
while(c2 = *pc2++) {
if (c1 == c2) return pc1;
}
}
return (char *)NULL;
}

main()֐̒̌ĂяóA

char delimiter[] = " .,";
char *pc1;

string = (char *)malloc(100);
strcpy(string, "abcdef ghi,jk");
pc1 = strpbrk_1(string, delimiter);
printf("擪F%lx, ʁF%lx\n", string, pc1);

ƂȂĂƂ܂Bstrpbrk()֐̌ʂƔrȂfoOĂ݂܂B

@RpCē삳ƁAʂɂ́A

擪F800474f50, ʁF474f52

ƕ\܂Bstrpbrk()֐̌ʂ́A800474f56łBĂ悤ŁA傫Ⴄ̂́Astrpbrk()̌ʂ800000000̕Astrpbrk_1()łȂȂĂ邱ƂłBŁAwhileif̊ԂprintfĂ݂܂B

int strpbrk_1(char *pc1, char *pc2) {
char c1, c2;

while(c1 = *pc1++) {
while(c2 = *pc2++) {
printf("pc1:%lx\n");
if (c1 == c2) return pc1;
}
}
return (char *)NULL;
}

ŁAprintfCfgɁAsĂ̂́AfoOɁAڗ‚̂ŁAprintfł邩łBRpCēƁAʂɂ́A

pc1:800474f51
pc1:800474f51
pc1:800474f51
pc1:800474f52
pc1:800474f52
擪F800474f50, ʁF474f52

ƕ\܂Bstrpbrk_1̒łpc14oCgzlɂȂĂ̂ŁAreturn pc1̖ł͂ȂƂ킩܂Bɂ炸A߂l800000000ȂȂĂ܂͖̂߂l̎w̎dɖ肪̂łBŁA֐`int strpbrk_1(char *pc1, char *pc2)int߂l4oCgɂĂ܂Ă̂ƕ܂BprintfU폜āA֐`intchar *ɒāA

char *strpbrk_1(char *pc1, char *pc2) {
char c1, c2;

while(c1 = *pc1++) {
while(c2 = *pc2++) {
if (c1 == c2) return pc1;
}
}
return (char *)NULL;
}

ƂāARpC삳ƁAʂɂ́A

擪F800474f50, ʁF800474f52

ƕ\܂BstrinǵA "abcdef ghi,jk"ƂȂĂ̂ŁA擪2oCg߂ƂʂԂAƂƂ́A擪2oCg߂'c'delimiter[] = " .,"̂ǂꂩ̕ƂĂAƂƂłBŁAx́Awhileif̊ԂɁApc1ɉāAc1pc2Cc2̓eprintfĂ݂܂B

char *strpbrk_1(char *pc1, char *pc2) {
char c1, c2;

while(c1 = *pc1++) {
while(c2 = *pc2++) {
printf("pc1:%lx, c1:%02x, pc2:%lx, c2:%02x\n", pc1, c1, pc2, c2);
if (c1 == c2) return pc1;
}
}
return (char *)NULL;
}

RpCē삳ƁAʂɁA

pc1:800474f51, c1:61, pc2:ffffc24d, c2:20
pc1:800474f51, c1:61, pc2:ffffc24e, c2:2e
pc1:800474f51, c1:61, pc2:ffffc24f, c2:2c
pc1:800474f52, c1:62, pc2:ffffc241, c2:61
pc1:800474f52, c1:62, pc2:ffffc242, c2:62

ƕ\܂B̌ʂ͂܂܂łBȂȂA邢́A_[ƕ\AňASIGSEGVNĎ~܂Ă܂AƂꍇ邩m܂Bstrpbrk_1()A800474f52ԂĂ̂́Astring2߂'b'łāAdelimiter[] = " .,"3߂񖖔0ŁAs߂āAdelimiter5߂ɂ܂'b'ƏĂĈv̂ŁAwhile𔲂retrunĂ̂łBdelimiter[] = " .,"ƂȂĂƂAdelimiter4߈ȍ~ɉĂ邩AS܂B

@NĂ邩ƌƁApc2̐ɖ0oĂAŁApc2delimiter̐擪ɖ߂Ȃ΂Ȃ̂ɁÂ܂܃CNgčs߂Ă܂AƂƂłBŁAstrpbrk_1̍ŏŁApc2pc0ɕۑĂāAwhile[v𔲂Apc2pc0ɖ߂悤ɂ܂B

char *strpbrk_1(char *pc1, char *pc2) {
char c1, c2;
char *pc0;

pc0 = pc2;
while(c1 = *pc1++) {
while(c2 = *pc2++) {
printf("pc1:%lx, c1:%02x, pc2:%lx, c2:%02x\n", pc1, c1, pc2, c2);
if (c1 == c2) return pc1;
}
pc2 = pc0;
}
return (char *)NULL;
}

RpCēƁA

pc1:800474f51, c1:61, pc2:ffffc24d, c2:20
pc1:800474f51, c1:61, pc2:ffffc24e, c2:2e
pc1:800474f51, c1:61, pc2:ffffc24f, c2:2c
@@EEEEEE
pc1:800474f56, c1:66, pc2:ffffc24e, c2:2e
pc1:800474f56, c1:66, pc2:ffffc24f, c2:2c
pc1:800474f57, c1:20, pc2:ffffc24f, c2:20
擪F800474f50, ʁF800474f57

ƕ\܂Bstring̋󔒂̂ƂŁAdelimiter[]̋' 'ƈvreturn킯łAstrpbrk()֐ł́A800474f56Ԃ̂ŁA܂܂B1s߂Ă܂̂́AŏwhileŁAwhile(c1 = *pc1++)ƂĂāApc11ǂݏoĂpc1CNgĂ̂ŁAreturn pc1ƂɁA󔒂̈ʒupc11ił܂łBŁApc1̈ʒu1ǂݏoĂpc1CNgAwhile𔲂ĂCNg悤ɂ܂BāA

char *strpbrk_1(char *pc1, char *pc2) {
char c1, c2;
char *pc0;

pc0 = pc2;
while(c1 = *pc1) {
while(c2 = *pc2++) {
if (c1 == c2) return pc1;
}
pc2 = pc0;
pc1++;
}
return (char *)NULL;
}

ƂƁA悤₭Astrpbrk_1()֐800474f56Ԃ悤ɂȂ܂BłAFXĂ邤ɁA܂̊֐QNAĂprintf()ꍇ邩m܂BŁACvEvZbTg܂Bȉ̂悤ɁAprintf()#ifdef DEBUG#endifŋ݂܂BĂƁAvO̐擪ŁA#define DEBUGƂƁA#ifdef DEBUG̎ɐiŁAprintf()LɂȂA#define DEBUG폜ƁA#ifdef DEBUG#endif̊ԂpXāAprintf()͖ɂȂ܂Bprintf()vÔƂɎU΂߂KvƂɂ͈ꊇprintf()̗L/wł̂ŕ֗łB

char *strpbrk_1(char *pc1, char *pc2) {
char c1, c2;
char *pc0;

pc0 = pc2;
while(c1 = *pc1) {
while(c2 = *pc2++) {
#ifdef DEBUG
printf("pc1:%lx, c1:%02x, pc2:%lx, c2:%02x\n", pc1, c1, pc2, c2);
#endif
if (c1 == c2) return pc1;
}
pc2 = pc0;
pc1++;
}
return (char *)NULL;
}

@foȎ2̕@́ACɗpӂĂfoKgdb𗘗p@łBprintffoOɔׂāAڍׂȃfoO”\łBprintffoOŗeՂɃoǑ‚߂Ȃꍇɂ́Agdb𗘗p܂BLstrpbrk_1()̏ꍇAvÕt@CAtest.cƂāAgccŃRpCƂɁA-gIvVtāA

gcc -g -o test.exe test.c

ƃRpCĂ܂BƁAtest.exe̒ɁAsԍEϐȂǂ̏񂪓܂BĂłtest.exefoOƂɂ́Atest.exeA/home/owner/testȉɂƂ(̃fBNg‹ϐPATHɉĂȂꍇAexet@C݈̑ʒutpXŎw肷Kv܂)A

gdb /home/owner/test/test.exe

ƂăfoKN܂BfoKNƁAbZ[W\A(gdb)ƃvvg\ē͑҂ɂȂ܂BŎgR}h(ȗ`)ɂ͈ȉ̂̂܂B

b@(break̗)u[NE|Cg̐ݒ
c@(continue̗)~ʒusĊJ
d@(delete̗)u[NE|Cg̍폜
f@(frame̗)X^bNEt[̕\
h@(help̗)wv̕\
i@(info̗)̕\
l@(list̗)\[XER[h̕\
n@(next̗)VOEXebv(֐ɓȂ)
p@(print̗)ϐ̓e⎮̌ʂ\
q@(quit̗)gdb̏I
r@(run̗)vO̎s
s@(step̗)VOEXebv(֐ɓ)
x@zf[^̕\

R}h҂̂ƂɁA
l 80
ƂƁAtest.c80sڂ̑O㍇킹10s̃\[XER[h\܂BāA84s߂œ~߂ꍇɂ́A
b 84
Ƃ܂Bu[NE|Cgƌ܂Bu[NE|Cgݒ肵āA
i b
ƂƁA
1@breakpoint@keep y@0x0000000100401229@in stpblk_1 at test.c 84
ƂɁAu[NE|Cg̏\܂B‚̃u[NE|Cgݒ肳ĂƂAu[NE|CgƂɁAԍɑău[NE|Cg̏\܂B̔ԍɑ΂āA
d 1
̂悤ȃR}h͂ƁA1Ԃ̃u[NE|Cg폜ł܂Bstrpbrk_1()֐̐擪Ƀu[NE|CgƂ́A
b strpbrk_1
Ƃ܂BŁA
r
ƑłނƁAvO̓삪JnAu[NE|Cgݒ肳Ă̂ŁA
Brekapoint 2, strpbrk_1 (pc1=0x800028440 "abcdef ghi,jk", pc2=0xffffc21c " .,") at test.c 83)
83@pc0 = pc2;
ƁAĂяoꂽ֐Ȁ\AsԍƁA\[XER[ĥ̍s\āAR}h͑҂ɂȂ܂BŁA
n
ƑłނƁA1ssĎ̍sɍsA
84@while (c1 = *pc1) {
ƁAsԍƁA\[XER[ĥ̍s\āAR}h͑҂ɂȂ܂BŁAϐpc0̓emF邽߂ɁA
p pc0
Ɠ͂ƁA
$1 = 0xffffc21c " .,"
̂悤ɁApc0̓e\܂B|C^̐ɂ擾ł܂B
p *pc0
ƂƁA
$2 = 32 ' '
̂悤ɕ\܂B|C^łȂAp̌ɎƎ̒l\܂BŁA
n
ƑłނƁA1ssĎ̍sɍsA
85@@while (c2 = *pc2++) {
ƕ\āAR}h͑҂ɂȂ܂Bϐc1̓emF邽߂ɁA
p c1
ƂƁA
$3 = 97 'a'
Ɛŕ\܂B16i\ꍇɂ́A
p/x c1
ƂƁA
$4 = 0x61
ƕ\܂BAhX(|C^)1oCg˜A8oCg̃f[^16iŕ\Ƃ悤ȏꍇxR}hg܂B"x/"ɑăf[^̌Ao͌`̕Af[^TCY̕𑱂܂Bo͌`̕ɂ́Ax(16i)Cd(t10i)Cu(Ȃ10i)ȂǂAf[^TCX̕ɂb(oCgP)Ch(2oCgP)Cw(4oCgP)Cg(8oCgP)Ȃǂw肵܂Bpc11oCg˜A8oCg̃f[^16iŕ\ꍇɂ́A
x/8xb
Ƃ܂BŁAnR}hJԂĎg1Xebvił܂A1xnR}hgƁAR}h҂ŒP[ENTER]΁AnR}hJԂs܂Bς킵ȂAēxu[NE|Cgݒ肵AĊJR}hA
c
͂ƁAu[NE|Cg܂ŎsĒ~܂BXebvsR}h́A֐ĂяoĂƂŎsƁA֐ɓĂ܂AnR}hł͊֐Ăяo̎̍sɍs܂B
@cR}hrR}hŃvO𓮍삳ĂԂɁASIGSEGVȂǂ̗ONĎ~܂Ă܂Ƃ܂B̂ƂɁA
r
͂ƁAǂ邩y/nŕĂ܂AyƂƁAvOŏ蒼܂Bu[NE|Cgݒ肵ȂāANj邱Ƃł܂B܂AvÔ܂AvOCꍇɂ́A
q
Ɠ͂ƁAy/nŕĂ܂AyƂƁAgdb甲܂B
̑ɁAcd(JgEfBNg̕ύX)Cpwd(JgEfBNg̕\)CwatchCsetCdisplayCcommandsȂǂ̃R}h܂B

@vO̓̕ϐ̓𒲂ׂꍇɂ́AwatchR}hg܂B
watch pc1
ƂƁApc1̓eɕωꍇɂ́A
Old value = 0x28446 ""
New Value = 0x800028446 " ghi,jk"
̂悤ɕ\āANsŒ~܂Bwatch]葽ݒ肷ƁAvO̓삪݂Ȃ܂B
@R}hC"-r -g:test1.txt"texet@Csꍇ́AsetR}hpāAvO𓮍삹OɁA
set args -r -g:test1.txt
Ƃ܂BsetR}h́Aϐ̒lݒ肷̂ɂg܂B
set pc1 = 0x800028443
ƂƁAϐpc1̒lA0x00028443ɂȂ܂BdisplayR}h́ApR}hƂقړl̓܂B

@vO~ƂɌ߂ꂽR}hsꍇAႦΌ߂ꂽϐ̓e\ƂAcommandsgƂł܂BR}h҂̂ƂɁAcommandsɑău[NE|Cg̔ԍ(i bR}hŊmFł܂)LA
commands 1
p pc1
end
Ɠ͂ĂƁA1Ԃ̃u[NE|Cgł~邽тɁApc1̓e\Ă܂B
@܂Agdbɂ́A.gdbinitƂt@C(t@C̐擪sIh'.'łt@Cł)OɓǂݍނƂ@\܂B/homefBNgɁA
add-auto-loadsafe-path /home/owner/test/.gdbinit
set auto-load safe-path /
Ƃe.gdbinitƂt@C(sR[hAWindows0DC0Ał͂ȂALINUX0Ał邱ƂɒӂĂ)uA/home/owner/test̒ɁAgdb̃R}hAႦ΁Aset argsƂA
b main
b strpbrk_1
commands 2
p pc1
end
r
Ə.gdbinitƂt@C(sR[hAWindows0DC0Ał͂ȂALINUX0Ał邱ƂɒӂĂ)uĂƁAgdbNɁÃR}hsĂ܂Bgdb̋NƂƂɁAvOJnAmainňU~AĊJāA2Ԗڂ̃u[NE|Cgstrpbrk_1Œ~ƂɁApc1̓e\܂B


TOPy[Wɖ߂@@
TOP@@
wywmē@@
w̃y[W@@
̃y[W@@
yVuO@@
wywmuO@@
wywmtwitter@@
񍐃uO@@
vCoV[E|V[


yLz@LłB̊F܂̂x肽A낵肢܂B
yLz@L͂܂łłB

© 2005-2025@F(L)