¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾îÁö¿¡ ³ª¿Â ³»¿ë

[Novice] °Ç°­ÇÑ ¸®´ª½º ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Ã¹°ÉÀ½, µð¹ö±ë

´ëÈ­Çü µð¹ö°Å GDB È°¿ë ¡®A¿¡¼­ Z±îÁö¡¯

ÇÁ·Î±×·¥¿¡¼­ °¡Àå Áß¿äÇÑ ´Ü°è´Â ´Ü¿¬ ¼³°èÀÏ °ÍÀÌ´Ù. ±×·¸´Ù¸é ÇÁ·Î±×·¥¿¡¼­ °¡Àå ±î´Ù·Î¿î ´Ü°è´Â ¹«¾ùÀϱî? ¹Ù·Î ¹ö±×¸¦ Àâ¾ÆÁÖ´Â µð¹ö±ëÀÌ´Ù. ¸®´ª½º ÇÁ·Î±×·¡¹Öµµ ¿¹¿Ü´Â ¾Æ´Ï´Ù. ÀÛ°í ´Ü¼øÇϸ鼭µµ ¾î·Á¿î ¡®¹ö±×ÀâÀÌ¡¯¿¡ µµÀüÇØ º¸ÀÚ.

¹Ú»óÈñ °í·Á´ë ÀüÀÚÀüÆÄÀü±â°øÇкΠÇϳª¿Í¿µ


ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ Á¦ÀÛÀº ¡®½ºÆå(specification) ÀÛ¼º ¡æ ÄÚµå ¼³°è ¡æ ÄÚµù ¡æ Å×½ºÆ® ¡æ µð¹ö±ë ¡æ ¹èÆ÷ ¡æ À¯Áö º¸¼ö¿Í ¾÷µ¥ÀÌÆ®¡¯ °úÁ¤À» °ÅÄ£´Ù. ÀÌ °úÁ¤¿¡¼­ °¡Àå Áß¿äÇÑ ºÎºÐÀº ¼³°è¿Í ÄÚµù ºÎºÐÀÌ µÉ °ÍÀÌ´Ù. ÇÏÁö¸¸ ÇÁ·Î±×·¡¸Ó¿¡°Ô °¡Àå ¾î·Á¿î ºÎºÐÀ» ²Å¾Æº¸¶ó¸é ´Ü¿¬ÄÚ µð¹ö±ë(debugging)À̶ó°í ¸»ÇÒ °ÍÀÌ´Ù. µû¶ó¼­ ¸®´ª½º ÇÁ·Î±×·¡¹ÖÀÇ µð¹ö±ë ¹æ¹ýÀ» ÀÌÇØÇÏ°í ½ÇÁ¦·Î ÇÔ²² Çغ¸ÀÚ.

µð¹ö±ë¿¡¼­ ¡®¹ö±×¡¯ Á¤ÀÇ

µð¹ö±ëÀ̶õ ¸» ±×´ë·Î ¹ö±×(¹ú·¹)¸¦ Á¦°ÅÇÏ´Â ÀÛ¾÷ÀÌ´Ù. ±×·¯¸é ¹ö±×¶õ ¹«¾ùÀΰ¡? Á¶±Ý Àå³­½º·´°Å³ª ÀÌ»óÇÏ°Ô µé¸±Áöµµ ¸ð¸£´Â ¹ö±×¶ó´Â ¸»Àº ¹Ì±¹ÀÇ ÇÑ ´ëÇü ÄÄÇ»ÅÍ¿¡ ¹ú·¹°¡ ºÙ¾î ½Ã½ºÅÛÀ» Á¤Áö½ÃŲ ÀÌÈÄ·Î ¾²¿´´Ù°í ÇÑ´Ù. ´©°¡ ÇÑ ¸¶¸®ÀÇ ÀÛÀº ¹ú·¹°¡ °¨È÷ ´ëÇü ÄÄÇ»ÅÍ Àüü¸¦ ¸¶ºñ½ÃÅ°¸®¶ó°í »ý°¢ÇßÀ»±î? ÇÁ·Î±×·¥¿¡ À־µµ º° °Í ¾Æ´Ñ ÀÛÀº ¹ö±×°¡ Å« ¿À·ù¸¦ ÀÏÀ¸Å²´Ù. ´Ù¸¥ ¸»·Î ¼³¸íÇϸé ÄÄÆÄÀÏ·¯°¡ ÄÄÆÄÀÏÇϰųª, ¸µÄ¿°¡ ¸µÅ© ÀÛ¾÷À» Çϸ鼭 Ãâ·ÂÇÏ´Â ¹®¹ý ¿¡·¯(syntax error), ³í¸® ¿¡·¯(logical error), ·±Å¸ÀÓ ¿¡·¯(runtime error)¿Í´Â ´Ù¸£°Ô ÄÄÆÄÀÏ·¯, ¸µÄ¿°¡ ã¾Æ³»Áö ¸øÇÏ´Â ¿¡·¯¸¦ ¹ö±×¶ó°í ÇÑ´Ù.

µð¹ö±ëÀÇ ¹æ¹ý

±×·³, µð¹ö±ë ¹æ¹ýÀ» »ìÆ캸ÀÚ. °¡Àå ¿ø½ÃÀûÀÎ µð¹ö±ë ¹æ¹ýÀº Divide and Conquer(ºÐÇÒ Á¤º¹À̶ó°íµµ ÇÑ´Ù)¶ó´Â ¹æ¹ýÀÌ´Ù. ÀÌ ¹æ¹ýÀº printf ¹®À» ÇÊ¿äÇÑ °÷¿¡ ³Ö¾îÁÖ´Â °ÍÀÌ´Ù. ´ÙÀ½Àº Divide and ConquerÀÇ ¿¹ÀÌ´Ù.

#ifdef_DEBUG
    printf(¡°##after scanf operator¡±);
#endif /* DEBUG */

ÀϹÝÀûÀÎ ÇÁ·Î±×·¥¿¡¼­´Â µð¹ö±×¸¦ Á¤ÀÇÇÏÁö ¾Ê°í ÄÄÆÄÀÏÇϸç, µð¹ö±ëÇϱâ À§ÇØ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÒ ¶§´Â µð¹ö±×¸¦ Á¤ÀÇÇÏ¸é µÈ´Ù. ¹°·Ð ´Ü¼øÈ÷ µð¹ö±×¶ó´Â °Í Çϳª¸¸ Á¤ÀÇÇÏÁö ¾Ê°í ¿©·¯ ´Ü°èÀÇ µð¹ö±× ·¹º§À» Á¤ÀÇÇØ ÃÖ¼ÒÀÇ µð¹ö±× Á¤º¸¸¸À» Ãâ·ÂÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù. ÀÌ¿Í °°Àº ¹æ¹ýÀº µð¹ö±× Á¤º¸¸¦ ¾ò´Â ÁÁÀº ¹æ¹ýÀ¸·Î Áö±Ý±îÁö »ç¿ëµÅ ¿ÔÁö¸¸ µð¹ö±× Á¤º¸¸¦ ³Ê¹« ¸¹ÀÌ Ãâ·ÂÇϱ⠶§¹®¿¡ ¿øÇÏ´Â Á¤º¸¸¦ ³õÃĹö¸± ¼ö ÀÖ´Ù. µû¶ó¼­ ÀÌ ¹æ¹ýÀ¸·Î µð¹ö±ëÇÑ´Ù¸é ¸®´ÙÀÌ·ºÆ®(redir ect)ÇÏ°í ´ÙÀ½°ú °°ÀÌ µð¹ö±× Á¤º¸°¡ ÀúÀåµÈ ÆÄÀÏÀ» °Ë»öÇغ¸´Â °ÍÀÌ ÁÁ´Ù.

jerry@kuee~$./a.out -D DEBUG > bug.txt

¸®´ª½ºÀÇ µð¹ö±ë ¹æ¹ýÀ¸·Î °¡Àå ¸¹ÀÌ ¾²ÀÌ´Â °ÍÀº ´ëÈ­Çü µð¹ö°Å(interactive debugger)ÀÌ´Ù. ´ëÈ­Çü µð¹ö°Å¶õ ƯÁ¤ º¯¼ö¸¦ °Ë»çÇϱâ À§ÇØ ÁöÁ¤µÈ À§Ä¡¿¡¼­ ÇÁ·Î±×·¥À» ÁßÁöÇÏ°í ÇÑ ÁÙ¾¿ ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ÇÁ·Î±×·¥À¸·Î, Åͺ¸ C++ µð¹ö°Å, dbx, gdb µîÀÌ ÀÖ´Ù. ¿©±â¼­´Â gdb¸¦ »ç¿ëÇØ µð¹ö±ëÇغ¸µµ·Ï ÇÏ°Ú´Ù.

GDBÀÇ ¸í·É¾î

ÀÌ ±ÛÀ» Àд µ¶ÀÚ´Â MySQLÀ» ´Ù·ïºÃÀ» °ÍÀÌ´Ù. Ȥ½Ã MySQLÀ» ´Ù·ïº» ÀûÀÌ ¾ø´Ù¸é º»Áö °ú¿ùÈ£¸¦ µÚÁ®º¸¸é °÷°÷¿¡ ¼û¾îÀÖÀ¸´Ï ²À ã¾Æº¸±æ ±ÇÇÑ´Ù. µð¹ö°Å¿¡¼­ MySQLÀ» ¸»ÇÏ´Â ÀÌÀ¯´Â MySQLÀÇ ¸í·É¾î ÀÔ·Â ¹æ¹ýÀÌ gdb¿¡¼­ ¸í·É¾î¸¦ ÀÔ·ÂÇÏ´Â ¹æ¹ý°ú ºñ½ÁÇØ Âü°í°¡ µÇ±â ¶§¹®ÀÌ´Ù.

gdbÀÇ ¸í·É¾î´Â Å©°Ô ½ÇÇà(run)¿¡ °ü·ÃµÈ ¸í·É¾î¿Í Æ®·¹À̽º(trace)°ü·Ã ¸í·É¾î·Î ³ª´­ ¼ö ÀÖ´Ù.

<Ç¥ 1>°ú <Ç¥ 2>¿¡ ¼Ò°³ÇÑ ¸í·É¾î´Â gdb¿¡¼­ »ç¿ëÇÏ´Â ¸í·É¾îÀÇ ±ØÈ÷ ÀϺÎÀÌ´Ù. °Ô´Ù°¡ ÀÌ·¯ÇÑ ±¸ºÐÀº ÇÊÀÚ°¡ ÀÓÀÇ·Î ³ª´²º» °ÍÀÌ´Ù. ÇÏÁö¸¸ ¿©±â¿¡ ¼Ò°³ÇÑ ¸í·É¾î¸¸À¸·Îµµ ¹ö±×¸¦ Àâ´Âµ¥ ¾î·Á¿òÀÌ ¾øÀ» °ÍÀÌ´Ù. Âü°í·Î gdb¿¡¼­ ³ª´² ³õÀº ¸í·É¾îÀÇ Á¾·ù´Â <Ç¥ 3>°ú °°´Ù.

¹°·Ð <Ç¥ 3>ÀÇ ºÐ·ù¿¡ µû¸¥ ¼¼ºÎÀûÀÎ ¸í·É¾î¸¦ º¸°íÀÚ ÇÏ¸é ¡®help <cate gory>¡¯¶ó°í ÀÔ·ÂÇØ ÀÚ¼¼ÇÑ ¼³¸íÀ» Ãâ·ÂÇÒ ¼ö ÀÖ´Ù.

°£´ÜÇÏ°Ô GDB »ç¿ëÇϱâ

gdb¸¦ »ç¿ëÇÏ´Â ¸ñÀûÀº ¹ö±×¸¦ Àâ±â À§ÇÑ °ÍÀ̱⠶§¹®¿¡ ¿ì¼± ¹ö±×°¡ ÀÖ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ <¸®½ºÆ® 1>À» ¸¸µé¾î º¸ÀÚ.

<¸®½ºÆ® 1>ÀÇ bug1.c´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ÇÏÁö¸¸ ÀÌ·¸°Ô °£´ÜÇÑ ¼Ò½º¿¡µµ ¸î °³ÀÇ ¹ö±×(¶Ç´Â ¿¡·¯)°¡ ÀÖ´Ù. ¿ì¼± ÄÄÆÄÀÏÇØ º¸ÀÚ

[jerry@kuee1 tmp]$ gcc bug1.c -g

ÇÁ·Î±×·¥À» µð¹ö±ëÇϱâ À§Çؼ­´Â ÄÄÆÄÀÏÇÒ ¶§ ¹Ýµå½Ã -g ¿É¼ÇÀ» ºÙ¿© ÄÄÆÄÀÏ, ¸µÅ©ÇÑ´Ù. ¶ÇÇÑ -format-frame-pointer ½ºÀ§Ä¡´Â »©Áà¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î ÀÌ ½ºÀ§Ä¡´Â ºüÁ®Àֱ⠶§¹®¿¡ º° ¹®Á¦°¡ ¾ø´Ù. °¡²û °øÀ¯ ¶óÀ̺귯¸®(shared library)°¡ ÀÌ ½ºÀ§Ä¡¸¦ »©Áö ¾Ê°í ÄÄÆÄÀϵŠÀֱ⠶§¹®¿¡ µð¹ö±ëÇÏÁö ¸øÇÒ ¼ö ÀÖÁö¸¸ Å©°Ô ½Å°æ ¾µ ¹®Á¦´Â ¾Æ´Ï´Ù. ÄÄÆÄÀÏÀÌ Àß µÆÀ¸¸é ½ÇÇà½ÃÄÑ º¸ÀÚ.

[jerry@kuee1 tmp]$ ./a.out
j is 0.000000
j is 0.000000
j is 1.000000
j is 1.000000
j is 2.000000
Segmentation fault

µÎ °¡ÁöÀÇ ¹ö±×°¡ º¸ÀδÙ. ³ª´©±âÇÑ °á°ú°¡ ÀÇ¿Ü·Î ³ª¿Ô´Ù´Â °Í°ú ¡®Segmentation fault¡¯°¡ ³ª¿Â °ÍÀÌ´Ù. ¾Õ¼­ ¾ð±ÞÇß´ø Divide and Conquer¸¦ ÀÌ¿ëÇØ ¾Ë ¼ö ÀÖ´Ù. Áï, Divide and Conquer´Â ÄÚµåÀÇ Áß¿äÇÑ ºÎºÐ¿¡ printf ¹®À» ³Ö¾î ¹ö±×°¡ ³ªÅ¸³­ °÷À» ã¾Æ³»´Â ¹æ¹ýÀÌ´Ù. Segmentation fault´Â for ¹®ÀÌ ³¡³­ ÀÌÈÄ¿¡ ³ªÅ¸³­ °ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯¸é ¿ì¸®ÀÇ ¸ñÇ¥ÀÎ gdb¸¦ ÀÌ¿ëÇØ Á¤È®È÷ ¾îµð¿¡ ¹ö±×°¡ ÀÖ´ÂÁö ã¾Æº¸ÀÚ.

[jerry@kuee1 tmp]$ gdb a.out
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are welcome to change it and/or 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.
This GDB was configured as ¡°i386-redhat-linux¡±...
(gdb)

ÀÌÁ¦ <Ç¥ 1>, <Ç¥ 2>¿¡¼­ ¼³¸íÇß´ø gdb ¸í·É¾î¸¦ »ç¿ëÇØ º¸ÀÚ. ¿ì¼± break point¸¦ Àâ¾Æ¾ß ÇÑ´Ù. ¹ö±×°¡ ¾îµð¿¡ ÀÖ´ÂÁö ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ ÀϹÝÀûÀ¸·Î óÀ½¿¡´Â main ÇÔ¼ö¿¡ break point¸¦ Àâ´Â´Ù. ±×¸®°í ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°°í ÇÑ ÁÙ¾¿ ÁøÇà½ÃÄÑ º¸ÀÚ.

(gdb) list
1 #include <stdio.h>
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;
(gdb) list 1, 7
1 #include <stdio.h>
2
3 main()
4 {
5 int i;
6 double j;
7 char *bug = NULL;
(gdb) break main
Breakpoint 1 at 0x8048406: file bug1.c, line 7.
(gdb) run
Starting program: /home/jerry/tmp/a.out

Breakpoint 1, main () at bug1.c:7
7 char *bug = NULL;
(gdb) next
9 for(i = 0 ; i < 5 ; i++){
(gdb) n
10 j = i/2;
(gdb)
11 printf(¡°j is %lf¡±, j);
(gdb)
j is 0.000000
9 for(i = 0 ; i < 5 ; i++){
(gdb)
10 j = i/2;
(gdb)
11 printf(¡°j is %lf¡±, j);
(gdb)
j is 0.000000

¿ì¼± list ¸í·É¾î·Î ÇÁ·Î±×·¥ÀÇ ¼Ò½º¸¦ º¼ ¼ö ÀÖ´Ù. list ¸í·ÉÀº 10ÁÙÀ» ±âº»ÀûÀ¸·Î º¸¿©ÁØ´Ù. ÇÊ¿äÇÑ °÷À» ÇÊ¿äÇÑ ¸¸Å­ º¸·Á¸é list n1, n2 Çü½ÄÀ» »ç¿ëÇÏ¸é µÈ´Ù. ±× ´ÙÀ½¿¡ break point¸¦ ÁöÁ¤ÇÏ°í ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù. ±×·¯¸é main ÇÔ¼ö¿¡¼­ ½ÇÇàÀÌ ¸ØÃá´Ù. ÀÌ ¶§ ÇÁ·Î±×·¥À» ÁøÇà½ÃÅ°±â À§Çؼ­ next¸¦ ÀÔ·ÂÇÏ°í ¿£ÅÍÅ°¸¦ ´©¸£¸é µÈ´Ù. gdbÀÇ ¸í·É¾î´Â ÀÏÀÏÀÌ Å¸ÀÌÇÎÇÒ ÇÊ¿ä ¾øÀÌ next¶ó¸é nÀ» ´©¸£°í, break¶ó¸é b¸¦ ´©¸£¸é µÈ´Ù. ´Ù¸¥ ¸í·É¾îµµ ¸¶Âù°¡Áö·Î ¸í·É¾îÀÇ Ã¹ ±ÛÀÚ¸¸ ÀÔ·ÂÇÏ¸é µÈ´Ù. ÄÚµù¿¡¼­ ÁöÄ£ ¼Õ°¡¶ôÀ» µð¹ö±ë¿¡¼­±îÁö Ȥ»ç½Ãų ÇÊ¿ä´Â ¾øÀ» °ÍÀÌ´Ù.

11¹ø° ÁÙÀ» ½ÇÇà½Ãų ¶§´Â ´Ü¼øÈ÷ ¿£ÅÍÅ°¸¸ ÀÔ·ÂÇß´Ù. gdb¿¡¼­ ¿£ÅÍÅ°¸¸À» ÀÔ·ÂÇÏ¸é ¹Ù·Î Àü¿¡ ÀÔ·ÂÇß´ø ¸í·É¾î°¡ ½ÇÇàµÈ´Ù. Áï, 10¹ø° ÁÙÀ» ½ÇÇà½Ãų ¶§ nÀ» ÁöÁ¤Ç߱⠶§¹®¿¡ 11¹ø° ÁÙ¿¡¼­´Â ÀÚµ¿À¸·Î n ¸í·É¾î°¡ ÁöÁ¤µÇ´Â °ÍÀÌ´Ù. ¶ÇÇÑ MySQL¿¡¼­¿Í °°ÀÌ gdb¿¡µµ È÷½ºÅ丮(history) ±â´ÉÀÌ ÀÖ´Ù. ¼ÖÁ÷È÷ È­»ìÇ¥¸¦ ´©¸£´Â °Íº¸´Ù´Â ¸í·É¾î¸¦ ´©¸£´Â °ÍÀÌ ºü¸£±â ¶§¹®¿¡ ÀÚÁÖ ¾²Áö´Â ¾Ê´Â´Ù.

¸¶Áö¸· 10¹ø° ÁÙÀ» º¸¸é i°¡ 1ÀÏ ¶§ ´ç¿¬È÷ 0.5°¡ ³ª¿Í¾ßÇÔ¿¡µµ ºÒ±¸ÇÏ°í 0ÀÌ ³ª¿Ô´Ù. ÀÌ·± °ÍÀº ¡pC ¾ð¾î¸¦ ¸çÄ¥¸¸ Çغþ ¾Ë ¼ö ÀÖ´Â °ÍÀÌ ¾Æ´Ï³Ä¡Ç°í ÇÏ´Â µ¶ÀÚ°¡ ÀÖÀ»Áöµµ ¸ð¸£Áö¸¸, gdb¿¡¼­ ·çÇÁ(loop) ¹®ÀÌ ½ÇÇàµÇ´Â °ÍÀ» º¸¿©ÁÖ±â À§ÇÑ °ÍÀ̾úÀ¸´Ï ÀÌÇØÇØÁֱ⠹ٶõ´Ù. ´äÀÌ Àß ³ª¿À°Ô Çϱâ À§ÇÑ ¹æ¹ýÀº ¹°·Ð ¾Ë °ÍÀ̶ó ¹Ï°í ³Ñ¾î°¡ÀÚ. Ȥ½Ã C ¾ð¾î ¹®¹ýÀ» °øºÎÇßÀ½¿¡µµ ºÒ±¸ÇÏ°í ¡®Àß ¸ð¸£°Ú´Ù¡¯´Â »ý°¢ÀÌ µå´Â µ¶ÀÚ´Â ÇÊÀÚ°¡ Çß´ø °Íó·³ óÀ½¿¡ °øºÎÇÏ´ø Ã¥À» ´Ù½Ã Çѹø Àо±â ¹Ù¶õ´Ù.

ÀÌÁ¦ 11¹ø° ÁÙÀ» ½ÇÇà½Ãų ¶§ next°¡ ¾Æ´Ñ stepÀ» »ç¿ëÇØ º¸ÀÚ. ¾î¶»°Ô µÉ±î? ´ç¿¬È÷ gdb´Â printf¶ó´Â ÇÔ¼öÀÇ Äڵ带 ãÀ¸·Á ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ printf´Â ¿ì¸®°¡ ¸¸µç ÇÔ¼ö°¡ ¾Æ´Ï¹Ç·Î ´ÙÀ½°ú °°Àº ¿¡·¯ ¸Þ½ÃÁö°¡ ³ªÅ¸³­´Ù.

11 printf(¡°j is %lf¡±, j);
(gdb) s
printf (format=0x80484e0 ¡°j is %lf¡±) at printf.c:30
30 printf.c: ±×·± ÆÄÀÏÀ̳ª µð·ºÅ丮°¡ ¾øÀ½.
(gdb)

Ȥ½Ã º¼·£µå C¿¡¼­ µð¹ö±ëÀ» Çغ» µ¶ÀÚ°¡ ÀÖ´Ù¸é, Trace Into(F7)°ú Step Over(F8)ÀÇ Â÷ÀÌ°¡ next¿Í stepÀÇ Â÷À̶ó°í »ý°¢ÇÏ¸é µÈ´Ù.

´ÙÀ½À¸·Î Segmentation fault°¡ ³ª¿Â ¿øÀÎÀ» ã¾Æº¸ÀÚ. ÀϹÝÀûÀ¸·Î Segmentation fault´Â Æ÷ÀÎÅÍÀÇ ¹®Á¦¶ó°í ÇÑ´Ù. ÀÌ´Â ¼¼±×¸ÕÆ®°¡ ¹ºÁö¸¦ ¾È´Ù¸é ½±°Ô »ý°¢ÇÒ ¼ö ÀÖ´Ù(Ȥ½Ã ¼¼±×¸ÕÆ®°¡ ±Ã±ÝÇÏ´Ù¸é Operating Systems(Prentice hall)À̶ó´Â Ã¥ÀÇ 347ÂÊÀ» Âü°íÇϱ⠹ٶõ´Ù). ¹°·Ð ¿©±â¿¡¼­µµ Æ÷ÀÎÅÍ ¶§¹®¿¡ ÀÌ ¹®Á¦°¡ ¹ß»ýÇß´Ù. Á¤È®È÷ ¾îµð¿¡¼­ ¹®Á¦°¡ ¹ß»ýÇß´ÂÁö ã¾Æº¸ÀÚ.

(gdb) delete
Delete all breakpoints? (y or n) y
(gdb) b 13
Breakpoint 2 at 0x8048460: file bug1.c, line 13.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/jerry/tmp/a.out
j is 0.000000
j is 0.000000
j is 1.000000
j is 1.000000
j is 2.000000

Breakpoint 2, main () at bug1.c:14
14 strcpy(bug, ¡°hi¡±);
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x4007d964 in strcpy () from /lib/libc.so.6
(gdb)

¿ì¼± for ¹®ÀÇ ¹®Á¦´Â °íÃÆ´Ù°í »ý°¢ÇÏ°í óÀ½¿¡ Àâ¾Ò´ø break point¸¦ delete ¸í·É¾î·Î ¾ø¾ÖÀÚ. ±×¸®°í for ¹®ÀÌ ³¡³ª´Â 13¹ø° ÁÙ¿¡ ´Ù½Ã break point¸¦ Àâ°í, ÇÁ·Î±×·¥À» ´Ù½Ã ½ÇÇà½ÃÅ°¸é 14¹ø° ÁÙ¿¡¼­ SIGSEGV¶ó´Â ½Ã±×³ÎÀ» ¹Þ¾Æ ¿¡·¯ ¸Þ½ÃÁö¸¦ ¶ç¿ì¸é¼­ ÇÁ·Î±×·¥ÀÌ ÁßÁöµÉ °ÍÀÌ´Ù.

±×·¯¸é ¹«¾ùÀÌ À߸øµÈ °ÍÀΰ¡? strcpy¶ó´Â ÇÔ¼ö´Â ÇÑ ½ºÆ®¸µÀ» ´Ù¸¥ ½ºÆ®¸µ Æ÷ÀÎÅÍ¿¡ º¹»çÇÑ´Ù. ¹°·Ð µÎ ÀÎÀÚ´Â Æ÷ÀÎÅÍ·Î ¹Þ°Ô µÈ´Ù. <¸®½ºÆ® 1>À» º¸¸é bug¶ó´Â Æ÷ÀÎÅÍ º¯¼ö¸¦ Àâ¾ÆÁÙ ¶§ NULL·Î ÁöÁ¤Çß´Ù. Áï ¡®hi¡¯¶ó´Â ¹®ÀÚ¸¦ ÀúÀåÇÒ °ø°£À» ÇÒ´çÇÏÁö ¾ÊÀº °ÍÀÌ´Ù ±×·¸±â ¶§¹®¿¡ Ä¿³ÎÀÌ SIGSEGV ½Ã±×³ÎÀ» º¸³½ °ÍÀÌ´Ù.

(gdb) p bug
$1 = 0x0
(gdb)

À§¿¡¼­ º¼ ¼ö ÀÖ´Â °Í°ú °°ÀÌ bug¶ó´Â Æ÷ÀÎÅÍ¿¡´Â NULLÀÌ ÁöÁ¤µÅ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °ø°£ÀÌ ÀüÇô ÀâÇôÀÖÁö ¾Ê¾Ò´Ù. ¹®Á¦ ÇØ°á ¹æ¹ýÀº °£´ÜÇÏ´Ù. ¡®hi¡¯¶ó´Â ¹®ÀÚ¿­À» ÀúÀåÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇØÁÖ¸é µÈ´Ù. ±×·± ´ÙÀ½¿¡ bugÀÇ ÁÖ¼Ò¸¦ º¸ÀÚ.

bug = (char *)malloc(sizeof(char)*3);
free(bug);

9 bug = (char *)malloc(sizeof(char)*3);
(gdb)
11 for(i = 0 ; i < 5 ; i++){
(gdb) p bug
$5 = 0x8049820 ¡°¡±

º¸´Â ¹Ù¿Í °°ÀÌ bug º¯¼ö¿¡´Â 0x8049820¶ó´Â ÁÖ¼Ò°¡ ÇÒ´çµÅ ÀÖ´Ù. µû¶ó¼­ ´ÙÀ½°ú °°ÀÌ ¿¹»óµÈ °á°ú¸¦ º¼ ¼ö ÀÖ´Ù.

[jerry@kuee1 tmp]$ ./a.out
j is 0.000000
j is 0.500000
j is 1.000000
j is 1.500000
j is 2.000000
bug is hi

Áö±Ý±îÁö´Â gdb¸¦ º¸°í ¡°ÀÌ°Ô ¹¹¾ß?¡±¶ó°í »ý°¢ÇÒÁöµµ ¸ð¸¥´Ù. ÇÏÁö¸¸ ¾Õ¿¡¼­ º¸¿©ÁØ ¿¹´Â gdb¸¦ óÀ½À¸·Î Á¢ÇÑ µ¶ÀÚ¸¦ À§ÇÑ °ÍÀÌ´Ù. ¹°·Ð ¾ÕÀ¸·Î Àü°³µÉ ¿¹Á¦ ¿ª½Ã gdb¸¦ óÀ½ »ç¿ëÇÏ´Â µ¶ÀÚ¸¦ À§ÇÑ °ÍÀÌÁö¸¸, gdbÀÇ °­·ÂÇÑ ±â´ÉÀ» Á¶±ÝÀ̳ª¸¶ ¸Àº¼ ¼ö ÀÖ´Â ¿¹Á¦°¡ µÉ °ÍÀÌ´Ù.

¾à°£ÀÇ »ý°¢ÀÌ ÇÊ¿äÇÑ ¿¹Á¦

À̹ø¿¡ »ç¿ëÇÒ ¿¹Á¦´Â ¾Ë°í¸®Áò °ü·Ã ¼­ÀûÀÇ ½ÇÁ¦ ¾Ë°í¸®Áò Áß¿¡¼­ óÀ½ ºÎºÐ¿¡ ³ª¿À´Â ¹ÙÀ̳ʸ® °Ë»ö¿¡¼­ º¸¿©ÁÙ ¼ö ÀÖ´Â µð¹ö±ëÀÇ ¿¹ÀÌ´Ù. ¿ì¼± ¹ÙÀ̳ʸ® °Ë»öÀº °Ë»öÇÏ·Á´Â ¸ñ·ÏÀÇ Áß¾Ó¿¡ ÀÖ´Â °Í°ú °Ë»öÇÏ°íÀÚ ÇÏ´Â °ÍÀ» ºñ±³ÇØ ¸ñ·ÏÀÇ À§³ª ¾Æ·¡ ºÎºÐÀ» °Ë»öÇϸ鼭 °Ë»ö ¸ñ·ÏÀ» ÁÙ¿©³ª°¡´Â ¹æ¹ýÀÌ´Ù. <¸®½ºÆ® 2>ÀÇ bug2.c ÆÄÀÏ¿¡¼­ À߸øµÈ ºÎºÐÀ» ã¾Æº¸ÀÚ. ¹°·Ð ÄÄÆÄÀÏÇÏ¸é ¿¡·¯ ¸Þ½ÃÁöµµ º¸ÀÌÁö ¾Ê´Â´Ù. µð¹ö°Å¸¦ »ç¿ëÇϱâ Àü¿¡ ¾îµð¿¡ ¹®Á¦°¡ ÀÖ´ÂÁö Á÷Á¢ ã¾Æº¸±â ¹Ù¶õ´Ù. ÇÏÁö¸¸ Áö±ÝÀº ¾îµð¿¡ ¹®Á¦°¡ ÀÖ°Ú°Å´Ï ÇÏ°í ¸·¿¬È÷ ¹®Á¦Á¡À» ã¾Æ¾ß ÇÒ °ÍÀÌ´Ù.

¿¡·¯°¡ ¾øÀ» °ÍÀÌ¶ó ¿¹»óÇÏÁö¸¸, ÀǽÉÀ» ¿ÏÀüÈ÷ ¾ø¾Ö±â À§ÇØ ÄÄÆÄÀÏÇØ º¸ÀÚ. data.dat ÆÄÀÏÀº ´ÙÀ½°ú °°´Ù.

[jerry@kuee1 tmp]$ gcc bug2.c -g
[jerry@kuee1 tmp]$ cat data.dat
4
6
14
16
17
19
22
23
26

ÀÌÁ¦´Â ½ÇÇà½ÃÄÑ º¸ÀÚ. ´ç¿¬È÷ ¿¡·¯°¡ ¾øÀÌ ±ú²ýÇÏ°Ô ÄÄÆÄÀϵƱ⠶§¹®¿¡ ¿¹»óÇÑ °á°ú°¡ ³ª¿À¸®¶ó°í »ý°¢ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ °á°ú´Â ´ÙÀ½°ú °°´Ù.

[jerry@kuee1 tmp]$ ./a.out
Segmentation fault

ÇãÅ»ÇÏÁö ¾Ê³ª. ¾Æ¹«·± ¿¡·¯ ¾øÀÌ ÄÄÆÄÀÏµÈ ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ±â´ÉÀ» ¹ßÈÖÇÏÁö ¸øÇÏ°í ¸Þ¸ð¸®°¡ ÀÌ»óÇϴٸ鼭 Á×¾î¹ö¸®´Ù´Ï! À̹ø¿¡µµ ¸Þ¸ð¸®(Æ÷ÀÎÅÍ)¿¡ ¹®Á¦°¡ ÀÖ´Â °ÍÀÌ ºÐ¸íÇÏ´Ù. ÀÏ´Ü gdb¸¦ »ç¿ëÇÏÁö ¾Ê°í ¾îµð¿¡ ¹®Á¦°¡ ÀÖ´ÂÁö ã¾Æ º¸¶ó. ´Ü, À̹ø¿¡´Â Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ ¾î´À ºÎºÐ¿¡ ¹®Á¦°¡ ÀÖÀ» °ÍÀ̶ó´Â ¿¹»óÀ» ÇÏ°í ã¾Æº¼ ¼ö Àֱ⠶§¹®¿¡ Á¶±ÝÀº ½¬¿ï °ÍÀÌ´Ù. ¹Ù·Î ¹®Á¦Á¡À» ã¾Ò´Ù¸é Âü ±âºÐ ÁÁÀº ÀÏÀÌ´Ù. ÇÏÁö¸¸ ¿¹Á¦°¡ 1000ÁÙ ÀÌ»ó µÇ´Â ÇÁ·Î±×·¥À̶ó°í »ý°¢Çغ¸ÀÚ. ´Ü¼øÈ÷ ¡®Æ÷ÀÎÅÍ Áß¿¡ ¾îµò°¡¿¡ ¹®Á¦°¡ ÀÖ±¸³ª¡¯¶ó´Â »ý°¢¸¸À¸·Î ¹®Á¦Á¡À» ¹ß°ßÇÒ ¼ö ÀÖÀ»±î? ÀÌ°ÍÀÌ ¹Ù·Î µð¹ö°ÅÀÇ Çʿ伺ÀÌ´Ù. µû¶ó¼­ gdb¸¦ ÀÌ¿ëÇØ È¿À²ÀûÀ¸·Î ¹®Á¦Á¡À» ã¾Æº¸ÀÚ.

[jerry@kuee1 tmp]$ gdb a.out
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are welcome to change it and/or 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.
This GDB was configured as ¡°i386-redhat-linux¡±...
(gdb) r
Starting program: /home/jerry/tmp/a.out

Program received signal SIGSEGV, Segmentation fault.
0x4006ea5e in _IO_vfscanf (s=0xbffff910, format=0x8048761 ¡°%d¡±,
argptr=0xbffff9d8, errp=0x0) at vfscanf.c:963
963 vfscanf.c: ±×·± ÆÄÀÏÀ̳ª µð·ºÅ丮°¡ ¾øÀ½.
(gdb) where
#0 0x4006ea5e in _IO_vfscanf (s=0xbffff910, format=0x8048761 ¡°%d¡±,
argptr=0xbffff9d8, errp=0x0) at vfscanf.c:963
#1 0x4007274e in _IO_vsscanf (string=0xbffff9e0 ¡°4¡±,
format=0x8048761 ¡°%d¡±,
args=0xbffff9d8) at iovsscanf.c:44
#2 0x4007036d in sscanf (s=0xbffff9e0 ¡°4¡±, format=0x8048761 ¡°%d¡±)
at sscanf.c:38
#3 0x804857f in main () at bug2.c:25
(gdb)

¿Ö break pointÁ¶Â÷ ÀâÁö ¾Ê°í ½ÇÇุ ½ÃÄ×À»±î? ±× ÀÌÀ¯´Â where ¸í·É¾î ¶§¹®ÀÌ´Ù. where ¸í·É¾î´Â ¾î¶² ÇÔ¼ö°¡ ¾î¶² ÇÔ¼ö¸¦ È£ÃâÇß´ÂÁö¿¡ °üÇÑ Á¤º¸¸¦ º¸¿©ÁØ´Ù. whereÀÇ Ãâ·Â¹®¿¡´Â ÃÖ±Ù¿¡ ºÒ·ÁÁø ÇÔ¼öºÎÅÍ ³ªÅ¸³­´Ù. ¿©±â¼­´Â main ÇÔ¼ö ¡æ sscanf ÇÔ¼ö ¡æ _IO_vsscanf ÇÔ¼ö ¡æ _IO_vfscanf ÇÔ¼ö ¼ø¼­·Î ºÒ·¶´Ù. ÇÏÁö¸¸ ¸¶Áö¸· µÎ °³ÀÇ ÇÔ¼ö´Â sscanf ÇÔ¼ö°¡ È£ÃâÇÏ´Â ¼­ºê·çƾÀ̹ǷΠ¿ì¸®°¡ »ý°¢ÇÒ ÇÊ¿ä´Â ¾ø´Ù. µû¶ó¼­ ÇÁ·Î±×·¥Àº sscanf ÇÔ¼ö¸¦ ¸¶Áö¸·À¸·Î SIGSEGV ½Ã±×³ÎÀ» ¹ÞÀº °ÍÀÌ´Ù. whereÀÇ Ãâ·Â¹®¿¡ ³ªÅ¸³­ sscanf ÇÔ¼ö¸¦ º¸¸é ¼Ò½ºÀÇ 25¹ø° ÁÙ¿¡¼­ sscanf°¡ »ç¿ëµÆ´Ù. ±×·¯¸é ¿©±â¿¡¼­ ¼Ò½ºÀÇ 24¹ø° ÁÙÀÌ ¾î¶»°Ô µÅÀÖ´ÂÁö º¸ÀÚ.

sscanf(line, ¡°%d¡±, data[max_count]);

ÀÌ ÁÙÀ» º¸°í ¡®¾ÆÇÏ!¡¯ ÇÏ´Â µ¶ÀÚµµ ÀÖÀ» °ÍÀÌ´Ù. scanf ·ùÀÇ ÇÔ¼ö´Â ÀúÀåÇÒ °÷ÀÇ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ¹Þ´Â´Ù. ÇÏÁö¸¸ ¿©±â¿¡¼­´Â Æ÷ÀÎÅÍ°¡ ¾²ÀÌÁö ¾Ê¾Ò´Ù. µû¶ó¼­ 3¹ø° ÀÎÀÚ ¾Õ¿¡ Æ÷ÀÎÅÍ ¡®&¡¯¸¸ ºÙ¿©ÁÖ¸é µÇ´Â °£´ÜÇÑ ¿¡·¯¿´´Ù.

¼¾½ºÀÖ´Â µ¶ÀÚ¶ó¸é ù ¹ø° ¿¹Á¦¿Í À̹ø ¿¹Á¦¿¡¼­ À߸øµÈ °÷À» ã´Â ¹æ¹ýÀÌ ´Ù¸£´Ù´Â °ÍÀ» ÀÎÁöÇßÀ» °ÍÀÌ´Ù. ù ¹ø° ¿¹Á¦¿¡¼­´Â ¾à°£ÀÇ ¸·³ëµ¿ÀÌ¿´´Ù¸é, À̹øÀº gdb¸¦ È¿À²ÀûÀ¸·Î ÀÌ¿ëÇÑ ¹æ¹ýÀÌ´Ù.

¼Ò½º¸¦ ¼öÁ¤ÇÏ°í ´Ù½Ã ÄÄÆÄÀÏÇÑ ÈÄ¿¡ ½ÇÇàÇϸé Àß µ¹¾Æ°¥±î?

[jerry@kuee1 tmp]$ ./a.out
Enter number to search for or -1 to quit: 4
Found at index 0
Found at index 0
Not found
Enter number to search for or -1 to quit: -1
[jerry@kuee1 tmp]$

µåµð¾î µÎ ¹ø° ¿À·ù°¡ ¹ß°ßµÆ´Ù. ¹®Á¦Á¡Àº ºÐ¸íÈ÷ ¡®Enter number¡¦¡¯ ¹®Àå ´ÙÀ½¿¡ ÀÖÀ» °ÍÀÌ´Ù. ±×¸®°í 0¹ø° ÁÙ¿¡ ãÀ¸·Á´Â ¼ýÀÚ°¡ ÀÖ´Ù´Â °ÍÀ» Ãâ·ÂÇß´Ù. µû¶ó¼­ ¡®Found at index¡¦¡¯°¡ ÀÖ´Â ¶óÀο¡ break point¸¦ ÀâÀ¸¸é µÉ °ÍÀÌ´Ù. ¹°·Ð À̺¸´Ù ¾Õ¿¡ ÀâÀ» ¼öµµ ÀÖ°ÚÁö¸¸ while ¹®À» »ó´çÈ÷ ¿©·¯ ¹ø Áö³ªÄ¡´Â ¹ø°Å·Î¿òÀÌ ÀÖ´Ù. µð¹ö±ëÇÏ´Ù º¸¸é break point¸¦ À߸ø Àâ¾Æ for ¹®À̳ª while ¹®À» ºùºù µµ´Â °æ¿ì°¡ Á¾Á¾ ÀÖ´Ù. µð¹ö±ëÀÇ °íÅë¿¡¼­ »¡¸® ¹þ¾î³ª°í ½Í´Ù¸é break point¸¦ ½ÅÁßÇÏ°Ô ¼±ÅÃÇϱ⠹ٶõ´Ù.

[jerry@kuee1 tmp]$ gdb a.out
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are welcome to change it and/or 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.
This GDB was configured as ¡°i386-redhat-linux¡±...
(gdb) b 45
Breakpoint 1 at 0x8048655: file bug2.c, line 45.
(gdb) r
Starting program: /home/jerry/tmp/a.out
Enter number to search for or -1 to quit: 4

Breakpoint 1, main () at bug2.c:45
45 printf(¡°Found at index %d¡±, middle);
(gdb) n
Found at index 0

48 if(low == high){
(gdb)
53 if(data[middle] < search)
(gdb)
56 high = middle;
(gdb)
57 }
(gdb)
41 while(1){
(gdb)
42 middle = (low + high) /2;
(gdb)
44 if(data[middle] == search){
(gdb)
45 printf(¡°Found at index %d¡±, middle);
(gdb)
Found at index 0
48 if(low == high){

Ãâ·ÂµÈ ³»¿ëÀ» ¸ðµÎ º¸·Á¸é ·çÇÁ°¡ 100¹øÂë µ¹¾Æ¾ß ÇÏ´Â »ó´çÇÑ ½Ã°£ÀÌ ¼Ò¿äµÇ±â ¶§¹®¿¡ »ý·«ÇÏ°Ú´Ù. ±×³É ºÁµµ ¹®Á¦Á¡À» ½±°Ô ¾Ë¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÆÄÀÏ¿¡¼­ ¼ýÀÚ¸¦ ã¾Ò´Ù¸é ·çÇÁ°¡ ³¡³ª¾ßÇÔ¿¡µµ ºÒ±¸ÇÏ°í °è¼Ó ´ÙÀ½ ¶óÀÎÀ» ½ÇÇàÇÏ°í ÀÖ´Ù. ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇØ break ¹®À» »ì¦ Ãß°¡ÇÔÀ¸·Î½á À̹ø¿¡ ¹ß°ßÇÑ ¹®Á¦´Â ½±°Ô ÇØ°áµÉ °ÍÀÌ´Ù. °¡²û switch ¹®¿¡¼­ break¸¦ Àؾî ÀÌ»óÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾ú´ø ±â¾ïÀÌ ÇѹøÂë ÀÖÀ» °ÍÀÌ´Ù.

´Ù½Ã ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ º¸ÀÚ.

[jerry@kuee1 tmp]$ ./a.out
Enter number to search for or -1 to quit: 4
Found at index 0
Enter number to search for or -1 to quit: 5

2Â÷¿øÀûÀÎ Áö¸é¿¡¼­ º¸¿©ÁÙ ¼ö´Â ¾øÁö¸¸ ¡®5¡¯¶ó´Â ¼ýÀÚ(data.dat ÆÄÀÏ¿¡ ¾ø´Â ¼ýÀÚ)¸¦ ãÀ¸·Á°í Çϸé ÇÁ·Î±×·¥ÀÌ ³¡³ªÁö ¾Ê´Â´Ù. ¾îµð¿¡¼­Àΰ¡ ¹«ÇÑ ·çÇÁ°¡ µ¹°í ÀÖÀ» °ÍÀÌ´Ù. À̹ø ¿¹Á¦ÀÇ ¸¶Áö¸·ÀÎ ¸¸Å­ ¿­½ÉÈ÷ ã¾Æº¸ÀÚ.

[jerry@kuee1 tmp]$ gdb a.out
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are welcome to change it and/or 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.
This GDB was configured as ¡°i386-redhat-linux¡±...
(gdb) r
Starting program: /home/jerry/tmp/a.out
Enter number to search for or -1 to quit: 5
Program received signal SIGINT, Interrupt.
0x8048698 in main () at bug2.c:54
54 if(data[middle] < search)
(gdb) s
55 low = middle;
(gdb)
58 }
(gdb) p middle
$1 = 0
(gdb) p high
$2 = 1
(gdb) s
41 while(1){
(gdb)
42 middle = (low + high) /2;
(gdb)
44 if(data[middle] == search){
(gdb)
49 if(low == high){
(gdb)
54 if(data[middle] < search)
(gdb) p low
$3 = 0
(gdb) p high
$4 = 1

¿ì¼±Àº gdb¸¦ ½ÇÇàÇØ ÇÁ·Î±×·¥À» µ¹·Á ¹«ÇÑ ·çÇÁ°¡ µÇ´Â ºÎºÐ¿¡¼­ Ctrl+C¸¦ ´­·¯ ÀÎÅÍ·´Æ®½ÃÅ°ÀÚ(SIGINT). ±× ÀÌÈÄ¿¡´Â step ¸í·É¾î¸¦ »ç¿ëÇØ ´ÙÀ½ ´Ü°è·Î ÁøÇàÇÒ ¼ö ÀÖ´Ù. ¿ì¸®°¡ ÀÎÅÍ·´Æ®½ÃÅ°±â Àü¿¡ ·çÇÁ´Â ÃæºÐÈ÷ µ¹¾Ò±â ¶§¹®¿¡ middle, high, lowÀÇ °ªÀº ÃæºÐÈ÷ Á¶Á¤µÆÀ» °ÍÀÌ´Ù. µû¶ó¼­ low¿Í high °ªÀ» Ãâ·ÂÇغ¸¸é 0°ú 1ÀÌ µÈ´Ù. ±×¸®°í ·çÇÁ¸¦ Çѹø ´õ µ¹¸° ´ÙÀ½¿¡ low¿Í high °ªÀ» Ãâ·ÂÇÏ¸é ¿ª½Ã 0°ú 1ÀÌ´Ù. ¹°·Ð ¾ÕÀ¸·Î 100³âÀÌ Áö³­´Ù°í Çصµ high¿Í low´Â °°¾ÆÁú ¼ö ¾ø±â ¶§¹®¿¡ ÇÁ·Î±×·¥Àº ³¡³ªÁö ¾Ê´Â´Ù. ¹®Á¦ÀÇ ¿øÀÎÀº int ÇüÀ» int ÇüÀ¸·Î ³ª´³À» ¶§ °ªÀÌ int ÇüÀÌ ¾Æ´Ï´õ¶óµµ ij½ºÆýÃÅ°±â ¶§¹®ÀÌ´Ù. ÀÌ ¹®Á¦´Â <¸®½ºÆ® 1>¿¡¼­µµ ¹®Á¦°¡ µÆ´ø °ÍÀÌ´Ù.

¹®Á¦ÀÇ ÇØ°á ¹æ¹ýÀº °£´ÜÇÏ´Ù. 2·Î ³ª´³À» ¶§ ³ª¸ÓÁö °ªÀÌ ¾ø°Ô ¸¸µé·Á¸é Ȧ¼ö¿¡ 1À» ´õÇϰųª »©¸é µÈ´Ù. Á¤È®ÇÑ ¼öÁ¤Àº Á÷Á¢ Çغ¸±â ¹Ù¶õ´Ù.

¡®¹ö±×°¡ ÀÖ´Ù´Â °ÍÀº Áõ¸íÇÒ ¼ö À־, ¹ö±×°¡ ¾ø´Ù´Â °ÍÀº Áõ¸íÇÒ ¼ö ¾ø´Ù¡¯´Â ¸»ÀÌ ÀÖ´Ù. ÇÁ·Î±×·¥¿¡ ¾öû³­ ÀڽۨÀÌ ÀÖ¾î ¡®³­ ÇÁ·Î±×·¥¿¡ ¹ö±× °°Àº °ÍÀº ¸¸µéÁö ¾Ê´Â´Ù¡¯°í »ý°¢ÇÒ ¼öµµ ÀÖÁö¸¸, ¼³»ç ±×·¸´Ù°í ÇÏ´õ¶óµµ ¿©·¯ »ç¶÷ÀÌ °øµ¿À¸·Î ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÒ °æ¿ì¸¦ »ý°¢Çؼ­¶óµµ µð¹ö±ë ±â¼úÀº ÀÍÇôµÖ¾ß ÇÑ´Ù. ¶ÇÇÑ ÇÊÀÚ´Â µð¹ö±ëÇϸ鼭 Æ÷ÀÎÅÍ, ½ºÅÃ, Å¥ µîÀÇ ¿©·¯ ¾ð¾î¿¡ ´ëÇÑ ÀÌÇظ¦ ³ôÈú ¼ö ÀÖ¾ú´Ù. ¾ÕÀ¸·Î ÀÌ ±ÛÀ» ÀÐÀº µ¶ÀÚ°¡ ¡®Segmentation fault¡¯¶ó´Â ¸Þ½ÃÁö¸¦ º¸°í ³­°¨ÇØÇÏ´Â ÀÏÀÌ ¾ø±â¸¦ ¹Ù¶õ´Ù.

ÇÊÀÚ ¿¬¶ôó : jerry@kuee.korea.ac.kr
Á¤¸® : À§À±Èñ iwish@sbmedia.co.kr


¡®Segmentation fault¡¯ÀÇ ¼¼±×¸ÕÅ×ÀÌ¼Ç À̶õ?

ÇÁ·Î±×·¥À» ÁߴܽÃų ¼ö ÀÖ´Â ´ëºÎºÐÀÇ ¹ö±×µéÀº ¡®Segmentation fault¡¯¶ó´Â ¸Þ½ÃÁö¸¦ ³²±ä´Ù. ÀÌ ¸Þ½ÃÁöÀÇ ¡®fault¡¯¶ó´Â ¸»Àº °áÇÔ, ½Ç¼ö µîÀÇ ÀǹÌÀÓÀ» ½±°Ô »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¡®segmentation¡¯Àº ¹«½¼ ÀǹÌÀϱî?

¼¼±×¸ÕÅ×À̼ÇÀº ¿î¿µÃ¼Á¦¿¡¼­ ¸Þ¸ð¸® °ü¸®(Memory Management)ÀÇ ÇÑ Á¾·ùÀÌ´Ù. ¼¼±×¸ÕÅ×À̼ÇÀ» Á¤ÀÇÇÑ´Ù¸é ¿ÏÀüÈ÷ ¸Ó½Å(machine) µ¶¸³ÀûÀÎ ÁÖ¼Ò °ø°£À» ÇÒ´çÇØÁÖ´Â Á÷Á¢ÀûÀÎ ¹æ¹ýÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù.

¿¹¸¦ µé¾î, ÄÄÆÄÀÏ·¯°¡ ¼Ò½º¸¦ ÄÄÆÄÀÏ ÇÒ ¶§ ´ÙÀ½°ú °°Àº Å×À̺íÀ» ¸¸µé ¼ö ÀÖ´Ù.

  1. ÅؽºÆ® ¼Ò½º¸¦ ÀúÀåÇÏ´Â °ø°£(Å×À̺í)
  2. º¯¼öÀÇ Æ¯¼º, À̸§ µîÀ» ÀúÀåÇÏ´Â ½É¹ú °ø°£
  3. Á¤¼ö, ºÎµ¿¼Ò¼ö µîÀ¸·Î ÁöÁ¤µÈ »ó¼ö¸¦ ÀúÀåÇÏ´Â °ø°£
  4. ÇÁ·Î±×·¥À» ¹®¹ýÀûÀ¸·Î ºÐ¼®ÇÑ Parse tree
  5. ÄÄÆÄÀÏ·¯°¡ »ç¿ëÇÑ ÇÁ·Î½ÃÀú ÄÝ ½ºÅÃ

ÀÌ·¯ÇÑ ¿©·¯ °¡ÁöÀÇ Å×À̺íÀ» ¼¼±×¸ÕÅ×ÀÌ¼Ç ¹æ¹ý¿¡¼­´Â °¢°¢ ¼¼±×¸ÕÆ®¶ó´Â µ¶¸³µÈ ÁÖ¼Ò °ø°£À» ÇÒ´çÇÏ°Ô µÈ´Ù. ¾ÕÀÇ ±×¸²Àº ¼¼±×¸ÕÆ®¸¦ ³ªÅ¸³½ °ÍÀÌ´Ù. ¹Ý¸é¿¡ °¡»ó ÁÖ¼Ò(Virtual Memory-pa gingÀÇ ´ëÇ¥ÀûÀÎ ¹æ¹ý)¶ó´Â ¹æ¹ý¿¡¼­´Â ÀÏÁ¤ÇÑ Å©±âÀÇ ÁÖ¼Ò °ø°£À» ¿©·¯ ¿µ¿ªÀ¸·Î ³ª´²(¼¼±×¸ÕÅ×À̼ǰú´Â ´Ù¸£°Ô ÀÏÂ÷¿øÀûÀÌ´Ù) ¾ÕÀÇ ¿©·¯ °¡Áö Å×À̺íÀ» ÀúÀåÇÏ°Ô µÈ´Ù.

¼¼±×¸ÕÅ×À̼ÇÀ» »ç¿ëÇÒ ¶§ÀÇ ÀåÁ¡¿¡´Â ¿©·¯ °¡Áö°¡ ÀÖÁö¸¸ ¿ì¼± °¢ ÇÁ·Î½ÃÀú°¡ ÁÖ¼Ò ¹øÁö 0¿¡¼­ ½ÃÀ۵Ǵ ºÐ¸®µÈ ¼¼±×¸ÕÆ®¸¦ °®±â ¶§¹®¿¡ µ¶¸³µÈ ÇÁ·Î½ÃÀúÀÇ ¿¬°áÀÌ ´Ü¼øÇØÁø´Ù. ¶ÇÇÑ ¿©·¯ °³ÀÇ ÇÁ·Î¼¼½º°¡ ÇÁ·Î½ÃÀú³ª µ¥ÀÌÅ͸¦ ½±°Ô °øÀ¯ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ ÀåÁ¡Àº ¼¼±×¸ÕÅ×À̼ÇÀÌ °¡»ó ¸Þ¸ð¸®¿Í´Â ´Þ¸® ±× Å©±â°¡ À¯µ¿ÀûÀ̶ó´Â µ¥¼­ ±âÀÎÇÑ´Ù.



¹Ú»óÈñ
¸í±ÔÀÇ Á¤¸®/Ãß°¡(2002-06-01 3:09¿ÀÀü)

BREAKPOINT(help break)
break: breakpointÁöÁ¤. ÇÔ¼ö¸í or ¶óÀγѹö
clear: ÁöÁ¤µÈ breakpointÁ¦°Å

run: ÇÁ·Î±×·¥ ½ÃÀÛ. runµÚ¿¡ Ãß°¡·Î argv¿Í °°ÀÌ ÀÎÀÚ¸¦ Àû¾îÁÙ ¼öµµ ÀÖ´Ù.

continue: ´ÙÀ½ breakpoint±îÁö °è¼Ó ½ÇÇà
          ¿©·¯°³ÀÇ breakpoint¸¦ ¼³Á¤ÇÏ°í °¢ breakpoint¿¡¼­ µð¹ö±ë½Ã next, stepµîÀ» ÀÌ¿ëÇÏ¿©
          µð¹ö±ëÇÏ°í, °¢ breakpoint°£ÀÇ À̵¿À» continue¸¦ »ç¿ëÇϸé À¯¿ë
          
next: ´ÙÀ½ ¶óÀÎ ½ÇÇà(subrutine callsÀÇ Ã³¸®°úÁ¤ º¸¿©ÁÖÁö ¾ÊÀ½)
step: next¿Í µ¿ÀÏÇϳª subrutine callsÀ» ¸¸³µÀ»¶§ ÇØ´ç subrutineÀ¸·Î ºÐ±âÇÏ¿©
      subrutine󸮰úÁ¤À» º¸¿©ÁÜ
      
print: ÁöÁ¤ÇÑ º¯¼ö°ª Ãâ·Â
display: ÁöÁ¤ÇÑ º¯¼ö°ªÀ» Áö¼ÓÀûÀ¸·Î Ãâ·Â
undisplay: display·Î ÁöÁ¤ÇÑ º¯¼ö°ªÀ» ´õÀÌ»ó Ãâ·ÂÇÏ°í ½ÍÁö ¾ÊÀ»¶§

set args: set args argument1, argument1,... ó·³ ½ÇÇàÀÎÀÚ¸¦ ÁöÁ¤ÇÏ°í, show args·Î ÁöÁ¤µÈ ÀÎÀÚ¸¦ º¼ ¼ö ÀÖ´Ù.
(gdb) set args air  
(gdb) show args     
Argument list to give program being debugged when it is started is "air".