ããããã¢ã«ããŒã- ã¢ã»ã³ããªãåŠç¿ããããšã§Cãç解ããŸããååãAllan O'Donnellã
GDBã䜿çšããŠCãåŠç¿ããæ¹æ³ã«ã€ããŠè©±ããŸããã ä»æ¥ã¯ãGDBã®äœ¿çšãã¢ã»ã³ãã©ãŒã®ç解ã«ã©ã®ããã«åœ¹ç«ã€ãã瀺ããããšæããŸãã
æœè±¡ã¬ãã«ã¯ãç©ãäœæããããã®åªããããŒã«ã§ãããåŠç¿ã®éå£ã«ãªãå ŽåããããŸãã ãã®æçš¿ã®ç®çã¯ãCããã£ããç解ããã«ã¯ãã³ã³ãã€ã©ãçæããã¢ã»ã³ãã©ã³ãŒããç解ããå¿
èŠãããããšãçŽåŸãããããšã§ãã GDBã䜿çšããŠåçŽãªCããã°ã©ã ãéã¢ã»ã³ãã«ããã³è§£æããäŸã䜿çšããŠãããè¡ããŸãããã®åŸãGDBãšååŸããã¢ã»ã³ãã©ãŒã®ç¥èã䜿çšããŠãCã§ã®éçããŒã«ã«å€æ°ã®æ§é ã調ã¹ãŸãã
èè
泚ïŒãã®èšäºã®ã³ãŒãã¯ãã¹ãŠãæé©åãç¡å¹ã«ããClang 4.0ïŒ
-O0 ïŒã䜿çšããŠãMac OS X 10.8.1ã®x86_64ããã»ããµãŒã§ã³ã³ãã€ã«ãããŸããã
GDBã䜿çšããåŠç¿ã¢ã»ã³ãã©ãŒ
GDBã䜿çšããŠããã°ã©ã ãéã¢ã»ã³ãã«ããããšããå§ããŠãåºåã®èªã¿æ¹ãåŠã³ãŸãããã 次ã®ããã°ã©ã ããã¹ããå
¥åãã
simple.cãã¡ã€ã«ã«ä¿åããŸãã
int main(void) { int a = 5; int b = a + 6; return 0; }
ãããã°ã¢ãŒãã§æé©åãç¡å¹ã«ããŠã³ã³ãã€ã«ããGDBãå®è¡ããŸãã
$ CFLAGS="-g -O0" make simple cc -g -O0 simple.c -o simple $ gdb simple
mainé¢æ°ã«ãã¬ãŒã¯ãã€ã³ããèšå®ãã
returnã¹ããŒãã¡ã³ãã«å°éãããŸã§å®è¡ãç¶ããŸãã
次ã®ã¹ããŒãã¡ã³ãã®åŸã«2ãå
¥åããŠã2åå®è¡ããããšã瀺ããŸãã
(gdb) break main (gdb) run (gdb) next 2
次ã«ã
éã¢ã»ã³ãã«ã³ãã³ãã䜿çšããŠãçŸåšã®é¢æ°ã®ã¢ã»ã³ãã©ãŒåœä»€ãåºåããŸãã
é¢æ°åã
éã¢ã»ã³ãã«ã³ãã³ãã«æž¡ããŠã調ã¹ãå¥ã®é¢æ°ã瀺ãããšãã§ããŸãã
(gdb) disassemble Dump of assembler code for function main: 0x0000000100000f50 <main+0>: push %rbp 0x0000000100000f51 <main+1>: mov %rsp,%rbp 0x0000000100000f54 <main+4>: mov $0x0,%eax 0x0000000100000f59 <main+9>: movl $0x0,-0x4(%rbp) 0x0000000100000f60 <main+16>: movl $0x5,-0x8(%rbp) 0x0000000100000f67 <main+23>: mov -0x8(%rbp),%ecx 0x0000000100000f6a <main+26>: add $0x6,%ecx 0x0000000100000f70 <main+32>: mov %ecx,-0xc(%rbp) 0x0000000100000f73 <main+35>: pop %rbp 0x0000000100000f74 <main+36>: retq End of assembler dump.
ããã©ã«ãã§ã¯ã
éã¢ã»ã³ãã«ã³ãã³ãã¯ãGNUã¢ã»ã³ãã©ãŒã§äœ¿çšãããæ§æãšäžèŽããATïŒTæ§æã§åœä»€ãåºåããŸãã æ§æATïŒTã®åœ¢åŒã¯ã
ããŒã¢ãã㯠source ã
destinationã§ãã
ããŒã¢ããã¯ã¯äººéãèªããåœä»€åã§ãã ãŸãã
ãœãŒã¹ãš
ãã¹ãã£ããŒã·ã§ã³ã¯ãªãã©ã³ãã§ãããçŽæ¥å€ãã¬ãžã¹ã¿ãã¡ã¢ãªã¢ãã¬ã¹ããŸãã¯ã©ãã«ã«ããããšãã§ããŸãã åæ§ã«ãå³å€ã¯å®æ°ã§ãããæ¥é èŸ
$ãä»ããŠããŸãã ããšãã°ã
$ 0x5ã¯16é²æ°è¡šçŸã®5ã«å¯Ÿå¿ããŸãã ã¬ãžã¹ã¿åã®å
é ã«ã¯
ïŒ
ãä»ããŸãã
ç»é²
ã¬ãžã¹ã¿ã調ã¹ãã®ã«æéãè²»ãã䟡å€ããããŸãã ã¬ãžã¹ã¿ã¯ãäžå€®åŠçè£
眮ã«çŽæ¥é
眮ãããããŒã¿ã¹ãã¬ãŒãžã®å Žæã§ãã ããã€ãã®äŸå€ãé€ããããã»ããµã¬ãžã¹ã¿ã®ãµã€ãºãŸãã¯
å¹
ã«ãã£ãŠã¢ãŒããã¯ãã£ã決ãŸããŸãã ãããã£ãŠã64ãããCPUã䜿çšããŠããå Žåããã®ã¬ãžã¹ã¿ã®å¹
ã¯64ãããã«ãªããŸãã åãããšã32ãããããã³16ãããããã»ããµãªã©ã«ãåœãŠã¯ãŸããŸããã¬ãžã¹ã¿ãžã®ã¢ã¯ã»ã¹é床ã¯éåžžã«é«éã§ããããã®ãããç®è¡æŒç®ããã³è«çæŒç®ã®ãªãã©ã³ããã¬ãžã¹ã¿ã«æ ŒçŽãããããšããããããŸãã
x86ãã¡ããªã®ããã»ããµã«ã¯ãå€æ°ã®ç¹æ®ã¬ãžã¹ã¿ãšæ±çšã¬ãžã¹ã¿ããããŸãã æ±çšã¬ãžã¹ã¿ã¯ããããæäœã«äœ¿çšã§ããããã«ä¿åãããããŒã¿ã¯ããã»ããµã«ãšã£ãŠç¹å¥ãªæå³ãæã¡ãŸããã äžæ¹ãããã»ããµã¯äœæ¥äžã«ç¹æ®ã¬ãžã¹ã¿ã«äŸåããŠãããããã»ããµã«æ ŒçŽãããŠããããŒã¿ã¯ç¹å®ã®ã¬ãžã¹ã¿ã«å¿ããŠç¹å®ã®å€ãæã¡ãŸãã ãã®äŸã§ã¯ã
ïŒ
eaxãš
ïŒ
ecxã¯æ±çšã¬ãžã¹ã¿ãŒã§ããã
ïŒ
rbpãš
ïŒ
rspã¯ç¹æ®ã¬ãžã¹ã¿ãŒã§ãã
ïŒ
rbpã¬ãžã¹ã¿ã¯ãçŸåšã®ã¹ã¿ãã¯ãã¬ãŒã ã®ããŒã¹ãæãããŒã¹ãã€ã³ã¿ãŒã§ãã
ïŒ
rspã¯ãçŸåšã®ã¹ã¿ãã¯ãã¬ãŒã ã®æäžéšãæãã¹ã¿ãã¯ãã€ã³ã¿ãŒã§ãã ã¹ã¿ãã¯ã¯åžžã«ããé«ãã¡ã¢ãªã¢ãã¬ã¹ããéå§ããããäœãã¢ãã¬ã¹ã«åãã£ãŠæé·ããããã
ïŒ
rbpã¬ãžã¹ã¿ã¯
ïŒ
rspãããåžžã«éèŠã§ãã ãã³ãŒã«ã¹ã¿ãã¯ãã®æŠå¿µã«æ
£ããŠããªãå Žåã¯
ãWikipediaã§é©åãª
説æãèŠã€ããããšãã§ããŸãã
x86ãã¡ããªããã»ããµã®ç¹åŸŽã¯ã8086 16ãããããã»ããµãšã®å®å
šãªäºææ§ãç¶æããŠããããšã§ããx86ã¢ãŒããã¯ãã£ã®16ããããã32ããããžã®ç§»è¡äžãæçµçã«64ããããžã®ç§»è¡äžãã¬ãžã¹ã¿ã¯æ¡åŒµããã以åã®ããã»ããµçšã«äœæãããã³ãŒããšã®äºææ§ãç¶æããããã
16ãããå¹
ã®æ±çšã¬ãžã¹ã¿ãŒAXã䜿çšããŸãã äžäœãã€ããžã®ã¢ã¯ã»ã¹ã¯AHãšããååã§ãäžäœãã€ããžã®ã¢ã¯ã»ã¹ã¯ALãšããååã§å®è¡ãããŸãã 32ããã80386ãç»å Žãããšãæ¡åŒµïŒæ¡åŒµïŒAXãŸãã¯EAXã¯32ãããã¬ãžã¹ã¿ãŒã«ãªããAXã¯16ãããã®ãŸãŸã§ãEAXã¬ãžã¹ã¿ãŒã®æãè¥ãååã«ãªããŸããã åæ§ã«ãx86_64ãç»å ŽãããšãããRããã¬ãã£ãã¯ã¹ã䜿çšãããEAXã¯64ãããRAXã¬ãžã¹ã¿ã®æ幎å°ã®ååã«ãªããŸããã 以äžã¯ãäžèšã®é¢ä¿ã説æããããã®ãŠã£ãããã£ã¢ã®èšäºã«åºã¥ãå³ã§ãã
|__64__|__56__|__48__|__40__|__32__|__24__|__16__|__8___| |__________________________RAX__________________________| |xxxxxxxxxxxxxxxxxxxxxxxxxxx|____________EAX____________| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|_____AX______| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|__AH__|__AL__|
ã³ãŒãã«æ»ã
éã¢ã»ã³ãã«ãããããã°ã©ã ã®è§£æã«é²ãã«ã¯ãããã§ååã§ãã
0x0000000100000f50 <main+0>: push %rbp 0x0000000100000f51 <main+1>: mov %rsp,%rbp
æåã®2ã€ã®åœä»€ã¯ãé¢æ°ããããŒã°ãŸãã¯ããªã¢ã³ãã«ãšåŒã°ããŸãã ãŸããå€ãããŒã¹ãã€ã³ã¿ãŒãã¹ã¿ãã¯ã«æžã蟌ãã§ãå°æ¥ã®ããã«ä¿åããŸãã 次ã«ãã¹ã¿ãã¯ãã€ã³ã¿ãŒã®å€ãããŒã¹ãã€ã³ã¿ãŒã«ã³ããŒããŸãã ãã®åŸã
ïŒ
rbpã¯ã
ã¡ã€ã³é¢æ°ã®ã¹ã¿ãã¯ãã¬ãŒã ã®ããŒã¹ã»ã°ã¡ã³ããæããŸãã
0x0000000100000f54 <main+4>: mov $0x0,%eax
ãã®åœä»€ã¯ã0ã
ïŒ
eaxã«ã³ããŒããŸãã x86ã¢ãŒããã¯ãã£ã®åŒã³åºãèŠçŽã§ã¯ãé¢æ°ã«ãã£ãŠè¿ãããå€ã¯
ïŒ
eaxã¬ãžã¹ã¿ã«ä¿åããããããäžèšã®ã¹ããŒãã¡ã³ãã¯é¢æ°ã®æåŸã«0ãè¿ãããã«æ瀺ããŠããŸãã
0x0000000100000f59 <main+9>: movl $0x0,-0x4(%rbp)
ããã§ã¯ã以åã«äŒã£ãããšã®ãªããã®ããããŸãïŒ
-0x4ïŒïŒ
rbpïŒ ã æ¬åŒ§ã¯ããããã¡ã¢ãªã¢ãã¬ã¹ã§ããããšã瀺ããŠããŸãã ãã®ãã©ã°ã¡ã³ãã§ã¯ã
ïŒ
rbp ãããããããŒã¹ã¬ãžã¹ã¿ãããã³
-0x4 ãããã¯ãªãã»ããã§ãã ããã¯ã
ïŒ
rbp + -0x4ãèšè¿°ããã®ãš
åãã§ãã ã¹ã¿ãã¯ã倧ãããªããšãããŒã¹ã¹ã¿ãã¯ãã¬ãŒã ãã4ãåŒããšãããŒã«ã«å€æ°ãæ ŒçŽãããŠããçŸåšã®ãã¬ãŒã èªäœã«ç§»åããŸãã ããã¯ããã®åœä»€ãã¢ãã¬ã¹
ïŒ
rbp-4ã« 0ãæ ŒçŽããããšãæå³ããŸãã ãã®è¡ã®ç®çãç解ããã®ã«ãã°ããæéãããããClangã
ã¡ã€ã³é¢æ°ããæé»çã«è¿ãããå€ã«é ãããŒã«ã«å€æ°ãå²ãåœãŠãããã«æããŸãã
ãŸãã
ããŒã¢ããã¯ã®æ¥å°ŸèŸã¯
lã§ããããšã«æ°ä»ããããããŸããã ããã¯ããªãã©ã³ãã®ã¿ã€ãã
l ong ïŒæŽæ°ã®å Žåã¯32ãããïŒã§ããããšãæå³ããŸãã ãã®ä»ã®å¯èœãªæ¥å°ŸèŸã¯ã
b yte ã
s hort ã
w ord ã
q uad ãããã³
t enã§ãã æ¥å°ŸèŸã®ãªãåœä»€ã«åºããããå Žåããã®ãããªåœä»€ã®ãµã€ãºã¯ãœãŒã¹ã¬ãžã¹ã¿ãŸãã¯ãã¹ãã£ããŒã·ã§ã³ã¬ãžã¹ã¿ã®ãµã€ãºããæ瀺ãããŸãã ããšãã°ãåã®è¡ã§ã¯ã
ïŒ
eaxã¯32ãããå¹
ã§ããããã
movåœä»€ã¯å®éã«ã¯
movlã§ãã
0x0000000100000f60 <main+16>: movl $0x5,-0x8(%rbp)
ä»ãç§ãã¡ã¯ãã¹ãããã°ã©ã ã®äžæ žã«ç§»è¡ããŠããŸãã ã¢ã»ã³ãã©ãŒè¡ã¯
ã¡ã€ã³é¢æ°ã®æåã®Cè¡ã§ãããæ°å€5ã次ã«äœ¿çšå¯èœãªããŒã«ã«å€æ°ã¹ãããïŒ
ïŒ
rbp-0x8 ïŒã以åã®ããŒã«ã«å€æ°ã®4ãã€ãäžã«
眮ããŸãã ããã¯å€æ°
aã®å Žæã§ãã GDBã䜿çšããŠããã確èªã§ããŸãã
(gdb) x &a 0x7fff5fbff768: 0x00000005 (gdb) x $rbp - 8 0x7fff5fbff768: 0x00000005
ã¡ã¢ãªã¢ãã¬ã¹ã¯åãã§ããããšã«æ³šæããŠãã ããã ãŸããGDBã¯ã¬ãžã¹ã¿ã«å€æ°ãèšå®ããŸãããããã£ãŠãGDBã®ãã¹ãŠã®å€æ°ãšåæ§ã«ããã®ååã«ã¯æ¥é èŸ
$ãä»ãããã
ïŒ
æ¥é èŸã¯ATïŒTã®ã¢ã»ã³ãã©ã§äœ¿çšãããŸãã
0x0000000100000f67 <main+23>: mov -0x8(%rbp),%ecx 0x0000000100000f6a <main+26>: add $0x6,%ecx 0x0000000100000f70 <main+32>: mov %ecx,-0xc(%rbp)
次ã«ãå€æ°
aãæ±çšã¬ãžã¹ã¿ãŒã®1ã€ã§ãã
ïŒ
ecxã«å
¥ããããã«æ°å€6ãè¿œå ããŠãçµæã
ïŒ
rbp-0xcã«ä¿åããŸãã ããã¯ã
ã¡ã€ã³é¢æ°ã®2è¡ç®ã§ãã ã¢ãã¬ã¹
ïŒ
rbp-0xcãå€æ°
bã«äžèŽããããšããã§ã«æšæž¬ããŠãããããããŸãããããã¯GDBã§ã確èªã§ããŸãã
(gdb) x &b 0x7fff5fbff764: 0x0000000b (gdb) x $rbp - 0xc 0x7fff5fbff764: 0x0000000b
æ®ãã®
äž»ãªæ©èœã¯åãªãã¯ãªãŒãã³ã°ããã»ã¹ã§ããããšãããŒã°ãšãåŒã°ããŸãã
0x0000000100000f73 <main+35>: pop %rbp 0x0000000100000f74 <main+36>: retq
å€ãããŒã¹ãã€ã³ã¿ãŒãåãåºããŠ
ïŒ
rbpã«æ»ããšã
retqåœä»€
ããªã¿ãŒã³ã¢ãã¬ã¹ã«ã¹ããŒããããã®ãªã¿ãŒã³ã¢ãã¬ã¹ãã¹ã¿ãã¯ãã¬ãŒã ã«æ ŒçŽãããŸãã
ãã®ç¬éãŸã§ãGDBã䜿çšããŠå°ããªCããã°ã©ã ãéã¢ã»ã³ãã«ããATïŒTããã¢ã»ã³ãã©ãŒæ§æãèªã¿åããã¬ãžã¹ã¿ã®äž»é¡ãšã¡ã¢ãªã¢ãã¬ã¹ã®ãªãã©ã³ãã調æ»ããŸããã ãŸããGDBã䜿çšããŠãããŒã«ã«å€æ°ã®æ ŒçŽå Žæã
ïŒ
rbpã«å¯ŸããŠãã§ãã¯ã
ãŸãã ã ããã§ãååŸããç¥èã䜿çšããŠãéçããŒã«ã«å€æ°ã®åäœåçã説æããŸãã
éçããŒã«ã«å€æ°ã«ã€ããŠ
éçããŒã«ã«å€æ°ã¯ãCã®éåžžã«åªããæ©èœã§ããç°¡åã«èšãã°ããããã¯äžåºŠåæåããã宣èšãããé¢æ°ã®åŒã³åºãéã§å€ãä¿æããããŒã«ã«å€æ°ã§ãã éçããŒã«ã«å€æ°ã®ç°¡åãªäœ¿çšäŸã¯ãPythonã¹ã¿ã€ã«ã®ãžã§ãã¬ãŒã¿ãŒã§ãã INT_MAXãŸã§ã®ãã¹ãŠã®èªç¶æ°ãçæãããã®ã次ã«ç€ºããŸãã
#include <stdio.h> int natural_generator() { int a = 1; static int b = -1; b += 1; return a + b; } int main() { printf("%d\n", natural_generator()); printf("%d\n", natural_generator()); printf("%d\n", natural_generator()); return 0; }
ãã®ããã°ã©ã ãã³ã³ãã€ã«ããŠå®è¡ãããšãæåã®3ã€ã®èªç¶æ°ãåºåãããŸãã
$ CFLAGS="-g -O0" make static cc -g -O0 static.c -o static $ ./static 1 2 3
ããããããã¯ã©ã®ããã«æ©èœããŸããïŒ èª¿ã¹ãããã«ãGDBã«ã¢ã¯ã»ã¹ããŠã¢ã»ã³ãã©ã³ãŒããèŠãŠã¿ãŸãããã GDBãéã¢ã»ã³ãã©ãŒã®åºåã«è¿œå ããã¢ãã¬ã¹æ
å ±ãåé€ãããšããã¹ãŠãç»é¢ã«åãŸããŸããã
$ gdb static (gdb) break natural_generator (gdb) run (gdb) disassemble Dump of assembler code for function natural_generator: push %rbp mov %rsp,%rbp movl $0x1,-0x4(%rbp) mov 0x177(%rip),%eax
æåã«è¡ãå¿
èŠãããã®ã¯ãçŸåšã®æ瀺ã確èªããããšã§ãã ãããè¡ãã«ã¯ãæ瀺ãã€ã³ã¿ãŒãŸãã¯ããŒã ã«ãŠã³ã¿ãŒã調ã¹ãŸãã åœä»€ãã€ã³ã¿ã¯ã次ã®åœä»€ã®ã¢ãã¬ã¹ãæ ŒçŽããã¬ãžã¹ã¿ã§ãã x86_64ã¢ãŒããã¯ãã£ã§ã¯ããã®ã¬ãžã¹ã¿ã¯
ïŒ
ripãšåŒã°ã
ãŸã ã
$ ripå€æ°ã䜿çšããŠåœä»€ãã€ã³ã¿ã«ã¢ã¯ã»ã¹ã§ããŸãããŸãã¯ã代ããã«ãã¢ãŒããã¯ãã£çã«ç¬ç«ãã
$ pcå€æ°ã䜿çšã§ããŸãã
(gdb) x/i $pc 0x100000e94 <natural_generator+4>: movl $0x1,-0x4(%rbp)
åœä»€ãã€ã³ã¿ã«ã¯ãå®è¡ãã次ã®åœä»€ãžã®ãã€ã³ã¿ãå«ãŸããŠããŸããããã¯ã3çªç®ã®åœä»€ããŸã å®è¡ãããŠããªãããå®è¡ãããããšãæå³ããŸãã
次ã®åœä»€ãç¥ãããšã¯éåžžã«åœ¹ç«ã€ã®ã§ãããã°ã©ã ãåæ¢ãããã³ã«GDBã«æ¬¡ã®åœä»€ã衚瀺ãããŸãã GDB 7.0以éã§ã¯ã
set disassemble-next-line onã³ãã³ããå®è¡ããã ãã§ã次ã®ã³ãŒãè¡ã§å®è¡ããããã¹ãŠã®åœä»€ã衚瀺ãããŸãã ããããGDB 6.3ã«ä»å±ã®Mac OS Xã䜿çšããŠããããã
displayã³ãã³ãã䜿çšããå¿
èŠããã
ãŸã ã ãã®ã³ãã³ãã¯
xã«äŒŒãŠããŸãããããã°ã©ã ãåæ¢ãããã³ã«åŒã®å€ã衚瀺ããç¹ãç°ãªããŸãã
(gdb) display/i $pc 1: x/i $pc 0x100000e94 <natural_generator+4>: movl $0x1,-0x4(%rbp)
GDBã¯ãåºååã«åžžã«æ¬¡ã®ã¹ããŒãã¡ã³ãã衚瀺ããããã«æ§æãããŸããã
åã«èª¿ã¹ãé¢æ°ã®ããããŒã°ã¯æ¢ã«å®äºããŠããããã3çªç®ã®åœä»€ããããã«å§ããŸãã ã³ãŒãã®æåã®è¡ã«å¯Ÿå¿ããå€æ°
aã« 1ãå²ãåœãŠãŸãã 次ã®ã³ãŒãè¡ã«ç§»åãã
次ã®ã³ãã³ãã®ä»£ããã«ã次ã®ã¢ã»ã³ãã©ãŒåœä»€ã«ç§»åãã
nextiã䜿çšããŸãã ããã§ãã¢ãã¬ã¹
ïŒ
rbp-0x4ã調ã¹ãŠãå€æ°
aãããã«æ ŒçŽãããŠãããšãã仮説ããã¹ãããŸãã
(gdb) nexti 7 b += 1; 1: x/i $pc mov 0x177(%rip),%eax
ãããŠãäºæ³ã©ãããã¢ãã¬ã¹ãåãã§ããããšãããããŸãã 次ã®æ瀺ã¯ããèå³æ·±ããã®ã§ãã
mov 0x177(%rip),%eax
ããã§ã¯ãè¡åœä»€ã®å®è¡ã
éçint b = -1ã§ãããšäºæ³ããŸãã
ã ããããã以åã«åºäŒã£ããã®ãšã¯å€§ããç°ãªããŸãã äžæ¹ã§ã¯ãã¹ã¿ãã¯å€æ°ãžã®åç
§ã¯ãããŸãããã¹ã¿ãã¯å€æ°ã«ã¯ãããŒã«ã«å€æ°ã衚瀺ããããšäºæ³ãããŠããŸããã
-0x1ã§ããããŸããïŒ ãã®ä»£ããã«ãåœä»€ãã€ã³ã¿ãŒã®åŸã«ããã¢ãã¬ã¹
0x100001018ãã
ïŒ
eaxã¬ãžã¹ã¿ã«äœããããŒãããåœä»€ããããŸãã GDBã¯ãã¡ã¢ãªãªãã©ã³ãã®èšç®çµæã«é¢ããæçšãªã³ã¡ã³ããæäŸããŸããããã¯ã
natural_generator.bããã®ã¢ãã¬ã¹ã«ããããšã瀺åããŠããŸãã æ瀺ã«åŸã£ãŠãäœãèµ·ãããèŠãŠã¿ãŸãããïŒ
(gdb) nexti (gdb) p $rax $3 = 4294967295 (gdb) p/x $rax $5 = 0xffffffff
é
ã¢ã»ã³ãã©ãŒãã¬ã·ãŒããŒãšããŠ
ïŒ
eaxã¬ãžã¹ã¿ãŒã瀺ããŠãããšããäºå®ã«ãããããããGDBã¯ã¬ãžã¹ã¿ãŒã®å
šå¹
ã®å€æ°ãèšå®ããããã
$ raxãåºåããŸãã
ãã®ç¶æ³ã§ã¯ãå€æ°ã«ã¯å€æ°ã笊å·ä»ãã笊å·ãªããã決å®ããåããããŸããããããã®åã®ã¬ãžã¹ã¿ãŒã«ã¯ãªããããGDBã¯
ïŒ
raxã¬ãžã¹ã¿ãŒã®å€ã笊å·ãªããšããŠè¡šç€ºããŸãã ããäžåºŠè©ŠããŠ
ãïŒ
raxå€ã笊å·ä»ãæŽæ°ã«
å€æããŸã ã
(gdb) p (int)$rax $11 = -1
bãèŠã€ããããã§ãã
xã³ãã³ãã䜿çšããŠããããå床確èªã§ããŸãã
(gdb) x/d 0x100001018 0x100001018 <natural_generator.b>: -1 (gdb) x/d &b 0x100001018 <natural_generator.b>: -1
ãããã£ãŠãå€æ°
b㯠ãã¹ã¿ãã¯ã®å¥ã®ã¡ã¢ãªã«æ ŒçŽãããã ã
ã§ãªãã
natural_generatoré¢æ°ã
åŒã³åºãããåã§ã-1ã«åæåã
ããŸãã å®éãããã°ã©ã å
šäœãéã¢ã»ã³ãã«ããŠãã
bã-1ã«èšå®ããã³ãŒãã¯èŠã€ãããŸããã ããã¯ãã¹ãŠãå€æ°
bã®å€ãããã°ã©ã ã®å®è¡å¯èœãã¡ã€ã«ã®å¥ã®ã»ã¯ã·ã§ã³ã«çž«ãä»ããããŠãããããã»ã¹ã®éå§æã«ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ããŒãããŒããŒã«ãã£ãŠãã¹ãŠã®ãã·ã³ã³ãŒããšå
±ã«ã¡ã¢ãªã«ããŒããããããã§ãã
ãã®ã¢ãããŒãã«ãããç©äºã¯æå³ãæãå§ããŸãã
bã
ïŒ
eaxã«ä¿åããåŸã次ã®ã³ãŒãè¡ã«
é²ã¿ ã
bãã€ã³ã¯ãªã¡ã³ãããŸãã ããã¯ã次ã®æ瀺ã«åŸããŸãã
add $0x1,%eax mov %eax,0x16c(%rip)
ããã§ã
ïŒ
eaxã« 1ãè¿œå ããçµæãã¡ã¢ãªã«æžãæ»ããŸãã ãããã®æ瀺ã«åŸã£ãŠçµæãèŠãŠã¿ãŸãããã
(gdb) nexti 2 (gdb) x/d &b 0x100001018 <natural_generator.b>: 0 (gdb) p (int)$rax $15 = 0
次ã®2ã€ã®åœä»€ã¯ãçµæ
a + bãè¿ã責任ããããŸãã
mov -0x4(%rbp),%eax add 0x163(%rip),%eax
ããã§ã
ïŒ
aaxã«å€æ°
aãããŒããã
bãè¿œå ããŸãã ãã®æç¹ã§ã
ïŒ
eaxã«ã¯å€1
ãæ ŒçŽããããšäºæ³ãããŸãããã§ãã¯ããŠã¿ãŸãããã
(gdb) nexti 2 (gdb) p $rax $16 = 1
ïŒ
eaxã¬ãžã¹ã¿ã¯ã
natural_generatoré¢æ°ã«ãã£ãŠè¿ãããå€ãæ ŒçŽããããã«äœ¿çšãããã¹ã¿ãã¯ãã¯ãªã¢ããŠãªã¿ãŒã³ãè¿ããšãããŒã°ãå¿
èŠã§ãã
pop %rbp retq
å€æ°
bã®åæåæ¹æ³ãèŠã€ããŸããã ã§ã¯ã
natural_generatoré¢æ°
ãç¹°ãè¿ãåŒã³åºããããšãã«äœãèµ·ãããèŠãŠã¿ãŸãããã
(gdb) continue Continuing. 1 Breakpoint 1, natural_generator () at static.c:5 5 int a = 1; 1: x/i $pc 0x100000e94 <natural_generator+4>: movl $0x1,-0x4(%rbp) (gdb) x &b 0x100001018 <natural_generator.b>: 0
å€æ°
b㯠ãæ®ãã®å€æ°ãšãšãã«ã¹ã¿ãã¯ã«æ ŒçŽãããªãããã
natural_generatorãå床åŒã³åºããããšãã¯ãŸã 0ã§ãã ãžã§ãã¬ãŒã¿ãäœååŒã³åºããããã¯é¢ä¿ãããŸãããå€æ°
bã¯åžžã«ä»¥åã®å€ãä¿æããŸãã ããã¯ãã¹ãŠãã¹ã¿ãã¯ããä¿åãããããŒããŒãããã°ã©ã ãã¡ã¢ãªã«æ ŒçŽãããšãã«åæåãããããã§ããããã·ã³ã³ãŒãã«åŸã£ãŠã§ã¯ãããŸããã
ãããã«
ã¢ã»ã³ãã©ãŒã®åœä»€ã解æããããšããå§ããGDBã䜿çšããŠããã°ã©ã ãéã¢ã»ã³ãã«ããæ¹æ³ãåŠã³ãŸããã åŸã§ãéçããŒã«ã«å€æ°ãã©ã®ããã«æ©èœãããã調ã¹ãŸãããããã¯ãå®è¡å¯èœãã¡ã€ã«ãå解ããªããšã§ããŸããã§ããã
ã¢ã»ã³ããªåœä»€ã®èªã¿åããšãGBDã䜿çšãã仮説ã®ãã¹ãã亀äºã«è¡ãããšã«å€ãã®æéãè²»ãããŸããã ããã¯éå±ã«æãããããããŸãããã次ã®ã¢ãããŒãã«ã¯ååãªçç±ããããŸãïŒæœè±¡çãªãã®ãåŠã¶æè¯ã®æ¹æ³ã¯ããããããå
·äœçã«ããããšã§ãã ãããã®ããŒã«ãç¿åŸããæè¯ã®æ¹æ³ã¯ãããªãã«ãšã£ãŠåœããåã«ãªããŸã§ã䜿çšã匷å¶ããããšã§ãã
翻蚳è
ããïŒäœã¬ãã«ã®ããã°ã©ãã³ã°ã¯ç§ã®ãããã¡ã€ã«ã§ã¯ãªãã®ã§ãäžæ£ç¢ºãªç¹ãããã°ãLANã§ãããã«ã€ããŠç¥ã£ãŠããããã§ãã