@wywm@z[y[W
ŏIXVF2025N12
@CvÕfoOɂčl܂B
@1̕@́AvOprintf()(C̎vQ)ā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̂ŁAwhileretrunĂ̂łBdelimiter[] = " .,"ƂȂĂƂAdelimiter4߈ȍ~ɉĂ邩AS܂B
@NĂ邩ƌƁApc2̐ɖ0oĂAŁApc2delimiter̐擪ɖ߂ȂȂ̂ɁÂ܂܃CNgčs߂Ă܂AƂƂłBŁAstrpbrk_1̍ŏŁApc2pc0ɕۑĂāAwhile[vApc2pc0ɖ߂悤ɂ܂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ƂɁÄʒ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^)1oCgA8oCg̃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肵܂Bpc11oCgA8oCg̃f[^16iŕ\ꍇɂ́A
x/8xb
Ƃ܂BŁAnR}hJԂĎg1Xebvił܂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
yLz@LłB̊F܂̂x肽A낵肢܂B
yLz@L͂܂łłB