¹®Á¦°¡ ¹ß»ýÇÏ°í ³ª¼ ÇØ°áÇÏ´Â °Íº¸´Ù´Â ¹®Á¦¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÏ´Â °ÍÀÌ Áß¿äÇÏÁö
¾ÊÀ»±î? ¸®´ª½º¿¡ ³Î¸® ¾²ÀÌ´Â lint´Â ¾ø´Ù. ¾Æ¸¶µµ ´ëºÎºÐÀÇ »ç¶÷µéÀÌ gcc°¡ ³»³õ´Â
ÀÚ¼¼ÇÑ °æ°í ¸Þ¼¼Áö¿¡ ¸¸Á·ÇÏ°í Àֱ⠶§¹®ÀÎ °Í °°´Ù. ¾Æ¸¶µµ °¡Àå À¯¿ëÇϾ²ÀÌ´Â
°ÍÀº -Wall
½ºÀ§Ä¡ÀÏ °ÍÀÌ´Ù. ÀÌ°ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â "Warnings, all"·Î¼ ¸ðµç
°æ°í ¸Þ¼¼Áö¸¦ ¹ß»ý½ÃÅ°¶ó´Â ¸»ÀÌ´Ù. ¶ÇÇÑ ¾ÆÁÖ ÀÚ¼¼ÇÏ°Ô ³ª¿Â´Ù.
Public Domain lint´Â ftp://larch.lcs.mit.edu/pub/Larch/lclint¿¡¼ ¾òÀ» ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾ó¸¶³ª ±¦ÂúÀºÁö º»ÀÎÀº ¸ð¸¥´Ù.
±×·¯±â À§Çؼ´Â -g
¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏ/¸µÅ©ÇØ¾ß ÇÑ´Ù. ±×¸®°í
-fomit-frame-pointer
½ºÀ§Ä¡´Â »©ÁÖ¾î¾ß ÇÑ´Ù. »ç½Ç ¸ðµç ºÎºÐÀ»
´Ù½Ã ÄÄÆÄÀÏÇÒ ÇÊ¿ä´Â ¾ø°í, ¿©·¯ºÐÀÌ °ü½É °®°í ÀÖ´Â ºÎºÐ¸¸À» ±×·¸°Ô ÇØÁÖ¸é µÈ´Ù.
a.out¿¡ ÀÖ¾î¼ °øÀ¯¶óÀ̺귯¸®°¡ ¸¸¾à -fomit-frame-pointer
½ºÀ§Ä¡¸¦
°¡Áö°í ÄÄÆÄÀϵǾú´Ù¸é gdb¸¦ »ç¿ëÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. -g
¿É¼ÇÀ» ÁÖ´Â ÀÌÀ¯´Â
¹Ù·Î Á¤Àû ¸µÅ©¸¦ ÇàÇ϶ó´Â ¸»À» ÇÔÃàÇÏ°Ô µÈ´Ù.
¸¸¾à ¸µÄ¿°¡ libg.a¸¦ ãÀ» ¼ö ¾ø´Ù°í ÇÏ¸é¼ ½ÇÆÐÇÏ°Ô µÈ´Ù¸é, ¿©·¯ºÐÀÌ
/usr/lib/libg.a
À» °®°í ÀÖÁö ¾Ê±â ¶§¹®ÀÏ °ÍÀÌ´Ù. ±× ÈÀÏÀº Ưº°ÇÑ ¶óÀ̺귯¸®·Î¼ µð¹ö±ë °¡´É
C ¶óÀ̺귯¸®ÀÌ´Ù. libc ÆÐÅ°Áö¿¡ Æ÷ÇԵǾî Àְųª ¶Ç´Â libc ¼Ò½º Äڵ带 ¹Þ¾Æ¼
ÄÄÆÄÀÏÇÏ¸é »ý±ä´Ù. ½ÇÁ¦·Î ±×·¸°Ô ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï°í ´ëÃæ /usr/lib/libc.a
¸¦
/usr/lib/libg.a
·Î ¸µÅ©½ÃÄѹö·Áµµ ´ëºÎºÐ »ó°ü¾øÀ» °ÍÀÌ´Ù.
¾ÆÁÖ ¸¹Àº GNU ¼ÒÇÁÆ®¿þ¾îµéÀº -g
¿É¼ÇÀ» °¡Áö°í ÄÄÆÄÀϵǾî ÀÖÀ¸¹Ç·Î ÈÀÏ
Å©±â°¡ ¸Å¿ì Å©´Ù. (Á¾Á¾ Á¤Àû ¸µÅ©µÇ¾î ÀÖÀ½) ±×·¸°Ô ±¦ÂúÀº »ý°¢ÀÎ °Í °°Áö´Â
¾Ê´Ù.
¸¸¾à ÇÁ·Î±×·¥ÀÌ autoconf¿¡ ÀÇÇØ ¸¸µé¾îÁø configure
¸¦ °¡Áö°í ÀÖ´Ù¸é,
º¸ÅëÀÇ °æ¿ì MakefileÀ» °Çµå¸²À¸·Î½á µð¹ö±ë Á¤º¸¸¦ ³ÖÁö ¾Ê°Ô ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð
ELF¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é, ÇÁ·Î±×·¥Àº -g
¼¼Æðú´Â »ó°ü¾øÀÌ µ¿Àû ¸µÅ©µÇ¸ç,
±×³É ½±°Ô strip
(µð¹ö±ë Á¤º¸¸¦ ½ÇÇàÈÀÏ¿¡¼ »©¹ö¸®´Â ÇàÀ§)½Ãų ¼ö ÀÖ´Ù.
´ëºÎºÐÀÇ »ç¶÷µéÀº gdb¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. gdb´Â GNU archive sites¿¡¼ ¼Ò½ºÀÇ ÇüÅ·Î, ¾Æ´Ï¸é tsx-11À̳ª ¼±»çÀÌÆ®¿¡¼ ¹ÙÀ̳ʸ®ÀÇ ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. xxgdb´Â gdb¿¡ ±âÃÊÇÑ X À©µµ¿ì µð¹ö°ÅÀÌ´Ù. Áï, ¿ì¼±ÀûÀ¸·Î gdb¸¦ ÀÌ¹Ì ¼³Ä¡Çß¾î¾ß ÇÑ´Ù´Â ¶æÀÌ´Ù. ±× ¼Ò½º´Â ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz¿¡¼ ãÀ» ¼ö ÀÖ´Ù.
¶ÇÇÑ UPS µð¹ö°Å°¡ Rick Sladkey¾¾¿¡ ÀÇÇØ Æ÷ÆõǾú´Ù. X À©µµ¿ì¿¡¼µµ Àß µ¹¾Æ°£´Ù. ÇÏÁö¸¸ xxgdb¿Í °°ÀÌ ÅؽºÆ® µð¹ö°ÅÀÎ gdb°°Àº °Í¿¡ ÀÇÁ¸ÇÏ´Â ÇüÅ´ ¾Æ´Ï´Ù. ¾ÆÁÖ ÈǸ¢ÇÑ ±â´ÉµéÀ» ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. µû¶ó¼ ¿©·¯ºÐÀÌ µð¹ö±ë¿¡ ¸¹Àº ½Ã°£À» ÇÒ¾ÖÇÏ°í ÀÖ´Ù¸é, ¿ì¼±ÀûÀ¸·Î UPS µð¹ö°Å¸¦ ±ÇÇÑ´Ù. ¸®´ª½º¿ëÀ¸·Î ÄÄÆÄÀÏµÈ ¹ÙÀ̳ʸ®³ª ¼Ò½º ÆÐÄ¡ÈÀÏÀº ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/¿¡¼ ±¸ÇÒ ¼ö ÀÖ°í ¿À¸®Áö³Î ¼Ò½º´Â ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z¿¡¼ ãÀ» ¼ö ÀÖ´Ù.
µð¹ö±ë¿¡ ¾²ÀÌ´Â ¶Ç ´Ù¸¥ Åø Çϳª¸¦ µéÀÚ¸é strace¸¦ µé ¼ö ÀÖ´Ù. strace´Â ÇÁ·Î±×·¥ÀÌ ¸¸µé¾î³»´Â ½Ã½ºÅÛ È£ÃâÀ» ȸ鿡 Ç¥½ÃÇØÁØ´Ù. ÀÌ°Í ¸»°íµµ ´Ù¹æ¸éÀ¸·Î »ç¿ë°¡´ÉÇѵ¥, ¿¹¸¦ µé¾î ¾î¶°ÇÑ Æнº¸íÀÌ ¼Ò½ºÄڵ带 °®°í ÀÖÁö ¾ÊÀº ¹ÙÀ̳ʸ® ÈÀÏ ¾È¿¡ ÄÄÆÄÀÏµÇ¾î µé¾î°¡ÀÖ´ÂÁö, ºÐ¸íÈ÷ ¹ÙÀ̳ʸ® ¾È¿¡ µé¾îÀÖ´Â Á¶°ÇµéÀ» ¹ß°ßÇÏ°íÀÚ ÇÒ ¶§, ÀϹÝÀûÀ¸·Î ÀϹÝÀûÀ¸·Î ¾î¶»°Ô ÀÛµ¿ÇÏ°í ÀÖ´ÂÁö¸¦ ¾Ë¾Æ³»°íÀÚ ÇÒ ¶§ »ç¿ëÇÑ´Ù. ÃֽŠstrace ¹öÀü(ÇöÀç 3.0.8)Àº ftp://ftp.std.com/pub/jrs/¿¡¼ ±¸ÇÒ ¼ö ÀÖ´Ù.
µ¥¸ó ÇÁ·Î±×·¥µéÀº ÀüÇüÀûÀ¸·Î fork()
¸¦ ¸ÕÀú ÇÏ°í ³ª¼, ºÎ¸ð ÇÁ·Î¼¼½º¸¦
Á¾·á½ÃÄÑ ¹ö¸°´Ù. ÀÌ´Â µð¹ö±ë ¼¼¼Ç¿¡ ´ëÇÏ¿© °ø°ÝÀûÀÎ ¿ä¼ÒÀÓÀÌ ºÐ¸íÇÏ´Ù.
ÀÌ·² ¶§ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº fork
¿¡ ´ëÇÏ¿© Á¤ÁöÁ¡(breakpoint)À»
ÁöÁ¤ÇØÁÖ´Â °ÍÀÌ°í ÇÁ·Î±×·¥ÀÌ ¸ØÃß¸é ´Ù½Ã±Ý ±×°ÍÀ» 0 À¸·Î ¸¸µé¾îÁÖ´Â °ÍÀÌ´Ù.
(gdb) list
1 #include <stdio.h>
2
3 main()
4 {
5 if(fork()==0) printf("child\n");
6 else printf("parent\n");
7 }
(gdb) break fork
Breakpoint 1 at 0x80003b8
(gdb) run
Starting program: /home/dan/src/hello/./fork
Breakpoint 1 at 0x400177c4
Breakpoint 1, 0x400177c4 in fork ()
(gdb) return 0
Make selected stack frame return now? (y or n) y
#0 0x80004a8 in main ()
at fork.c:5
5 if(fork()==0) printf("child\n");
(gdb) next
Single stepping until exit from function fork,
which has no line number information.
child
7 }
º¸Åë ¸®´ª½º ºÎÆýÿ¡ ÄÚ¾î ÈÀÏÀ» ¸¸µéÁö ¾Êµµ·Ï ¼¼ÆõǾî ÀÖ´Ù. ÇÏÁö¸¸ ÄÚ¾îÈÀÏ »ý¼ºÀ» °¡´ÉÄÉ ÇÏ·Á°í ÇÑ´Ù¸é ±×°ÍÀ» ´Ù½Ã °¡´ÉÄÉ ÇÏ´Â ¼ÐÀÇ ³»Àå ¸í·ÉÀ» »ç¿ëÇÑ´Ù.
¼Ð ȣȯ ¼Ð(¿¹. tcsh)À» ¾²°í ÀÖ´Ù¸é ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ³»¸°´Ù.
% limit core unlimited
¸¸¾à º»¼Ð·ù(sh, bash, zsh, pdksh)¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é,
$ ulimit -c unlimited
¸¸¾à ÄÚ¾î ÈÀÏÀÇ À̸§¿¡ ´ëÇÏ¿© À¶Å뼺À» °¡Áö°í ½Í´Ù¸é, Ä¿³Î ¼Ò½º¸¦ ¾à°£¸¸
º¯°æÇØÁÖ¸é µÈ´Ù. ÀÚ, fs/binfmt_aout.c
¿Í fs/binfmt_elf.c
¿Í
°°Àº ÈÀÏÀ» ã¾Æº¸ÀÚ.
memcpy(corefile,"core.",5);
#if 0
memcpy(corefile+5,current->comm,sizeof(current->comm));
#else
corefile[4] = '\0';
#endif
grep °°Àº °ÍÀ» °¡Áö°í ÀÌ·± ºÎºÐÀ» ¸ðµÎ ãÀº ÈÄ¿¡ 0
À̶ó°í µÇ¾î ÀÖ´Â °ÍÀ»
1
À̶ó°í ¸ðµÎ °íÃÄÁØ´Ù.
ProfilingÀ̶ó°í ÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ ¾î¶² ºÎºÐÀÌ Á¦ÀÏ ÀÚÁÖ È£ÃâµÇ°í ÀÖ´ÂÁö
¶Ç´Â ¸¹Àº ½Ã°£À» ¼Ò¿äÇÏ°í ÀÖ´ÂÁö¸¦ Á¶»çÇÏ´Â °ÍÀÌ´Ù. Äڵ带 ÃÖÀûȽÃÅ°°í ½Ã°£ÀÌ
°¡Àå ¸¹ÀÌ ¼ÒºñµÇ´Â °÷À» °íÃÄÁÖ´Â ÁÁÀº ¹æ¹ýÀÌ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ´Â -p
¿É¼ÇÀ» ÁÖ¾î¼ ½Ã°£ Á¤º¸¸¦ ¿ÀºêÁ§Æ® ÈÀϵéÀÌ °¡Áú ¼ö ÀÖµµ·Ï ´Ù½Ã ÄÄÆÄÀÏÇØÁÖ¾î¾ß
ÇÑ´Ù. ¶ÇÇÑ binutil ÆÐÅ°Áö¿¡ ÀÖ´Â gprof
¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÚ¼¼ÇÑ
»çÇ×Àº gprof
¸ÇÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.