ååã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ãŸã§ã®ãã¹ãŠã®èªç¶æ°ãçæãããã®ã次ã«ç€ºããŸãã
/* static.c */ #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 # 0x100001018 <natural_generator.b> add $0x1,%eax mov %eax,0x16c(%rip) # 0x100001018 <natural_generator.b> mov -0x4(%rbp),%eax add 0x163(%rip),%eax # 0x100001018 <natural_generator.b> pop %rbp retq End of assembler dump.
æåã«è¡ãå¿ èŠãããã®ã¯ãçŸåšã®æç€ºã確èªããããšã§ãã ãããè¡ãã«ã¯ãæç€ºãã€ã³ã¿ãŒãŸãã¯ããŒã ã«ãŠã³ã¿ãŒã調ã¹ãŸãã åœä»€ãã€ã³ã¿ã¯ã次ã®åœä»€ã®ã¢ãã¬ã¹ãæ ŒçŽããã¬ãžã¹ã¿ã§ãã 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 # 0x100001018 <natural_generator.b> (gdb) x $rbp - 0x4 0x7fff5fbff78c: 0x00000001 (gdb) x &a 0x7fff5fbff78c: 0x00000001
ãããŠãäºæ³ã©ãããã¢ãã¬ã¹ãåãã§ããããšãããããŸãã æ¬¡ã®æç€ºã¯ããè峿·±ããã®ã§ãã
mov 0x177(%rip),%eax # 0x100001018 <natural_generator.b>
ããã§ã¯ãè¡åœä»€ã®å®è¡ãéç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) # 0x100001018 <natural_generator.b>
ããã§ã ïŒ 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 # 0x100001018 <natural_generator.b>
ããã§ã ïŒ 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ã§ãããã«ã€ããŠç¥ã£ãŠããããã§ãã