|
³À̵µ : ÃÊ±Þ David
Seager, CICS/390 Development, IBM Hursley 2001 ³â 2 ¿ù 01 ÀÏ LinuxÀÇ Æ¯Â¡Àº GNU µð¹ö°Å(debugger) ¶Ç´Â ½©ÀÇ gdbÀÌ´Ù. gdb »ç¿ëÀ¸·Î ÇÁ·Î±×·¥ÀÇ ³»ºÎ ±¸Á¶ ÀÌÇØ, º¯¼ö °ªÀÇ ÀÎ¼â ¹× ¼Ò½º Äڵ带 ÅëÇÑ Á¤ÁöÁ¡°ú ½Ì±Û ½ºÅÜÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. gdb´Â ÇÁ·Î±×·¥ ÄÚµå »óÀÇ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Â °·ÂÇÑ ¹«±âÀÌ´Ù. ÀÌ ±Û¿¡¼ gdb°¡ ¾ó¸¶³ª ¸ÚÁö°í À¯¿ëÇÑÁö¸¦ ¼³¸íÇÑ´Ù. µð¹ö±×Çϱâ Àü¿¡, µð¹ö±× ÇϰíÀÚ ÇÏ´Â ÇÁ·Î±×·¥¿¡ µð¹ö±ë Á¤º¸¸¦ ÄÄÆÄÀÏ ÇÑ´Ù. ±×·³À¸·Î½á gdb°¡ »ç¿ëÇß´ø º¯¼ö, ¶óÀÎ ¹× ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. gcc(¶Ç´Â g++)¿¡¼ '-g' ¿É¼ÇÀ» ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÑ´Ù. : gcc -g eg.c -o eg
gdb´Â ÇÁ·Î±×·¥¸íÀÌ ¸Å°³ º¯¼ö(¿¹¸¦ µé¾î, 'gdb eg') ½©¿¡¼ 'gdb' ¸í·ÉÀ¸·Î ½ÇÇàµÈ´Ù. gdb¿¡¼ ÆÄÀÏ ¸í·ÉÀ¸·Î µð¹ö±ë ¿ë ÇÁ·Î±×·¥À» ·Îµå ÇÒ ¼ö ÀÖ´Ù(¿¹, 'file eg'). ÇÁ·Î±×·¥°ú µ¿ÀÏÇÑ µð·ºÅ丮¿¡¼ ¸í·ÉÀÌ ½ÇÇàµÇ¾î, ÀÏ´Ü ·Îµå µÇ¸é gdb command 'run' À¸·Î ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÑ´Ù.
gdb°¡ Á¤»óÀûÀÎ ½ÇÇàÀ» ÇÏ¿© ¿Ï·á ½ÃÁ¡±îÁö ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸é ÇÁ·Î±×·¥Àº °è¼Ó ½ÇÇàµÈ´Ù. ¸¸ÀÏ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é? ÀÌ °°Àº °æ¿ì, gdb°¡ ÇÁ·Î±×·¥À» Á¦¾îÇϰí ÁßÁö½Ãų °ÍÀÌ´Ù. µû¶ó¼ ¿©·¯ºÐÀÌ ¹®Á¦ÀÇ ¿øÀÎÀ» ÆÄ¾ÇÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ½Ã³ª¸®¿À¸¦ À¯¹ßÇϱâ À§Çؼ ¿¹Á¦ ÇÁ·Î±×·¥À» »ç¿ëÇÒ °ÍÀÌ´Ù. :
ÀÌ ÇÁ·Î±×·¥Àº for ·çÇÁ(loop)¸¦ 10ȸ Á¤µµ ½ÇÇàÇÑ´Ù. ¶Ç 'wib() ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ´©Àû °ªÀ» °è»êÇÏ°í °á°ú¸¦ ÇÁ¸°Æ®ÇÑ´Ù. »ç¿ëÀÚ°¡ °¡Àå ¼±È£ÇÏ´Â µ¿ÀÏ Çà ½ºÆäÀ̽ÌÀ» Æ÷ÇÔÇÑ text editor¸¦ ÀÔ·ÂÇÏ¿© 'eg1.c'¸¦ ´Ù¸¥ À̸§À¸·Î ÀúÀåÇÑ ÈÄ 'gcc-g eg1.c-eg1"·Î ÄÄÆÄÀÏÇϰí 'gdb eg1'·Î gdb¸¦ ½ÇÇàÇÑ´Ù. 'run'À¸·Î ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº ¸Þ½ÃÁö°¡ ³ªÅ¸³´Ù.:
Gdb´Â ÇÁ·Î±×·¥ÀÌ 7 Çà¿¡¼ arithmetic exceptionÀ» ¾ò°í Çà°ú argument °ªÀ» wib() ÇÔ¼ö¿¡ ÇÁ¸°Æ®ÇÑ´Ù. 7 Çà¿¡¼ ¼Ò½º Äڵ带 º¸·Á¸é 'list'¸¦ ¸í·ÉÇÑ´Ù. ÀÌ ¸í·ÉÀº º¸Åë 10°³ÀÇ ÇàÀ» ÇÁ¸°Æ®ÇÑ´Ù. ´Ù½Ã 'list'¸¦ ÀÔ·ÂÇϸé (¶Ç´Â ÃÖÁ¾ ¸í·ÉÀ» ¹Ýº¹½ÃŰ´Â ¸®ÅÏ Å°¸¦ ´©¸¥´Ù.) ÇÁ·Î±×·¥ÀÇ ´ÙÀ½ 10°³ ÇàÀÌ ¿°ÅµÈ´Ù. gdb ¸Þ½ÃÁö¿¡¼ ÇÁ·Î±×·¥ÀÌ º¯¼ö "no1"¿¡¼ "diff"·Î ºÐÇÒÇÏ´Â 7 Çà¿¡¼ ºÐÇÒÀÌ À߸øµÇ¾úÀ½À» ³ªÅ¸³½´Ù.. gdbÀÇ 'print' ¸í·ÉÀ» º¯¼ö¸í°ú °°ÀÌ »ç¿ëÇÏ¸é º¯¼ö °ªÀ» ¾Ë ¼ö ÀÖ´Ù. 'print no 1'°ú 'print off'¸¦ ÀÔ·ÂÇϸé "no1" ¹× "diff"ÀÌ ¹«¾ùÀÎÁö ¾Ë ¼ö ÀÖ´Ù. °á°ú´Â ´ÙÀ½°ú °°´Ù.:
Gdb´Â "no1"Àº 8 À̰í, "diff"´Â 4ÀÓÀ» ³ªÅ¸³½´Ù. ÀÌ °ª°ú 7 ÇàÀ» ÅëÇØ arithmetic exceptionÀº Á¦·Î¿¡ ÀÇÇÑ ³ª´°¼ÀÀÌ ¿øÀÎÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ListingÀº º¯¼ö "diff"ÀÌ 6 Çà¿¡¼ °è»êµÊÀ» ³ªÅ¸³½´Ù. "diff" expressionÀ» º¸ÃæÇؼ 'print no1 - no2'¸¦ ÀÔ·ÂÇÏ¸é °ªÀ» ´Ù½Ã ±¸ÇÒ ¼ö ÀÖ´Ù. Gdb´Â wib ÇÔ¼öÀÇ argument µÑ ¸ðµÎ 8ÀÌ¾î¼ À̰ÍÀÌ ¾ðÁ¦ ¹ß»ýÇÏ´ÂÁö ¾Ë±â À§ÇÏ¿© wib()¸¦ È£ÃâÇÏ´Â main() ÇÔ¼ö¸¦ Á¡°ËÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù. Àá½Ã ÇÁ·Î±×·¥À» ¸ØÃß°í(die) 'continue' ¸í·ÉÀ¸·Î gdb¸¦ ½ÇÇàÇÑ´Ù.:
main()¿¡¼ ¹«¾ùÀÌ ÁøÇàµÇ´ÂÁö¸¦ °ËÅäÇϱâ À§ÇØ Æ¯Á¤ Çà(particular line)À̳ª ÇÁ·Î±×·¥ ÄÚµåÇÔ¼ö¿¡ Á¤ÁöÁ¡À» ¼³Á¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î gdb°¡ ¿©±â¿¡ À̸¦ ¶§ ½ÇÇàÀ» ¸·À» °ÍÀÌ´Ù. ¸í·É¾î 'break main'·Î main() functionÀ» ÀÔ·ÂÇØ¼ Á¤ÁöÁ¡À» ¼³Á¤Çϰųª ¾Ë°íÀÚ ÇÏ´Â ´Ù¸¥ ÇÔ¼ö ¸íÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¸ñÀûÀ» À§Çؼ wib() function È£Ãâ Àü±îÁö Àá½Ã ½®´Ù. 'list main'À» ÀÔ·ÂÇϸé main() ÇÔ¼ö¿¡ °üÇÑ ¼Ò½º listingÀÌ ÀμâµÈ´Ù. Return ۸¦ ´Ù½Ã ´©¸£¸é wib() function È£ÃâÀÌ 21 Çà »ó¿¡ ÀÖÀ½ÀÌ ³ªÅ¸³´Ù. °Å±â¿¡ Á¤ÁöÁ¡À» ¼³Á¤ ÇÏ·Á¸é 'break 21'À» ÀÔ·ÂÇÑ´Ù. GdbÀÇ ´ÙÀ½°ú °°ÀÌ ¹ÝÀÀÇÑ´Ù.:
»ó´ÜÀÇ ¸í·É¿¡¼ ¿äûµÈ Çà¿¡ Á¤ÁöÁ¡ 1ÀÌ ¼³Á¤ µÇ¾úÀ½À» º¼ ¼ö ÀÖ´Ù. 'run' command´Â gdb°¡ Á¤ÁöÇÒ ¶§±îÁö óÀ½ºÎÅÍ ´Ù½Ã ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. ÀÌ·± ÀÏÀÌ ¹ß»ýÇϸé gdb´Â gdb°¡ Á¤Áö ÇÒ Á¤ÁöÁ¡°ú ÇÁ·Î±×·¥ÀÇ À§Ä¡¸¦ ³ªÅ¸³»´Â ´ÙÀ½°ú °°Àº ¸Þ½ÃÁö¸¦ »ý¼º ÇÑ´Ù :
'print value'¿Í 'print div'À» ½ÇÇàÇϸé ÃÖÃÊÀÇ wib() call º¯¼ö´Â 10°ú 6ÀÓÀ» ³ªÅ¸³»°í, 'print i'´Â zero¸¦ ³ªÅ¸³½´Ù. ´ÙÇàÈ÷ gdb´Â ·ÎÄà º¯¼ö(local variables) °ªÀ» ³ªÅ¸³»¸ç 'info locals' ¸í·ÉÀ» »ç¿ëÇϸé ÀÔ·Â ³»¿ëÀ» ÁÙÀÏ ¼ö ÀÖ´Ù. Áö±Ý±îÁö "value"¿Í "div"ÀÌ °°À» ¶§ ¹®Á¦°¡ ¹ß»ý ÇÑ´Ù´Â °ÍÀ» ¾Ë¾Ò´Ù. µû¶ó¼ 'continue'¸¦ ÀÔ·ÂÇØ¼ ´ÙÀ½ Á¤ÁöÁ¡ 1¿¡ µµ´ÞÇÒ ¶§±îÁö ½ÇÇàÀ» ¹Ýº¹ÇÑ´Ù. 'info locals'ÀÇ ¹Ýº¹ ½ÇÇàÀº value=9 À̰í dir=7 ¸¦ ³ªÅ¸³½´Ù. ¿¬¼ÓÇϱâ Àü¿¡ "value"¿Í "div"°¡ ¾î¶»°Ô º¯ÇÏ´ÂÁö ¾Ë±â À§ÇØ ¸í·É¾î 'next'·Î ÇÁ·Î±×·¥ÀÇ ½Ì±Û ½ºÅÜÀÌ °¡´ÉÇÏ´Ù. GdbÀÇ ÀÀ´ä(response)Àº ´ÙÀ½°ú °°´Ù.:
Return ۸¦ 2ȸ ÀÌ»ó ´©¸£¸é ´õÇϱâ¿Í »©±â¸¦ ³ªÅ¸³½´Ù.:
Return ۸¦ 2ȸ ´©¸£¸é 21 Çà¿¡ µµ´ÞÇÏ¿© wib()À» È£ÃâÇÒ ¼ö ÀÖ´Ù. 'info locals'Àº "div"ÀÌ "value"¿Í °°°í spelling forthcoming troubleÀÌ ³ªÅ¸³´Ù. ³ª´°¼À ¿À·ù¸¦ ¾Ë±â À§ÇØ 'step' ¸í·É(ÇÔ¼ö È£ÃâÀ» °Ç³Ê ¶Ù´Â 'next'¿¡ ¹Ý´ë)À¸·Î wib() ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ 'next' ¸í·ÉÀ» ¼öÇàÇϸé "result" °è»ê¿¡ µµ´ÞÇÑ´Ù. ÀÌÁ¦ µð¹ö±ëÀÌ ¿Ï·á µÇ¾úÀ¸¸ç 'quit' command·Î gdb´Â Á¾·áµÈ´Ù. ½ÇÇà ÁßÀÎ ÇÁ·Î±×·¥Àº ÀÌ ÀÛµ¿À¸·Î gdb ½ÂÀÎÀ» ³ªÅ¸³½´Ù.
ÀÌÀü ¿¹Á¦¿¡¼ 21 Çà¿¡ Á¤ÁöÁ¡À» ¼³Á¤Çß´Ù. wib() ÇÔ¼öÀÇ È£Ãâ Àü¿¡ "value"¿Í "div"ÀÌ °°¾ÆÁö´Â ¶§¸¦ ¾Ë¾Æº¸°íÀÚ ÇÑ´Ù. ÀÌ ÁöÁ¡¿¡ µµ´Þ ÇÏ·Á¸é ÇÁ·Î±×·¥À» 2ȸ ¿¬¼Ó ½ÇÇàÇØ¾ß ÇÑ´Ù. ±×·¯³ª Á¤ÁöÁ¡¿¡ Á¶°ÇÀ» ¼³Á¤Çϸé "value"°¡ "div"¿Í °°¾ÆÁú ¶§¸¸ gdb¸¦ Áß´ÜÇÒ ¼ö ÀÖ´Ù. Á¤ÁöÁ¡À» ±ÔÁ¤ÇÒ ¶§ Á¶°ÇÀ» ¼³Á¤Çϱâ À§ÇØ "break <line number> if <conditional expression>"À» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. eg1 À» gdb¿¡ ·Îµå ÇÏ°í ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÏÀÚ. :
¼ýÀÚ 1°ú °°Àº Á¤ÁöÁ¡ÀÌ ÀÌ¹Ì 21 Çà¿¡ ±ÔÁ¤µÇ¾î ÀÖÀ¸¸é ´ÙÀ½°ú °°ÀÌ 'condition' command·Î Á¤ÁöÁ¡¿¡ Á¶°ÇÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.:
'run'À¸·Î eg1.c¸¦ ½ÇÇàÇϸé "value"¿Í "dir"ÀÌ °°¾ÆÁú ¶§ gdb°¡ Á¤ÁöÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é, °°¾ÆÁú ¶§±îÁö ¼öÀÛ¾÷À¸·Î 'continue'ÇÒ Çʿ䰡 ¾ø´Ù. Á¤ÁöÁ¡ Á¶°Ç(condition)Àº C ÇÁ·Î±×·¥À» µð¹ö±ë ÇÒ ¶§ À¯È¿ÇÑ C expressionÀÌ´Ù. ½ÇÁ¦ ÇÁ·Î±×·¥¿¡ »ç¿ëÁßÀÎ ¾î¶² ¾ð¾î¿¡µµ À¯È¿ÇÑ expressionÀÌ´Ù. Á¶°Ç¿¡ ÁöÁ¤µÈ º¯¼ö´Â Á¤ÁöÁ¡ÀÌ ¼³Á¤µÈ ÇàÀÇ ¹üÀ§ ¾È¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é expressionÀº Àǹ̰¡ ¾ø´Ù. ExpressionÀ» »ç¿ëÇÏÁö ¾Ê°í Á¤ÁöÁ¡ ¼ýÀÚ¸¦ ÁöÁ¤ÇÏ´Â 'condition' command·Î Á¤ÁöÁ¡À» Á¶°Ç ¾øÀÌ(unconditional) ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î 'condition 1'Àº Á¶°Ç ¾øÀÌ Á¤ÁöÁ¡ 1À» ¼³Á¤ÇÑ´Ù. ÇöÀç Á¤ÀÇµÈ Á¤ÁöÁ¡°ú Á¶°ÇÀÌ ¹«¾ùÀÎÁö ¾Ë±â À§ÇØ 'info break' command¸¦ ¹ßÇàÇÑ´Ù.:
AÁ¤ÁöÁ¡ Á¤º¸´Â Á¤ÁöÁ¡ÀÇ Á¶°Ç, Á¤ÁöÁ¡ÀÌ È÷Æ®(hit)µÇ´Â Ƚ¼ö ±×¸®°í 'Enb' Ä®·³¿¡¼ÀÇ Á¤ÁöÁ¡ »ç¿ë °¡´É ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù. Á¤ÁöÁ¡Àº 'disable <breakpoint number>' command¸¦ »ç¿ëÇÏ¸é »ç¿ë ºÒ°¡°¡ µÈ´Ù. ¶Ç 'enable <breakpoint number>'Àº »ç¿ë °¡´ÉÀ» ÀǹÌÇϸç 'delete<breakpoint number>' command·Î ÀüºÎ »èÁ¦µÈ´Ù. ¿¹¸¦ µé¾î 'disable 1' ¸í·ÉÀº Æ÷ÀÎÆ® 1¿¡¼ÀÇ Á¤Áö¸¦ ¸·´Â´Ù. "value"°¡ "div"¿Í °°¾ÆÁö±â ¿øÇϸé watch¶ó ºÒ¸®´Â ´Ù¸¥ ŸÀÔÀÇ Á¤ÁöÁ¡À» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. Watchpoint´Â ÁöÁ¤µÈ expressionÀÌ °ªÀ» º¯°æÇÒ ¶§ ÇÁ·Î±×·¥ ½ÇÇàÀ» ¸ØÃá´Ù. ±×·¯³ª expression¿¡ »ç¿ëµÈ º¯¼ö°¡ ¹üÀ§ ¾È¿¡ ÀÖÀ» ¶§ ¼³Á¤ÇØ¾ß ÇÑ´Ù. "value"¿Í "div"¸¦ ¹üÀ§ ¾È¿¡ °®±â À§ÇØ main¿¡ Á¤ÁöÁ¡À» ¼³Á¤Çؼ ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¶Ç main() Á¤ÁöÁ¡ÀÌ È÷Æ®(hit)µÉ ¶§ watchpoint¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. Eg 1À» »ç¿ëÇØ¼ gdb¸¦ Àç½ÃÀÛÇÏ°í ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.:
"div"ÀÇ »óȲÀ» Áö¼ÓÀûÀ¸·Î ¾Ë±â À§ÇØ 'watch div'¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª "div"°¡ "value"¿Í °°¾ÆÁú ¶§ Á¤Áö¸¦ ¿øÇÏ¸é ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù :
°è¼ÓÇϸé expression "dir==value"°¡ °ªÀ» 0(false)¿¡¼ 1(true)À¸·Î º¯°æÇÒ ¶§ gdb°¡ Á¤ÁöÇÑ´Ù :
'info locals' command´Â "value"°¡ ½ÇÁ¦ "dir"¿Í °°À½À»(8 again) °ËÁõÇÑ´Ù. Á¤ÀÇµÈ watchpoint´Â 'info watch' command(ÀÌ command´Â 'info break'¿Í µ¿µîÇÔ)¸¦ »ç¿ëÇϸé Á¤ÁöÁ¡°ú °°ÀÌ ¿°ÅµÈ´Ù. ¶Ç Á¤ÁöÁ¡¿¡¼ »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ ½ÅÅØ½º¸¦ »ç¿ëÇϸé watchpointÀÇ °¡´É, °¡´É±ÝÁö ¹× »èÁ¦°¡ °¡´ÉÇÏ´Ù.
gdb¿¡¼ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ¹ö±× Æ®·¡ÇÎ(bug trapping)À» ½±°Ô ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ´ë°³ÀÇ °æ¿ì ÇÁ·Î±×·¥Àº core ÆÄÀϸ¸ ³²±â°í µð¹ö°Å ¹Û¿¡¼ Á¤ÁöµÈ´Ù. Gdb°¡ core fileÀ» ·ÎµåÇϸé ÇÁ·Î±×·¥ÀÌ Á¤ÁöµÇ±â Àü¿¡ ÇÁ·Î±×·¥ÀÇ »óŸ¦ Á¡°ËÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥ eg1À» gdb ¹Û¿¡¼ ½ÇÇàÇϸé core dump°¡ ¹ß»ýÇÑ´Ù :
Core ÆÄÀϰú ÇÔ²² gdb¸¦ ½ÃÀÛÇϱâ À§ÇØ ½©¿¡¼ 'gdb eg1 core'³ª 'gdb eg1-c core' command¸¦ ½ÇÇàÇÑ´Ù. Gdb´Â core file, eg1ÀÇ program listingÀ» ·Îµå ÇÑ´Ù. ¶Ç ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô Á¾·áµÇ¾ú´ÂÁö º¸¿©ÁÖ¸ç, gdb¿¡¼ ÇÁ·Î±×·¥À» ½ÇÇàÇß´ø ¶§¿Í À¯»çÇÑ ¸Þ½ÃÁöµµ º¸¿©ÁÙ °ÍÀÌ´Ù :
ÀÌ ÁöÁ¡¿¡¼ 'info locals', 'pront', 'info args' ¹× 'list'¸¦ ½ÃÇàÇÏ¿© Á¦·Î·Î ³ª´« °ªÀ» ¾Ë ¼ö ÀÖ´Ù. 'info variables' command´Â ¸ðµç ÇÁ·Î±×·¥ÀÇ º¯¼ö °ªÀ» ÇÁ¸°Æ®ÇÑ´Ù. ±×·¯³ª gdb°¡ program code¿¡¼´Â ¹°·Ð C library¿¡¼µµ º¯¼ö¸¦ ÀμâÇϹǷΠ½Ã°£ÀÌ ¿À·¡ °É¸°´Ù. Wib()À» È£ÃâÇÑ ÇÔ¼ö¿¡¼ ¹«½¼ ÀÏÀÌ ¹ß»ýÇß´ÂÁö ¾Ë±â À§ÇØ gdbÀÇ stack commands¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
"call stack" ÇÁ·Î±×·¥Àº ÇöÀç±îÁöÀÇ ÇÔ¼ö¿¡ ´ëÇÑ ¸®½ºÆ®ÀÌ´Ù. °¢ ÇÔ¼ö¿Í º¯¼ö´Â ÇÁ·¹ÀÓ 0("bottom" frame)¿¡¼ ÃÖ±Ù¿¡ È£ÃâµÈ ÇÔ¼ö¿Í ÇÔ²² "frame"À¸·Î ÇÒ´çµÈ´Ù. ½ºÅÃÀ» ÇÁ¸°Æ®Çϱâ À§ÇØ 'bt'(backtrace) command¸¦ ½ÇÇàÇÑ´Ù :
À̰ÍÀº wib() ÇÔ¼ö°¡ 21 ÇàÀÇ main()¿¡¼ ('list21'·Î ½±°Ô È®Àΰ¡´É) È£ÃâµÇ¾úÀ½À» ³ªÅ¸³½´Ù. ¶Ç wib()Àº frame 0¿¡, main()Àº frame 1¿¡ ÀÖÀ½À» ³ªÅ¸³½´Ù. À̰ÍÀºwib()ÀÌ frame 0 ¿¡ Àֱ⠶§¹®Àε¥, frame 0´Â arithmetic error°¡ ¹ß»ýÇÒ ¶§ ÇÁ·Î±×·¥ ³»¿¡¼ ½ÇÇàµÇ´Â ÇÔ¼öÀÌ´Ù. 'info locals' command¸¦ ½ÃÇàÇÏ¸é ½ÇÁ¦ gdb´Â ±¹¼Ò º¯¼ö(variables local)¸¦ ÇöÀç ÇÁ·¹ÀÓ¿¡ ÇÁ¸°Æ®ÇÑ´Ù. ÀÌ ÇÁ·¹ÀÓÀº ÀÎÅÍ·´Æ® µÈ ÇÔ¼ö°¡ ÀÖ´Â °÷¿¡ (frame 4) µðÆúÆ®·Î Á¸ÀçÇÑ´Ù. ÇöÀç ÇÁ·¹ÀÓÀº 'frame' ¸í·ÉÀ¸·Î ÇÁ¸°Æ® ÇÒ ¼ö ÀÖ´Ù. ¸ÞÀÎ ÇÔ¼ö(frame 1¿¡ ÀÖ´Â)ÀÇ º¯¼ö¸¦ ¾Ë±â À§ÇØ 'frame 1'ÈÄ 'info locals'¸¦ ½ÇÇàÇϸé frame 1·Î ½ºÀ§Ä¡ ÇÒ ¼ö ÀÖ´Ù :
À̰ÍÀº "value"¿Í div"ÀÌ °°À» ¶§ "for" ·çÇÁ (i¿Í 2´Â °°´Ù)¸¦ ÅëÇØ ¿À·ù°¡ ¼¼ ¹øÂ° ¹ß»ýÇßÀ½À» °¡¸®Å²´Ù. ÇÁ·¹ÀÓÀº µÎ °¡Áö ¹æ½ÄÀ¸·Î ½ºÀ§Ä¡ °¡´ÉÇÏ´Ù. ÇÁ·¹ÀÓÀÇ ¼ýÀÚ¸¦ ºÐ¸íÇÏ°Ô 'frame' ¸í·É¿¡ ÁöÁ¤Çϰųª ¶Ç´Â ½ºÅÃÀ» À§·Î ¿òÁ÷ÀÏ ¶§´Â 'up', ¾Æ·¡·Î ¿òÁ÷ÀÏ ¶§´Â 'down' command ½ÇÇàÇÑ´Ù. ÇÁ·¹ÀÓ¿¡ ´ëÇØ¼ ÁÖ¼Ò³ª ÇÁ·Î±×·¥ ¾ð¾î °°Àº ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¿øÇϸé 'info frame' command¸¦ ½ÇÇàÇÑ´Ù. Gdb stack commands´Â core file°ú ÇÁ·Î±×·¥ ½ÇÇà¿¡ À¯È¿ÇÏ´Ù. µû¶ó¼ º¹ÀâÇÑ ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡µµ ½ÇÇà ÁßÀÏ ¶§ ÇÔ¼ö¿¡ ¾î¶»°Ô µµ´ÞÇÏ´Â Áö ÃßÀûÇÒ ¼ö ÀÖ´Ù.
Core fileÀ̳ª ÇÁ·Î±×·¥ÀÇ µð¹ö±ë À̿ܿ¡µµ gdb´Â ÀÌ¹Ì ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º¿¡ ÷ºÎµÉ ¼ö ÀÖ´Ù. Core file name ´ë½Å, gdb¸¦ ÷ºÎÇϰíÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÇ ÇÁ·Î¼¼½º ID¸¦ ÁöÁ¤ÇÏ¸é µÈ´Ù. Loop ¹× sleep¸¦ ½ÇÇàÇÑ ¿¹Á¦ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°´Ù :
Gdb ½ÃÀÛÇØ¼ pid¸¦ ÁöÁ¤Çϸé, 'gdb eg2 1283'ÀÌ µÈ´Ù. Gdb´Â "1283"ÀÇ core fileÀ» ãÁö ¸øÇϸé gdb´Â process 1283¿¡ ÷ºÎµÈ´Ù. Gdb°¡ ¾îµð¿¡¼ ½ÇÇàµÇ´õ¶óµµ °ü°è ¾ø´Ù. (ÀÌ °æ¿ì´Â ¾Æ¸¶ sleep()¿¡ À§Ä¡ÇÑ´Ù) :
ÀÌ ÁöÁ¡¿¡¼ À¯¿ëÇÑ gdb°¡ ¸ðµÎ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. 'backtrace'¸¦ »ç¿ëÇØ¼ main()°ú °ü·ÃµÈ À§Ä¡¿Í main()ÀÇ ÇÁ·¹ÀÓ ¼ýÀÚ°¡ ¹«¾ùÀÎÁö ¾Ë ¼ö ÀÖ´Ù. ±×¸®°í °Å±â¿¡¼ ÇÁ·¹ÀÓÀ» ½ºÀ§Ä¡ ÇÏ¿© "for" ·çÇÁ¸¦ ¸î ¹ø Åë°ú Çß´ÂÁö ¾Ë ¼ö ÀÖ´Ù :
ÇÁ·Î±×·¥ ¼³Ä¡°¡ ¿Ï·áµÇ¸é 'detach' command·Î ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼öµµ ÀÖ°í 'kill' command·Î ¾ø¾Ù(kill) ¼öµµ ÀÖ´Ù. ¶Ç pid 1283 ¾Æ·¡ eg2¸¦ ÷ºÎÇÒ ¼öµµ ÀÖ´Ù. ÀÌ´Â ¸ÕÀú 'file eg2'¸¦ ÀÌ¿ëÇØ¼ ±× ¾È¿¡ ÆÄÀÏÀ» ·ÎµåÇÑ ÈÄ 'attach 1283' ÷ºÎ ¸í·ÉÀ» ³»¸²À¸·Î¼ °¡´ÉÇÏ´Ù.
gdb¸¦ ÀÌ¿ëÇϸé 'detach' command·Î µð¹ö±ë ȯ°æÀ» Á¾·áÇÏÁö ¾Ê°í ½© ¸í·ÉÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Ù. µð¹ö±ëÀ» ÇÏ¸é¼ ¼Ò½ºÄڵ带 º¯°æÇÒ ¶§ À¯¿ëÇÏ°Ô ¾²ÀÌ´Â 'shell [commandline]'·Î¼ È£ÃâµÇ±â ¶§¹®ÀÌ´Ù. ¸¶Áö¸·À¸·Î ÇÁ·Î±×·¥ ½ÇÇà Áß¿¡µµ 'set' command·Î º¯¼ö °ªÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. Gdb¿¡¼ eg1À» ½ÇÇàÇÑ´Ù. ±×¸®°í 'break 7 if diff==0' ¸í·ÉÀ¸·Î ÀϺθ¸ ¾ð±ÞÇÏ¿´´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº GNU Debugger ¸Å´º¾óÀ» Âü°íÇϱ⠹ٶõ´Ù.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||