´ÙÀ½ ÀÌÀü Â÷·Ê

5. µð¹ö±ë°ú Profiling

5.1 ¿¹¹æÀûÀÎ °ü¸®(lint)

¹®Á¦°¡ ¹ß»ýÇÏ°í ³ª¼­ ÇØ°áÇÏ´Â °Íº¸´Ù´Â ¹®Á¦¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÏ´Â °ÍÀÌ Áß¿äÇÏÁö ¾ÊÀ»±î? ¸®´ª½º¿¡ ³Î¸® ¾²ÀÌ´Â lint´Â ¾ø´Ù. ¾Æ¸¶µµ ´ëºÎºÐÀÇ »ç¶÷µéÀÌ gcc°¡ ³»³õ´Â ÀÚ¼¼ÇÑ °æ°í ¸Þ¼¼Áö¿¡ ¸¸Á·ÇÏ°í Àֱ⠶§¹®ÀÎ °Í °°´Ù. ¾Æ¸¶µµ °¡Àå À¯¿ëÇϾ²ÀÌ´Â °ÍÀº -Wall ½ºÀ§Ä¡ÀÏ °ÍÀÌ´Ù. ÀÌ°ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â "Warnings, all"·Î¼­ ¸ðµç °æ°í ¸Þ¼¼Áö¸¦ ¹ß»ý½ÃÅ°¶ó´Â ¸»ÀÌ´Ù. ¶ÇÇÑ ¾ÆÁÖ ÀÚ¼¼ÇÏ°Ô ³ª¿Â´Ù.

Public Domain lint´Â ftp://larch.lcs.mit.edu/pub/Larch/lclint¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾ó¸¶³ª ±¦ÂúÀºÁö º»ÀÎÀº ¸ð¸¥´Ù.

5.2 µð¹ö±ë

¾î¶»°Ô Çϸé ÇÁ·Î±×·¥ÀÇ µð¹ö±ë Á¤º¸¸¦ ¾Ë¾Æ³¾ ¼ö Àִ°¡?

±×·¯±â À§Çؼ­´Â -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       }

ÄÚ¾î È­ÀÏ(Core file)

º¸Åë ¸®´ª½º ºÎÆýÿ¡ ÄÚ¾î È­ÀÏÀ» ¸¸µéÁö ¾Êµµ·Ï ¼¼ÆõǾî ÀÖ´Ù. ÇÏÁö¸¸ ÄÚ¾îÈ­ÀÏ »ý¼ºÀ» °¡´ÉÄÉ ÇÏ·Á°í ÇÑ´Ù¸é ±×°ÍÀ» ´Ù½Ã °¡´ÉÄÉ ÇÏ´Â ¼ÐÀÇ ³»Àå ¸í·ÉÀ» »ç¿ëÇÑ´Ù.

¼Ð ȣȯ ¼Ð(¿¹. 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À̶ó°í ¸ðµÎ °íÃÄÁØ´Ù.

5.3 Profiling

ProfilingÀ̶ó°í ÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ ¾î¶² ºÎºÐÀÌ Á¦ÀÏ ÀÚÁÖ È£ÃâµÇ°í ÀÖ´ÂÁö ¶Ç´Â ¸¹Àº ½Ã°£À» ¼Ò¿äÇÏ°í ÀÖ´ÂÁö¸¦ Á¶»çÇÏ´Â °ÍÀÌ´Ù. Äڵ带 ÃÖÀûÈ­½ÃÅ°°í ½Ã°£ÀÌ °¡Àå ¸¹ÀÌ ¼ÒºñµÇ´Â °÷À» °íÃÄÁÖ´Â ÁÁÀº ¹æ¹ýÀÌ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­´Â -p ¿É¼ÇÀ» Á־ ½Ã°£ Á¤º¸¸¦ ¿ÀºêÁ§Æ® È­ÀϵéÀÌ °¡Áú ¼ö ÀÖµµ·Ï ´Ù½Ã ÄÄÆÄÀÏÇØÁÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ binutil ÆÐÅ°Áö¿¡ ÀÖ´Â gprof ¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº gprof ¸ÇÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.


´ÙÀ½ ÀÌÀü Â÷·Ê