ÎÞÂÛÄãÊdzõÉæ±à³ÌµÄÐÂÊÖ£¬»¹ÊǾÑé·á¸»µÄÀÏÄñ£¬ÕÆÎնϵãµ÷ÊÔ¼¼ÇÉ£¬¶¼½«ÊÇÄãÌáÉý¿ª·¢Ð§ÂÊ¡¢½â¾ö¼¬ÊÖÎÊÌâµÄ¹Ø¼üÒ»²½
±¾ÎĽ«ÉîÈë̽ÌÖLinux»·¾³ÏµĶϵãµ÷ÊÔ¼¼Êõ£¬´Ó»ù´¡¸ÅÄîµ½¸ß¼¶Ó¦Ó㬴øÄãÁìÂÔÕâÒ»µ÷ÊÔÒÕÊõµÄ÷ÈÁ¦
Ò»¡¢¶Ïµãµ÷ÊÔ»ù´¡£º½Ò¿ªÉñÃØÃæÉ´ 1.1 ʲôÊǶϵ㣿 ¶Ïµã£¬¼ò¶øÑÔÖ®£¬¾ÍÊÇÔÚ³ÌÐòµÄÖ´Ðйý³ÌÖУ¬ÈËΪÉèÖõÄÒ»¸öÔÝÍ£µã
µ±³ÌÐòÔËÐе½Õâ¸öµãʱ£¬»á×Ô¶¯ÔÝÍ£Ö´ÐУ¬µÈ´ý¿ª·¢ÕߵĽøÒ»²½Ö¸Áî
ÕâÒ»»úÖÆÊ¹µÃ¿ª·¢ÕßÄܹ»ÔÝÍ£³ÌÐòµÄÔËÐУ¬¼ì²éµ±Ç°µÄ³ÌÐò״̬£¬°üÀ¨±äÁ¿µÄÖµ¡¢ÄÚ´æ²¼¾Ö¡¢µ÷ÓÃÕ»µÈ£¬´Ó¶ø¶¨Î»ÎÊÌâËùÔÚ
1.2 ΪʲôÐèÒª¶Ïµã£¿ ÔÚ¸´ÔÓµÄÈí¼þ¿ª·¢¹ý³ÌÖУ¬´íÎóºÍÒì³£ÍùÍùÄÑÒÔÔ¤ÁÏ
´«Í³µÄÖðÐÐÔĶÁ´úÂë»ò´òÓ¡ÈÕÖ¾µÄ·½·¨£¬ÔÚÃæ¶Ô´ó¹æÄ£´úÂë¿â»ò²¢·¢Ö´Ðл·¾³Ê±£¬Ð§ÂʵÍÏÂÇÒÈÝÒ×ÒÅ©¹Ø¼üÐÅÏ¢
¶Ïµãµ÷ÊÔÌṩÁËÒ»ÖÖ¸üΪֱ¹ÛºÍ¸ßЧµÄÎÊÌⶨλÊֶΣ¬Èÿª·¢ÕßÄܹ»¡°Ç×Àú¡±³ÌÐò³ö´íµÄ˲¼ä£¬´Ó¶ø¿ìËÙ׼ȷµØÕÒµ½ÎÊÌâµÄ¸ùÔ´
¶þ¡¢LinuxϵĶϵãµ÷ÊÔ¹¤¾ß£ºGDBµÄáÈÆð 2.1 GDB¼ò½é GNU Debugger£¨GDB£©ÊÇLinuxÏÂ×îÇ¿´óµÄµ÷ÊÔ¹¤¾ßÖ®Ò»£¬Ëü¼¸ºõÖ§³ÖËùÓлùÓÚGNU±àÒëÆ÷¼¯ºÏ£¨GCC£©±àÒëµÄ³ÌÐò
GDB²»½öÌṩÁËÉèÖöϵ㡢µ¥²½Ö´ÐС¢²é¿´±äÁ¿ÖµµÈ»ù±¾¹¦ÄÜ£¬»¹Ö§³ÖÌõ¼þ¶Ïµã¡¢±í´ïʽÇóÖµ¡¢Ô¶³Ìµ÷ÊԵȸ߼¶ÌØÐÔ£¬ÊÇLinux¿ª·¢Õß²»¿É»òȱµÄµ÷ÊÔÀûÆ÷
2.2 GDBµÄ»ù±¾Ê¹Óà - Æô¶¯GDB£ºÍ¨¹ýÃüÁîgdb <¿ÉÖ´ÐÐÎļþÃû>Æô¶¯GDB£¬Ëæºó¿ÉÒÔʹÓÃ`run`ÃüÁʼִÐгÌÐò
- ÉèÖöϵ㣺ʹÓÃbreak <ÎļþÃû>:<ÐкÅ>»ò`break <º¯ÊýÃû>`À´ÉèÖöϵã
ÀýÈ磬`breakmain`»áÔÚ³ÌÐòµÄÖ÷º¯ÊýÈë¿ÚÉèÖöϵã
- ²é¿´¶Ïµã£ºinfo breakpointsÃüÁî¿ÉÒÔÁгöµ±Ç°ËùÓеĶϵãÐÅÏ¢
- ÔËÐе½¶Ïµã£º³ÌÐò»áÔÚÓöµ½¶Ïµãʱ×Ô¶¯ÔÝÍ££¬´Ëʱ¿ÉÒÔʹÓÃ`next`£¨µ¥²½Ö´ÐУ¬²»½øÈ뺯Êý£©¡¢`step`£¨µ¥²½Ö´ÐУ¬½øÈ뺯Êý£©¡¢`continue`£¨¼ÌÐøÖ´ÐÐÖ±µ½ÏÂÒ»¸ö¶Ïµã»ò³ÌÐò½áÊø£©µÈÃüÁî¿ØÖÆ³ÌÐòµÄÖ´ÐÐ
- ²é¿´±äÁ¿£ºprint <±äÁ¿Ãû>ÃüÁî¿ÉÒÔ´òÓ¡±äÁ¿µÄµ±Ç°Öµ
- ɾ³ý¶Ïµã£ºdelete <¶ÏµãºÅ>ÃüÁî¿ÉÒÔɾ³ýÖ¸¶¨µÄ¶Ïµã
Èý¡¢¶Ïµãµ÷ÊԵĸ߼¶¼¼ÇÉ£º´ÓÈëÃŵ½¾«Í¨ 3.1 Ìõ¼þ¶Ïµã Ìõ¼þ¶ÏµãÔÊÐí¿ª·¢ÕßΪ¶ÏµãÉèÖÃÌõ¼þ£¬Ö»Óе±Ìõ¼þÂú×ãʱ£¬³ÌÐò²Å»áÔڸöϵ㴦ÔÝÍ£
Õâ¶ÔÓÚµ÷ÊÔÖ»ÔÚÌØ¶¨Ìõ¼þÏ´¥·¢µÄ´íÎó·Ç³£ÓÐÓÃ
ÀýÈ磬`break main if argc > 2`»áÔÚ`main`º¯Êý±»µ÷ÓÃÇÒ²ÎÊý¸öÊý´óÓÚ2ʱÉèÖöϵã
3.2 ¼àÊÓ±äÁ¿ ³ýÁËÊÖ¶¯²é¿´±äÁ¿£¬GDB»¹ÔÊÐíÉèÖüàÊӵ㣨Watchpoint£©£¬µ±Ö¸¶¨±äÁ¿µÄÖµ·¢Éú±ä»¯Ê±£¬³ÌÐò»á×Ô¶¯ÔÝÍ£
Õâ¶ÔÓÚ×·×Ù¸´ÔÓÊý¾Ý½á¹¹µÄ±ä»¯·Ç³£ÓаïÖú
ʹÓÃ`watch <±äÁ¿Ãû`À´ÉèÖüàÊÓµã
3.3 µ÷ÓÃÕ»·ÖÎö µ÷ÓÃÕ»£¨Call Stack£©¼Ç¼Á˳ÌÐòÖ´Ðеĺ¯Êýµ÷ÓÃÐòÁÐ
µ±³ÌÐòÔڶϵ㴦ÔÝͣʱ£¬Ê¹ÓÃ`backtrace`£¨»ò¼òд`bt`£©ÃüÁî¿ÉÒԲ鿴µ±Ç°µÄµ÷ÓÃÕ»£¬Õâ¶ÔÓÚÀí½â³ÌÐòµÄ¿ØÖÆÁ÷ºÍ¶¨Î»µÝ¹é´íÎóÓÈΪ¹Ø¼ü
3.4 Ô¶³Ìµ÷ÊÔ ¶ÔÓÚÔËÐÐÔÚ²»Í¬»úÆ÷»òǶÈëʽϵͳÉϵijÌÐò£¬GDBÖ§³ÖÔ¶³Ìµ÷ÊÔ
ͨ¹ýÅäÖÃGDB·þÎñÆ÷ºÍ¿Í»§¶Ë£¬¿ª·¢Õß¿ÉÒÔÔÚ±¾µØ»úÆ÷ÉÏÉèÖöϵ㡢²é¿´±äÁ¿£¬¶ø³ÌÐòÔòÔÚÔ¶³Ì»úÆ÷ÉÏÖ´ÐÐ
Õ⼫´óµØÀ©Õ¹ÁËGDBµÄÓ¦Óó¡¾°£¬Ê¹Æä³ÉΪ¿çƽ̨µ÷ÊÔµÄÇ¿ÓÐÁ¦¹¤¾ß
3.5 ÄÚ´æµ÷ÊÔ LinuxϵÄGDB»¹Ö§³ÖÄÚ´æµ÷ÊÔ£¬°üÀ¨¼ì²éÄÚ´æÐ¹Â©¡¢·Ç·¨ÄÚ´æ·ÃÎʵÈÎÊÌâ
ËäÈ»Õⳬ³öÁË´«Í³¶Ïµãµ÷ÊԵķ¶³ë£¬µ«½áºÏGDBµÄÄÚ´æ¼ì²éÃüÁÈç`x/s <ÄÚ´æµØÖ·>`²é¿´×Ö·û´®£¬`info mem`²é¿´ÄÚ´æÇøÓòÐÅÏ¢µÈ£©£¬¿ÉÒÔ½øÒ»²½ÌáÉý³ÌÐòµÄÎȶ¨ÐԺͰ²È«ÐÔ
ËÄ¡¢ÊµÕ½ÑÝÁ·£ºÒ»¸ö¶Ïµãµ÷ÊԵݸÀý·ÖÎö ¼ÙÉèÎÒÃÇÓÐÒ»¸ö¼òµ¥µÄC³ÌÐò£¬Ëü½ÓÊÜÓû§ÊäÈë²¢¼ÆËãÁ½¸öÊýµÄºÍ
³ÌÐòÖÐÓÐÒ»¸öÒþ²ØµÄbug£¬µ±ÊäÈëµÄÊý¾ÝÀàÐÍΪ·ÇÊý×Öʱ£¬³ÌÐò»á±ÀÀ£
ÏÖÔÚ£¬ÎÒÃÇʹÓÃGDBÀ´¶¨Î»²¢ÐÞ¸´Õâ¸öbug
²½ÖèÒ»£º±àÒë³ÌÐòʱ¼ÓÈëµ÷ÊÔÐÅÏ¢
gcc -g -o sum_programsum_program.c ²½Öè¶þ£ºÆô¶¯GDB²¢¼ÓÔØ³ÌÐò
gdb ./sum_program ²½ÖèÈý£ºÉèÖöϵ㣬ÔÚmainº¯ÊýÈë¿Ú´¦¿ªÊ¼
(gdb) break main ²½ÖèËÄ£ºÔËÐгÌÐò£¬ÊäÈë·ÇÊý×Ö×Ö·û´¥·¢´íÎó
(gdb) run Starting program: /path/to/sum_program Enter two numbers: a 3 ²½ÖèÎ壺³ÌÐòÔÚmainº¯ÊýÈë¿ÚÔÝÍ££¬Öð²½Ö´Ðв¢¹Û²ì±äÁ¿±ä»¯
(gdb) next (gdb) printargv¡¾1¡¿ ²é¿´ÊäÈëµÄµÚÒ»¸ö²ÎÊý $1 = a (gdb) continue ¼ÌÐøÖ´ÐУ¬Ö±µ½³ÌÐò±ÀÀ£ ²½ÖèÁù£º³ÌÐò±ÀÀ£ºó£¬Ê¹ÓÃbacktrace²é¿´µ÷ÓÃÕ»
Program received signal SIGSEGV, Segmentation fault. 0x08048426 in main() atsum_program.c:10 10 num1 =atoi(argv¡¾1¡¿); (gdb) backtrace 0 0x08048426 inmain () at sum_program.c:10 ²½ÖèÆß£º·ÖÎöµ÷ÓÃÕ»ºÍ´úÂ룬·¢ÏÖatoiº¯ÊýÔÚ½ÓÊÕ·ÇÊý×Ö×Ö·û´®Ê±·µ»Ø0£¬µ«ºóÐø´úÂëδ¼ì²éÊäÈëµÄÓÐЧÐÔ£¬Ö±½Ó½øÐÐÁËÊýѧÔËË㣬¿ÉÄܵ¼ÖÂÁË䶨ÒåÐÐΪ
²½Öè°Ë£ºÐÞ¸´´úÂ룬Ìí¼ÓÊäÈëÑéÖ¤Âß¼
if (sscanf(argv¡¾1¡¿, %d, &num1) != 1 || sscanf(argv¡¾2¡¿, %d, &num!={ fprintf(stderr, Error: Please enter two valid integers.n); return 1; } ²½Öè¾Å£ºÖØÐ±àÒë²¢ÔËÐгÌÐò£¬ÑéÖ¤ÐÞ¸´Ð§¹û
ͨ¹ýÉÏÊö²½Ö裬ÎÒÃDz»½ö¶¨Î»²¢ÐÞ¸´Á˳ÌÐòÖеÄbug£¬»¹Ñ§»áÁËÈçºÎÀûÓÃGDB½øÐиßЧµÄ¶Ïµãµ÷ÊÔ
Îå¡¢½áÓï ¶Ïµãµ÷ÊÔÊÇLinux±à³ÌÖв»¿É»òȱµÄ¼¼ÄÜ£¬Ëü²»½öÄܹ»Ìá¸ßÎÊÌâ½â¾öµÄЧÂÊ£¬¸üÊÇÉîÈëÀí½â³ÌÐòÐÐΪ¡¢ÓÅ»¯´úÂëÐÔÄܵÄÖØÒª