¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 332¹ø Á¦ ¸ñ:gdb »ç¿ë¹ý<1> ¿Ã¸°ÀÌ:»ýüÁ¹º´(À¯¼öÇà ) 96/09/29 23:03 ÀÐÀ½:4305 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- [¼­µÎ : ÇÁ·Î±×·¥ µð¹ö°Å¶õ???] µð¹ö°Å¶õ ÇÁ·Î±×·¥ °³¹ß µµ±¸·Î½á, ÇÁ·Î±×·¥À» °³¹ßÇÏ´Ù°¡ ¿¡·¯°¡ ¹ß»ýÇÏ¸é ¹ß»ý À§Ä¡ ¹× ¹ß»ýÀÌÀ¯¸¦ ½±°Ô ãÀ» ¼ö ÀÖµµ·Ï µµ¿Í ÁØ´Ù. [gdb] ¸í·É ¿ä¾à ÇÁ·Î±×·¥ ½ÇÇà°ú Æ®·¹À̽º(trace)¿¡ °ü·ÃµÈ ¸í·Éµé --------------------------------------------------------- run ÇöÀçÀÇ Àμö¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ½ÇÇà run »õ·Î¿î <Àμö>¸¦ °¡Áö°í ÇÁ·Î±×·¥À» ½ÇÇà continue ÇöÀç À§Ä¡¿¡¼­ ÇÁ·Î±×·¥À» °è¼Ó ½ÇÇà½ÃŲ´Ù. (¾àÀÚ) c, cont, (dbx)return next ÇÑ ÁÙ¾¿ ½ÇÇà ½ÃŲ´Ù. ÀÌ ¶§ ÇÔ¼ö¸¦ Æ÷ÇÔÇϰí ÀÖÀ¸¸é ÇÔ¼ö¸¦ ¼öÇà½ÃŲ´Ù. (¾àÀÚ) n next ÁÙÀ» ½ÇÇà½ÃŲ´Ù. step ÇÑ ÁÙ¾¿ ½ÇÇà ½ÃŲ´Ù. ÀÌ ¶§ ÇÔ¼ö¸¦ Æ÷ÇÔÇϰí ÀÖÀ¸¸é ÇÔ¼ö ³»ºÎ·Î µé¾î°¡¼­ ÇÑ ÁÙ¾¿ ½ÇÇàÇÑ´Ù. (¾àÀÚ) s step ÁÙÀ» ½ÇÇà½ÃŲ´Ù. " " break ¶óÀÎ ¹øÈ£¿¡¼­ ÇÁ·Î±×·¥ ½ÇÇàÀ» ¸ØÃß°Ô ÇÑ´Ù. (dbx) stop at (¾àÀÚ) b break <ÇÔ¼ö ¸í> ÇÔ¼ö ³»ºÎÀÇ Ã¹¹øÂ° ¶óÀο¡¼­ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀ» ¸ØÃß°ÔÇÑ´Ù. (dbx) stop in <ÇÔ¼ö¸í> quit gdb¸¦ Á¾·á ½ÃŲ´Ù. ------------------------------------------------------------ µ¥ÀÌŸ¿¡ °ü·ÃµÈ ¸í·Éµé ----------------------------------------------------------- whatis ÁöÁ¤ÇÑ <º¯¼ö>¿¡ °ü·ÃµÈ Á¤º¸¸¦ º¸¿©ÁØ´Ù. print ¿¡ ÁöÁ¤µÈ ½ÄÀÇ °ªÀ» º¸¿©ÁØ´Ù. (¾àÀÚ) p display ÇöÀç ÁöÁ¤µÈ display ¸í·ÉÀÇ ¸ñ·ÏÀ» º¸¿©ÁØ´Ù. (dbx) history list ÇöÀç À§Ä¡¿¡¼­ ¼Ò½º ÆÄÀÏÀÇ ³»¿ëÀ» 10ÁÙ º¸¿©ÁØ´Ù. list , <½ÃÀÛÁÙ>°ú <³¡ÁÙ>»çÀÌÀÇ ¼Ò½ºÆÄÀÏ ³»¿ëÀ» º¸¿©ÁØ´Ù. ----------------------------------------------------------- gdb »ç¿ë¹ýÀ» ¾Ë±â À§Çؼ­ ¿ì¼± bug°¡ ÀÖ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏÀÚ. ~#vi test.c ---------------< test.c ³»¿ë>-------------- 1 #include 2 3 main() 4 { 5 int i; 6 double j; 7 char *bug = NULL; 8 /* ´ÙÀ½Àº i/2 + i ÀÇ °ªÀ» Ãâ·Â ½ÃŰ´Â ¹®ÀÌ´Ù. i °¡ 1 À̸é, j ´Â 1.5 °¡ µÇµµ·Ï § °ÍÀÌ´Ù. ±×·¯³ª ½ÇÁ¦·Î ±×·¸Áö ¾Ê´Ù. */ 9 for( i = 0; i < 5; i++) { 10 j = i/2 + i; 97 10 j = i/2 + i; 11 printf(" j is %lf \n", j ); 12 } /* ´ÙÀ½Àº bug º¯¼ö¿¡ hi¸¦ copyÇÏ·Á´Â °ÍÀÌ´Ù. º¯¼ö¸í bug¿¡¼­ ´À³¢°ÚÁö¸¸, ÀϺηÁ bug¸¦ ¸¸µé¾ú´Ù. ¹«¾ùÀϱî ? */ 13 strcpy(bug,"hi"); 14 printf("bug is %s \n", bug); 15 16 return; 17 } --------------------------------------------- À§ÀÇ ³»¿ëÀ» ÀúÀåÇÏ°í ³ª¼­, yoo:~# cc -g test.c -o test <¼³¸í>------------------ À§ ¸í·É¾î¿¡¼­ cc ´Â c language¸¦ compile ÇÑ ÈÄ ½ÇÇàÈ­ÀÏ Çü¼ºÇÒ ¶§ »ç¿ëÇÏ´Â ¸í·ÉÀ̸ç, gnu c¿¡¼­´Â gcc·Î ´ëÄ¡µÉ ¼ö ÀÖ´Ù. -g option Àº Çü¼ºµÈ ½ÇÇàÈ­ÀÏÀ» °¡Áö°í debugµÉ ¼ö ÀÖ°Ô compile ÇØ ´Þ¶ó´Â ÀÏÁ¾ÀÇ ºÎŹÇÏ´Â optionÀÌ´Ù. -o optionÀº -o µÚÀÇ È­ÀÏ À̸§À» °¡Áø ½ÇÇàÈ­ÀÏÀ» ¸¸µé¾î ´Þ¶ó¶ó´Â °ÍÀÌ´Ù. À§ÀÇ test.c¸¦ compileÇϸé error ¸Þ¼¼Áö´Â ¾ø´Ù. ------------------------------------------------------------ yoo:~# test yoo:~# mv test a.out yoo:~# a.out j is 0.000000 j is 1.000000 j is 3.000000 j is 4.000000 j is 6.000000 Segmentation fault (core dumped) yoo:~# rm core <¼³¸í>----------------------------------------------------- test ½ÇÇàÈ­ÀÏÀ» ½ÇÇà½ÃÄ×´õ´Ï ¾Æ¹«·± ¹ÝÀÀÀÌ ¾ø¾î¼­ ±ô¦³î¶ú´Ù. ÇÊÀÚ´Â º¸Åë SGI¿¡¼­ ÇÁ·Î±×·¥À» Â¥¼­, ÀÌ·± Çö»óÀº óÀ½ÀÌ´Ù. ¾Æ¹¸µç, a.out·Î ¹Ù²Ù°í º¸´Ï core°¡ Çü¼ºµÇ¾ú´Ù. ±×¸®°í, j °ªÀÌ ÀÌ»óÇÏ´Ù. ----------------------------------------------------------- yoo:~# gdb a.out GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15.1 (i486-slackware-linux), Copyright 1995 Free Software Foundation, Inc... (gdb) --<¼³¸í>------------------------------------------------------ ÀÌÁ¦ºÎÅÍ test.c ¸¦ µð¹ö±×(debug)ÇÑ´Ù. ÇÁ·Î±×·¥ Â¥´Â °Íº¸´Ù ÈξÀ Àç¹ÌÀÖ´Ù. (¾Æ½Ç¶û°¡ ¸ð¸£°Ú³×....) ¹æ±ÝÀü ½ÇÇàÈ­ÀÏ (test)À» a.out·Î ¹Ù²Û»ç½ÇÀ» ±â¾ïÇÏÁÒ. ±×·¡¼­ gdb (½ÇÇàÈ­ÀÏ) Áï, gdb a.out·Î Ä¡¸é µÈ´Ù. BSD °è¿­¿¡¼± dbx (½ÇÇàÈ­ÀÏ) Áï, dbx a.out·Î Ä¡¸éµÈ´Ù. ----------------------------------------------------------------- (gdb) list 1 #include 2 3 main() 4 { 5 int i; 6 double j; 7 char *bug = NULL; 8 9 for( i = 0; i < 5; i++) { 10 j = i/2 + i; --< ¼³¸í > ---------------------------------------------------- list´Â ¼Ò½º ³»¿ëÀ» º¸¿©ÁÝ´Ï´Ù. -------------------------------------------------------------- (gdb) list 4, 13 4 { 5 int i; 6 double j; 7 char *bug = NULL; 8 9 for( i = 0; i < 5; i++) { 10 j = i/2 + i; 11 printf(" j is %lf \n", j ); 12 } 13 --<¼³¸í> -------------------------------------------------------- list < ù¹øÂ° ÁÙ>, < ³¡ÁÙ> Ä¡¸é À§Ã³·³ º¸ÀÔ´Ï´Ù. --------------------------------------------------------------- (gdb) break 9 Breakpoint 1 at 0x80484b1: file test.c, line 9. (gdb) run Starting program: /root/a.out Breakpoint 1, main () at test.c:9 9 for( i = 0; i < 5; i++) { (gdb) --<¼³¸í>----------------------------------------------------- debugÇÏ·Á¸é ¿ì¼± bug°¡ ÀÖÀ»¸¸ÇÑ ¶óÀÎ ¾ÕÀ» break point·Î Àâ½À´Ï´Ù. Àú´Â for ¹®¿¡ ÀÌ»óÀÌ ÀÖ´Ù°í ÆÇ´ÜÇϰí 9 for( i = 0; i < 5; i++) { for¹®ÀÇ line number °¡ 9 À̹ǷÎ, break 9·Î ÇßÀ¾´Ï´Ù. ´Ù¸¥ ¿¹, ÇÔ¼ö ³»ºÎ¿¡ breakpoint¸¦ Àâ´Â ¹ýÀº ³ªÁß¿¡ ... ±×¸®±¸, run ÇßÀ¾´Ï´Ù. --------------------------------------------------------------- 9 for( i = 0; i < 5; i++) { (gdb) step 10 j = i/2 + i; (gdb) step 11 printf(" j is %lf \n", j ); (gdb) step j is 0.000000 9 for( i = 0; i < 5; i++) { (gdb) step 10 j = i/2 + i; (gdb) p i $1 = 1 (gdb) p j $2 = 0 (gdb) s 11 printf(" j is %lf \n", j ); (gdb) p j $3 = 1 (gdb) ----<¼³¸í>---------------------------------------- À§ÀÇ °æ¿ì´Â step ÀÇ ¼³¸íÀÔ´Ï´Ù. s·Î Ãĵµ µË´Ï´Ù. stepÀº ÇÑÁÙ¾¿ ½ÇÇà ½Ãŵ´Ï´Ù. i = 1 ÀÏ ¶§ j = 1 ÀÔ´Ï´Ù. ¿¹»ó ¹ÛÀÌÁÒ. Áï 10 line¿¡¼­ À߸øµÈ °ÍÀÔ´Ï´Ù. ¹«¾ùÀÌ À߸øµÈ °ÍÀÎÁö´Â ¿©·¯ºÐÀÌ ±ú´ÞÀ¸½Ã°í, j = (double)i/2. + i;Çϸé Á¦´ë·Î µÉ °ÍÀÔ´Ï´Ù. -------------------------------------------------- (gdb) b 14 Breakpoint 2 at 0x80484fc: file test.c, line 14. (gdb) continue Continuing. j is 1.000000 j is 3.000000 j is 4.000000 j is 6.000000 Breakpoint 2, main () at test.c:14 14 strcpy(bug,"hi"); (gdb) ---<¼³¸í>--------------------------------------- b 14´Â 14¹øÂ° ¶óÀο¡¼­ break point¸¦ Àâ¾Ò´Ù. ¸¸¾à dbx »ç¿ëÀÚ´Â stop at 14·Î ÇÏ¸é µÈ´Ù. continue´Â ÇÁ·Î±×·¥ ½ÇÇàÀ» ´ÙÀ½ breakpoint±îÁö °è¼Ó ½ÇÇà ½ÃŰ´Â °ÍÀÌ´Ù. dbx »ç¿ëÀÚ´Â returnÀ» Ä¡¸é µÈ´Ù. ----------------------------------------------------------- (gdb) p bug $1 = 0x0 (gdb) s Program received signal SIGSEGV, Segmentation fault. 0x400602cf in __fpu_control () (gdb) ---<¼³¸í>------------------------------------------------- µåµð¾î core °¡ ¹ß»ýÇÏ´Â À§Ä¡·Î ¿Ô´Ù. Áï 14¹ø ¶óÀÎÀ» ½ÇÇà½ÃÄ×´õ´Ï error message°¡ º¸¿´´Ù. Áï 14¹øÂ° ¶óÀο¡¼­ ¹ö±×°¡ ÀÖ´Â °ÍÀÌ´Ù. ¹«¾ùÀϱî? ¿ì¼± p bug(º¯¼ö bugÀÇ ³»¿ëÀ» º¸¿©¶ó)ÀÇ °á°ú°¡ 0x0ÀÌ´Ù . gdb¿¡¼± 0x0 Àº null ÀÌ´Ù´Â °ÍÀÌ´Ù. Áï ¹øÁö(address)°¡ ¾ø´Ù. ±×·¡¼­, 14¹ø ¶óÀÎÀ» ½ÇÇà½ÃŰÀü¿¡ º¯¼ö bug¿¡ ¹øÁö¸¦ ÇÒ´ç ÇØ¾ß ÇÑ´Ù. Áï bug = (char *) calloc(1, sizeof(char)); ¸¦ ¸ÕÀú ½ÇÇà½Ã۸éµÈ´Ù. -------------------------------------------------------- (gdb) quit The program is running. Quit anyway (and kill it)? (y or n) y yoo:~# ----< ¼³¸í>------------------------------------------------- core À§Ä¡¿Í ¿Ö À߸øµÇ¾ú´ÂÁö¸¦ ã¾ÒÀ¸¸é, source¸¦ °íÃÄ¾ß ÇÑ´Ù. ±×¸®°í, ½ÇÇàÁßÀÎ gdb¿¡¼­ ºüÁ®³ª¿Í¾ßÇÑ´Ù. ¼Ò±âÀÇ ¸ñÀûÀ» ´Þ¼ºÇßÀ¸´Ï±î.. ±×¸®°í, À§¿¡¼­ ¾ð±ÞÇѵ¥·Î ¼öÁ¤ÇÏ°í ´Ù½Ã gdb¸¦ ½ÇÇàÇØ º¸¾Æ¶ó. ±×·¯¸é bug°¡ »ç¶óÁø ±â»ÝÀ» ´À³¥ °ÍÀÌ´Ù. ¿ìÈñÈñ (¿ôÀ½ ¼Ò¸®).. ------------------------------------------------------------ Áö±Ý±îÁø Ãʱ޼öÁØ¿¡¼­ debugging Çß´Ù. ¸¸¾à source°¡ ¿©·¯°³ ÀÖ´Ù¸é, Áï ***.c È­ÀÏÀÌ ¿©·¯°³ ÀÖ´Ù¸é, ¾î¶»°Ô debuggingÇØ¾ß ÇÒ±î? ´ÙÀ½¿¡ ¼³¸íÇϰڴÙ. ±â´ëÇØ ÁÖ¼¼¿ä. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 337¹ø Á¦ ¸ñ:gdb °­ÁÂ<2> ¿Ã¸°ÀÌ:»ýüÁ¹º´(À¯¼öÇà ) 96/10/06 20:05 ÀÐÀ½:2993 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- ¼­·Ð ******* À̹ø °­ÁÂÁÖÁ¦´Â c È­ÀÏÀÌ ¿©·¯°³ ÀÖÀ» ¶§ ¾î¶»°Ô µð¹ö±×Çϳª, ±×¸®°í, pointer º¯¼ö¸¦ ¾î¶»°Ô º¸³Ä ¿¡ °ü½ÉÀ» ÁÖ°Ú´Ù. ±×¸®°í, MakefileÀÇ ÀÛ¼º¹ýµµ Æ÷ÇÔ ½Ãų·Á°í ÇßÁö¸¸, ¸¶Ä§ ¸®´ª½º °­Á¶õ¿¡ automake, autoconf°­Á°¡ ÀÖ´Ù. ±×·¡¼­ º¸Åë°ú ´Þ¸® automake, autoconf°­Á¸¦ µû¶ó¼­ MakefileÀ» ¸¸µé¾ú´Ù. ¿©·¯ºÐµµ MakefileÀ» ¸¸µé¾î º¸¶ó .±â»ÝÀ» ´À³¥ °ÍÀÌ´Ù. ±×¸®°í,°è½ÃÆÇ ÀÚ·á½ÇÀΰ¡? ¿©±â¿¡ source file°ú MakefileÀ» ¾ÐÃàÇÑ score.tgz È­ÀÏÀÌ ÀÖ´Ù. À̰ÍÀ» down ¹Þ¾Æ¼­ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù. º»·Ð ******* ±¸¼ºµÈ È­ÀÏÀº score.c read.c write.c sample.h sample.inpÀÌ´Ù. ½ÇÇàÈ­ÀÏÀÌ ÇÏ´Â ÀÏÀº sample.inp¿¡ ÀúÀåµÈ data¿¡¼­ -------------------- # ¹øÈ£ À̸§ ±¹¾î ¿µ¾î ¼öÇÐ " 2 ÃÖÀ롃 100 90 50 " -------------------------------- ±¹¾î ¿µ¾î ¼öÇÐ Á¡¼ö¸¦ Àо, output file¿¡´Â ÃÑÁ¡°ú Æò±Õ°ªÀ» Ãâ·Â½ÃŲ´Ù. runÀº ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù. ----------------------------------- score sample.inp sample.out -----<¼³¸í>------------------------ [¸í·É¾î] [input file name] [output file name] ----------------------------------- Çì´õÈ­ÀÏ¿¡ Æ÷ÇÔµÈ struct´Â ´ÙÀ½°ú °°´Ù. --------------------------------- typedef struct score_def SCORE; struct score_def { char name[10]; int num, korea, math, engl, sum; float aver; SCORE * next; }; ----------------------------------- ±×·¯¸é, º»°ÝÀûÀ¸·Î ÀÛ¼ºµÈ cÈ­ÀÏÀ» µð¹ö±ëÇØº¸ÀÚ. ´ÙÀ½Àº score.c È­ÀÏÀ̸ç, main {}ÀÌ Æ÷ÇԵǾîÀÖ´Ù. ------------------------------------------------ 1 #include 2 #include 3 #include "sample.h" 4 5 void main(int argc, char * argv []) 6 { 7 FILE * output , * input; 8 SCORE * score ; 9 10 if(argc < 3) { 11 perror( " TYPE [COMMAND] [INPUT FILE] [OUTPUT FILE] \n") 12 exit(1); 13 } 14 15 /* °¢ »ç¶÷ÀÇ Á¡¼ö°¡ ÀúÀåµÈ input È­ÀÏÀ» ¿­¾î¼­, 16 inputÈ­ÀÏ¿¡ ÀÖ´Â dataÀ» readÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÐ¾î µéÀδÙ. */ 17 input = fopen(argv[1],"rt"); 18 if (input == NULL) { 19 printf("There is an error in read input file . \n"); 20 exit(1); 21 } 22 23 score = (SCORE *) calloc(1, sizeof(SCORE)); 24 read(input, score); 25 fclose(input); 26 27 /* output È­ÀÏÀ» ¿­°í, writeÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© outputÈ­ÀÏ¿¡ Ãâ·Â½ÃŲ´Ù. */ 28 output = fopen(argv[2],"wt"); 29 write(output, score); 30 fclose(output); 31 32 return; 33 } ---<¼³¸í >---------------------------------------------------------------- 5¹ø lineÀ» º¸¸é °£´ÜÇÑ ÇÁ·Î±×·¥°ú ¸ð¾çÀÌ ´Ù¸£°Ô ³ªÅ¸³µ´Ù. Áï void main() À̳ª int main()ÀÌ ¾Æ´Ñ, void main(int argc, char *argv[])·Î µÇ¾î ÀÖ´Ù. ÀÌ·± ¸ð¾çÀÌ ¹«½¼ ¿ªÇÒÀ» ÇÒ±î? ¹°·Ð, libray¸¦ ã°Å³ª, ¹®¹ýÃ¥À» º¸¸é¼­ ¹è¿ì¸é µÇ°ÚÁö¸¸, ³ª´Â gdb·Î ÀÌ¿ëÇØ¼­ »ý°¢ÇØ º¸ÀÚ. ¿ì¼± ´ÙÀ½°ú °°ÀÌ ÇØ º¸ÀÚ. [Ãßõ] vi »ç¿ëÀÚ´Â term(¿¹, ÇÑÅÒ)À» 2°³ ¿­¾î³õ°í, ÇÑ termÀº vi editor·Î ´Ù¸¥ termÀº gdb·Î ÀÌ¿ëÇØ¼­ »ç¿ëÇϸé ÁÁ´Ù.(ÀÏÁ¾ÀÇ ÅëÇÕȯ°æ...) ---------------------------------------------------------------------- hacker:~/score-0.0/src$ gdb score GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15.1 (i486-slackware-linux), Copyright 1995 Free Software Foundation, Inc... (gdb) ---<¼³¸í>------------------------------------------------------------- À§ÀÇ ¸ð½ÀÀº Áö³­¹ø °­Á·Π´«¿¡ Àͼ÷ÇØ Á³À» °ÍÀÌ´Ù. ---------------------------------------------------------------------- (gdb) b 10 Breakpoint 1 at 0x804864d: file score.c, line 10. (gdb) run sample.inp sample.out Starting program: /usr/home/ysh/score-0.0/src/score sample.inp sample.out Breakpoint 1, main (argc=3, argv=0xbffff724) at score.c:10 10 if(argc < 3) { (gdb) ---<¼³¸í>----------------------------------------------------------- score.c È­ÀÏ ³»¿¡¼­ 10¹øÂ° ¶óÀο¡¼­ breakpoint¸¦ Àâµµ·Ï Çϰí, ½ÇÇàÀ» ½ÃŰÀÚ. ½ÇÇà¸í·ÉÀº run sample.inp[ input file À̸§ÀÌ´Ù] sample.out[ output file À̸§ÀÌ´Ù] ó·³Ä£´Ù. ±×·¯¸é, ½ÇÇàÀÌ 10¹øÂ° ¶óÀο¡¼­ ¸ØÃá´Ù. ----------------------------------------------------------------- (gdb) p argc $1 = 3 (gdb) p *argv $2 = 0xbffff80e "/usr/home/ysh/score-0.0/src/score" (gdb) p argv[0] $3 = 0xbffff80e "/usr/home/ysh/score-0.0/src/score" (gdb) p argv[1] $4 = 0xbffff830 "sample.inp" (gdb) p argv[2] $5 = 0xbffff83b "sample.out" (gdb) p argv[3] $6 = 0x0 (gdb) ---<¼³¸í>-------------------------------------------------------- Áö±Ý º¸¿©ÁØ ³»¿ëÀº main(int argc, char *argv[])¿¡ ÀÖ´Â argc¿Í argv°¡ ¾î¶² °ªÀ» °¡Áö´Â Áö º¸¿©ÁØ´Ù. argc´Â argumentÀÇ °¹¼ö¸¦ ¸»Çϰí, argv´Â °¢ argumentÀÇ º¯¼ö ¸íÀÌ´Ù. ½ÇÇà ½ÃŲ ¸í·É¾î°¡ run[score] sample.inp sample.outÀ̹ǷÎ, argument °¹¼ö°¡ 3°³ À̰í, argv[0]Àº scoreÀÌ´Ù. º¸½Ã´Ù½ÃÇÇ, directory ¸í°ú ÇÔ²² ÀúÀåµÈ´Ù. argv[1]Àº sample.inpÀ̰í, .... argv[3]Àº 0x0Áï NULL Áï pointer, ÁÖ¼Ò°¡ ¾ø´Ù. ------------------------------------------------------------------ (gdb) b 24 Breakpoint 2 at 0x8048697: file score.c, line 24. (gdb) c Continuing. Breakpoint 2, main (argc=3, argv=0xbffff724) at score.c:24 24 read(input, score); (gdb) p input $7 = (_IO_FILE *) 0x80499a8 (gdb) p *input $8 = {_flags = -72539000, _IO_read_ptr = 0x0, _IO_read_end = 0x0, _IO_read_base = 0x0, _IO_write_base = 0x0, _IO_write_ptr = 0x0, _IO_write_end = 0x0, _IO_buf_base = 0x0, _IO_buf_end = 0x0, _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0, _chain = 0x40085ec8, _fileno = 5, _blksize = 0, _offset = -1, _cur_column = 0, _unused = 0 '\000', _shortbuf = "", _IO_lock = {ptr = 0x0, field1 = 0, field2 = 0}} (gdb) ---< ¼³¸í >-------------------------------------------------------- breakpoint¸¦ 24¹øÂ° ¶óÀÎ read(input, score);À¸·Î Á¤Çß´Ù. c ´Â continueÀÇ ¾àÀÚ·Î ´ÙÀ½ breakpoint±îÁö ¤Ô½ÇÇàÇ϶ó´Â °ÍÀÌ´Ù. p input Çß´õ´Ï, ÁÖ¼Ò°¡ ³ª¿Â´Ù. ±×¸®°í, struct type·Î º¸¿©ÁØ´Ù. Àû¾îµµ inputÀÌ pointerÀÎ °ÍÀº ¾Ë ¼öÀÖ´Ù. ½ÇÁ¦·Î inputÀ» ¼±¾ðÇßÀ» ¶§, FILE * input·Î Çß´Ù. ±×·¯¸é, pointer º¯¼öÀÇ ³»¿ëÀº ¾î¶»°Ô º¸´Â°¡? p *( º¯¼ö¸í)ó·³ÇÏ¸é µÈ´Ù. ---------------------------------------------------------------- (gdb) p score $9 = (SCORE *) 0x8049a00 (gdb) p *score $10 = {name = "\000\000\000\000\000\000\000\000\000", num = 0, korea = 0, math = 0, engl = 0, sum = 0, aver = 0, next = 0x0} (gdb) ---<¼³¸í >----------------------------------------------------- scoreµµ pointer·Î ¼±¾ðµÇ¾ú´Ù. SCORE *score; ½ÇÁ¦·Î p score Ä¡¸é, ¹øÁö¿Í struct type nameÀÌ ³ª¿Ô´Ù. ³»¿ëÀ» º¼ ¶§´Â ¾î¶»°Ô ÇÏÁö? -------------------------------------------------------------- ÈÞ ½Ä ********* ÀÏ´Ü gdb ¿¡¼­ ÆÄÁ® ³ª¿ÀÀÚ. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 338¹ø Á¦ ¸ñ:gdb °­ÁÂ<3> ¿Ã¸°ÀÌ:»ýüÁ¹º´(À¯¼öÇà ) 96/10/06 20:06 ÀÐÀ½:2831 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- ÈÞ ½Ä ³¡ && °è¼Ó µð¹ö±ëÇϱâ ****************************** ¹æ±Ý Àü±îÁö read ÇÔ¼ö ¾Õ±îÁö µð¹ö±ëÇϰí ÈÞ½ÄÇß´Ù. ´Ù½Ã ÀÛ¾÷À» Çϴµ¥ ¾Õ¿¡¼­ Çß´ø ÀÏÀ» ¹Ýº¹ÇÏÁö ¾Ê°í, readÇÔ¼ö¿¡ breakpoint¸¦ Àâ°í ½Í´Ù. ±×·¯¸é ´ÙÀ½°ú °°ÀÌ ÇØ º¸ÀÚ. ------------------------------------------------------------- hacker:~/temp/src# gdb score GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15.1 (i486-slackware-linux), Copyright 1995 Free Software Foundation, Inc... (gdb) b read Breakpoint 1 at 0x80486dc: file read.c, line 10. (gdb) run sample.inp sample.out Starting program: /root/temp/src/score sample.inp sample.out Breakpoint 1, read (infile=0x80499a8, score=0x8049a00) at read.c:10 10 SCORE *iscore = NULL; (gdb) s 13 while(fgets(line,80,infile) != NULL) { (gdb) s 14 if( strncmp(line,"#",1) == 0) (gdb) p line $1 = "# ÀÌ È­ÀÏÀº À¯ ¼öÇ྾°¡ ¿¬½À¿ëÀ¸·Î ¸¸µç °ÍÀÔ´Ï´Ù.\n \000 \036;\000@\000\232\004\b$÷¿\004÷¿\225 \ 003@\000\232\004\b\000\000\000" (gdb) ----<¼³¸í>--------------------------------------------------- (gdb)b read ¿¡¼­ º¼ ¼ö ÀÖµíÀÌ Æ¯Á¤ ÇÔ¼ö¸¦ µð¹ö±ëÇϰųª, breakpoint¸¦ ƯÁ¤ÇÔ¼ö¿¡ Àâ°í ½ÍÀ¸¸é, b(reak) [function name]ó·³ Ä¡¸é µÈ´Ù. Áö±ÝÀº read ÇÔ¼ö³»·Î µé¾î¿Ô´Ù. Áö±ÝºÎÅÍ input file¿¡¼­ data¸¦ ÀÐ¾î µéÀÌ´Â °úÁ¤ÀÌ´Ù. read (infile=0x80499a8, score=0x8049a00)¿¡¼­ º¸¸é, infileÀÇ ÁÖ¼Ò¿Í scoreÀÇ ÁÖ¼Ò°¡ ³ª¿Â´Ù. ¿Ö ±×·²±î? read(FILE *infile, SCORE * score)¿¡¼­ º¸¸é ¾Ë ¼ö ÀÖµíÀÌ pointer·Ð ¼±¾ðÀ» ÇØ¼­, ÁÖ¼Ò·Î Àü´ÞµÈ´Ù. ÁÖ¼Ò·Î Àü´ÞµÉ¶§ÀÇ ÀåÁ¡°ú ´ÜÁ¡Àº ..? fgets´Â (f : file, get, s : string)·Î ÀÌÇØ ÇÏÀÚ. Áï È­ÀÏ¿¡¼­ ÇÑ ÁÙ stringÀ» ¾ò´Â´Ù¶ó´Â ÂÊÀ¸·Î... p lineÀ¸·Î È®ÀÎ ÇØº¸´Ï±î, Á¤¸»·Î ù¹øÂ° lineÀÇ ³»¿ëÀÌ º¸ÀδÙ. ------------------------------------------------------------- (gdb) b 25 Breakpoint 2 at 0x8048739: file read.c, line 25. (gdb) c Continuing. Breakpoint 2, read (infile=0x80499a8, score=0x8049a00) at read.c:25 25 sscanf(line,"%d %s %d %d %d", (gdb) p line $2 = " 1 À¯¼öÇà 100 100 100\n\000\n\000 ¸¸µç °ÍÀÔ´Ï´Ù.\n \000 \036;\000@\000\232\004\b$÷¿\004÷¿\225 \003@ \000\232\004\b\000\000\000" (gdb) s 28 } (gdb) p iscore $3 = (SCORE *) 0x8049a00 (gdb) p *iscore $4 = {name = "À¯¼öÇà\000\000\000", num = 1, korea = 100, math = 100, engl = 100, sum = 0, aver = 0, next = 0x0} (gdb) p score $5 = (SCORE *) 0x8049a00 (gdb) p *score $6 = {name = "À¯¼öÇà\000\000\000", num = 1, korea = 100, math = 100, engl = 100, sum = 0, aver = 0, next = 0x0} (gdb) ----<¼³¸í >--------------------------------------------- breakpoint¸¦ 25¹øÂ° ¶óÀÎÀ¸·Î ¼³Á¤Çß´Ù. ±×¸®°í, c ·Î ½ÇÇà½Ã۸é, 25¹øÂ° ¶óÀο¡¼­ ½ÇÇàÀÌ ¸ØÃè´Ù. ÀÌ ¶§, line¿¡ ÀúÀåµÈ ³»¿ëÀ» º¸·Á°í, p lineÀ» ÃÆ°í, stepÀ» ÅëÇØ¼­ sscanf¸¦ ½ÇÇà ½ÃÄ×´Ù. sscanf´Â s :string, scanf·Î ÀÌÇØÇÏÀÚ. string¿¡¼­ scanfÇѴٴ°ÍÀÌ´Ù. ½ÇÁ¦·Î sscanf(line, " *******", ******); ó·³ stringÀÎ lineÀÌ ÇÔ¼ö³»¿¡ ÀÖ´Ù. iscore¿Í scoreÀÇ ÁÖ¼Ò°¡ °°´Ù. °í·Î ÀúÀåµÈ data ³»¿ëµµ °°´Ù. pointerÀÇ ±â´ÉÀ» »ìÀÛ ¿³º¼ ¼ö ÀÖ´Â ±âȸ´Ù. ------------------------------------------------------- (gdb) b write Breakpoint 3 at 0x8048773: file write.c, line 12. (gdb) c Continuing. Breakpoint 2, read (infile=0x80499a8, score=0x8049a00) at read.c:25 25 sscanf(line,"%d %s %d %d %d", (gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x080486dc in read at read.c:10 breakpoint already hit 1 time 2 breakpoint keep y 0x08048739 in read at read.c:25 breakpoint already hit 2 times 3 breakpoint keep y 0x08048773 in write at write.c:12 (gdb) d 2 (gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x080486dc in read at read.c:10 breakpoint already hit 1 time 3 breakpoint keep y 0x08048773 in write at write.c:12 (gdb) -----<¼³¸í>-------------------------------------- À̹øÀº ¼³Á¤µÈ breakpoint°¡ ¿ØÁö ºÎ´ã½º·¯¿ï ¶§°¡ ÀÖÀ» ¶§ ó¸®ÇÏ´Â ¹æ¹ýÀÌ´Ù. À§¿¡¼­ b write ó·³ write ÇÔ¼ö¿¡ breakpoint¸¦ Àâ°í c·Î ½ÇÇà½ÃÄ״µ¥ Àü¿¡ ¼³Á¤Çß´ø breakpoint¿¡¼­ ½ÇÇàÀÌ ¸ØÃè´Ù. ÀÌ breakpoint¸¦ ¾ø¾Ö±â À§Çؼ± info breakpoints¸¦ Ä¡¸éµÈ´Ù.( ¾àÀÚ·Î info b) ±×·¯¸é breakpoint¿¡ ÇÒ´çµÈ ¹øÈ£°¡ ÀÖ°í ÁÖ¼Ò¿Í ¾îµð¿¡¼­ ¹«¾ùÀ» breakÇß´ÂÁö ¸Þ¼¼Áö°¡ ³ª¿Â´Ù. ¼³Á¤À» Ãë¼ÒÇÏ°í ½ÍÀº °÷Àº 2¹ø breakpoint À̹ǷÎ, delete 2 (¾àÀÚ·Î d 2)·Î Ä£´Ù. Á¤¸»·Î ¼³Á¤ÀÌ ÇØÁ¦µÇ¾ú´ÂÁö È®ÀÎ ÇØº¸ÀÚ. info b .... ----------------------------------------------- À̰ÍÀ¸·Î µð¹ö±ë °­Á¸¦ ¸¶Ä¡°íÀÚ ÇÑ´Ù. ´Ù¸¸ ºÎŹÇÒ °ÍÀº »ý°¢ÇÑ ¾î¶²°ÍÀ» ½ÇÇà½Ã۰íÀÚ Çϳª ¸í·É¾î¸¦ ¸ð¸¦ ¶§, Áï, À§¿¡¼­Ã³·³ ¼³Á¤µÈ breakpoint ¸¦ Á¦°ÅÇÏ°í ½Í´Ù´Â »ý°¢ÀÌ µé¸é, help( ¾àÀÚ·Î h)¸¦ Ä¡¸é, ------------------------------------ (gdb) h List of classes of commands: running -- Running the program stack -- Examining the stack data -- Examining data breakpoints -- Making program stop at certain points files -- Specifying and examining files status -- Status inquiries support -- Support facilities user-defined -- User-defined commands aliases -- Aliases of other commands obscure -- Obscure features internals -- Maintenance commands Type "help" followed by a class name for a list of commands in that class. Type "help" followed by command name for full documentation. Command name abbreviations are allowed if unambiguous. (gdb) ---------------------------------------------- °ú °°ÀÌ ³ª¿Â´Ù. status°¡ ±Ã±ÝÇϹǷÎ, ---------------------------------------------- (gdb) h status Status inquiries. List of commands: show -- Generic command for showing things about the debugger info -- Generic command for showing things about the program being debugged Type "help" followed by command name for full documentation. Command name abbreviations are allowed if unambiguous. (gdb) ------------------------------------------------- ¶Ç »õ·Î¿î ¼³¸í¹®ÀÌ ³ª¿Â´Ù. À̹ø¿¡ h info·Î Ä¡ÀÚ. ¿©·¯ºÐÀº h show³ª ´Ù¸¥ °ÍÀÇ ¸í·É¾î¸¦ ´«¿©°Ü º¸¾Æ¶ó. ÇÊ¿äÇÒ¶§ »ç¿ëµÉ ¼ö ÀÖ´Â ¸í·É¾î¸¦ ãÀ» ¼ö ÀÖ´Ù. -------------------------------------------------- " info breakpoints -- Status of user-settable breakpoints info files -- Names of targets and files being debugged info target -- Names of targets and files being debugged Type "help info" followed by info subcommand name for full documentation. Command name abbreviations are allowed if unambiguous. (gdb) ------------------------------------------------- À§¿¡ º¸ÀÌ´Â °Íó·³ info breakpoints´Â »ç¿ëÀÚ°¡ ¸¸µç breakpointsÀÇ status º¸ÀÌ´Â ¸í·É¾î¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. À§ ¹æ¹ýó·³ ¾ÕÀ¸·Î »ç¿ëÇØ ÁÖ±æ ¹Ù¶õ´Ù. À̹ø °­Á¸¦ ÅëÇØ¼­ ¸¹Àº °ÍÀ» º¸¿© ÁÙ·Á°í ÇßÁö¸¸, ¼ÖÁ÷È÷ ³ªµµ Ãʺ¸ÀÚ ¶ó ¸¹Àº °ÍÀ» º¸ÀÌÁö ¸ø ÇÏ°í µÎ¼­ ¾øÀÌ ¼­¼úÇÑ°Í °°´Ù. [Ãâó] [Æß] GDB °£´Ü ·¹ÆÛ·±½º & º¹Àâ|ÀÛ¼ºÀÚ ½ºÇÎÅ©½º