¸®´ª½º °ü·Ã °Á¶õ |
---|
Á¦¸ñ | GDB °Á #2 1998/07/10 (17:14) |
À̸§ | ±èÈ¿¿ø |
¹øÈ£ | 47 |
Á¶È¸ | 281 |
º»¹® |
¡º¸®´ª½º Çдç-¸®´ª½º °Á / ¿¬Àç (go LINUX)¡» 337¹ø Á¦ ¸ñ:gdb °ÁÂ<2> ¿Ã¸°ÀÌ:»ýüÁ¹º´(À¯¼öÇà ) 96/10/06 20:05 ÀÐÀ½:1548 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- ¼·Ð ******* À̹ø °ÁÂÁÖÁ¦´Â 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¿¡¼ -------<sample.inp>------------- # ¹øÈ£ À̸§ ±¹¾î ¿µ¾î ¼öÇÐ " 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 <stdio.h> 2 #include <stdlib.h> 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 ¿¡¼ ÆÄÁ® ³ª¿ÀÀÚ. |