¸ñÂ÷, ¿µ¹®

gcov: Å×½ºÆ® Ä¿¹ö¸®Áö ÇÁ·Î±×·¥

gcov´Â GNU CC¿Í ÇÔ²² »ç¿ëÇؼ­ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÄÚµå Ä¿¹ö¸®Áö(code coverage) Å×½ºÆ®¸¦ ¼öÇàÇÒ ¼ö ÀÖ´Â µµ±¸ÀÌ´Ù. ÀÌ Àå¿¡¼­´Â gcov ¹öÀü 1.5¸¦ ´ë»óÀ¸·Î ´ÙÀ½°ú °°Àº »çÇ×µéÀ» ¼³¸íÇÑ´Ù.


gcov¿¡ ´ëÇÑ ¼Ò°³

gcov´Â Ä¿¹ö¸®Áö Å×½ºÆ® ÇÁ·Î±×·¥ÀÌ´Ù. gcov¸¦ GNU CC¿Í ÇÔ²² »ç¿ëÇÏ¸é º¸´Ù ºü¸£°í È¿À²ÀûÀÎ ÇÁ·Î±×·¥ Äڵ带 ¸¸µé±â À§ÇÑ ºÐ¼®À» ½ÃÇàÇØ º¼ ¼ö ÀÖ´Ù. gcov´Â ÇÁ·Î±×·¥ ÄÚµåÀÇ ¾î´À ºÎºÐÀ» ÃÖÀûÈ­ ½ÃÅ°´Â °ÍÀÌ °¡Àå ÁÁÀº ¼±ÅÃÀÎÁö¸¦ ÆÇ´ÜÇϱâ À§ÇÑ ÇÁ·ÎÆÄÀϸµ µµ±¸(profiling tool)·Î »ç¿ëµÉ ¼ö ÀÖÀ¸¸ç, gprof µî°ú ÇÔ²² »ç¿ëÇϸé ÇÁ·Î±×·¥ ÄÚµåÀÇ ¾î´À ºÎºÐÀÌ µ¥ÀÌÅÍ ÀÔÃâ·Â 󸮸¦ Á¦¿ÜÇÑ »çÄ¢ ¿¬»ê µîÀÇ ½ÇÁ¦ ¿¬»ê ó¸® ¼Ò¿ä ½Ã°£À» °¡Àå ¸¹ÀÌ Â÷ÁöÇÏ°í ÀÖ´Â Áö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.

ÇÁ·ÎÆÄÀϸµ µµ±¸µéÀº ÇÁ·Î±×·¥ ÄÚµåÀÇ ¼º´ÉÀ» ºÐ¼®Çϴµ¥ µµ¿òÀÌ µÇ¸ç, gprof¿Í °°Àº ÇÁ·ÎÆÄÀÏ·¯¸¦ »ç¿ëÇÏ¸é ´ÙÀ½°ú °°Àº ±âº»ÀûÀÎ Åë°è Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

À§¿Í °°Àº »çÇ×µéÀ» ÅëÇؼ­ ÀÛ¼ºµÈ Äڵ尡 ÄÄÆÄÀÏ °úÁ¤¿¡¼­ ¾î¶»°Ô µ¿ÀÛÇÏ´Â Áö¸¦ È®ÀÎÇÑ ÈÄ¿¡, ¾î¶² ºÎºÐÀ» ÃÖÀûÈ­½ÃÄÑ¾ß ÇÒ Áö ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù. gcov´Â ¾î´À ºÎºÐÀ» ÃÖÀûÈ­ ½ÃÄÑ¾ß ÇÏ´Â Áö¸¦ ÆÇ´ÜÇϴµ¥ µµ¿òÀ» ÁØ´Ù.

¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚµéÀº °³¹ßµÈ ¼ÒÇÁÆ®¿þ¾î°¡ ¹èÆ÷ °¡´ÉÇÑ Á¤µµÀÇ ¼º´ÉÀ» º¸ÀÌ´Â Áö¸¦ È®ÀÎÇϱâ À§Çؼ­ ´ÜÀ§ °Ë»ç(unit test) µîÀÇ Å×½ºÆ®¸¦ Ä¿¹ö¸®Áö ºÐ¼®°ú ÇÔ²² »ç¿ëÇÑ´Ù. À̶§ »ç¿ëµÇ´Â Å×½ºÆ®µéÀº ÇÁ·Î±×·¥ÀÌ ¿¹»ó´ë·Î ÀÛµ¿ÇÏ´Â Áö¸¦ °ËÁõÇÒ ¼ö Àִµ¥, Ä¿¹ö¸®Áö ÇÁ·Î±×·¥Àº Å×½ºÆ®¿¡ ÀÇÇؼ­ ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô ÀÛµ¿ÇÏ´Â Áö¸¦ È®ÀÎÇϱâ À§Çؼ­ »ç¿ëµÇ¸ç ±× °á°ú¿¡ µû¶ó¼­ °³¹ßÀÚµéÀº Å×½ºÆ® ±â´ÉÀ» º¸´Ù ÁÁ°Ô °³·®ÇÏ°í, ¸¸µé¾îÁú Á¦Ç°À» Çâ»ó½ÃÅ°±â À§Çؼ­ ¾î¶°ÇÑ °Ë»ç Ç׸ñÀ̳ª ±â´ÉÀÌ Ãß°¡µÇ¾î¾ß ÇÒ Áö¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù.

gcov¸¦ »ç¿ëÇÏ°íÀÚ ÇÑ´Ù¸é ÄÄÆÄÀÏ ½Ã¿¡ GNU CC ÃÖÀûÈ­ ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé, Äڵ带 ÃÖÀûÈ­ Çؼ­ ÄÄÆÄÀÏ ÇÒ °æ¿ì¿¡´Â ¿©·¯ °³ÀÇ ÇàµéÀÌ ÇϳªÀÇ ÇÔ¼ö·Î ÅëÇÕµÉ ¼ö Àֱ⠶§¹®¿¡ ÇÁ·Î±×·¥ ½ÇÇà ½Ã¿¡ °è»ê ½Ã°£ÀÌ ¸¹ÀÌ ¼Ò¿äµÇ´Â ºÎºÐÀ» ã±â À§ÇÑ Á¤º¸¸¦ ¸¹ÀÌ ¾òÀ» ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ¶ÇÇÑ gcov´Â ÇàÀ» ÃÖ¼Ò Ã³¸® ´ÜÀ§·Î Åë°è¸¦ »êÃâÇϱ⠶§¹®¿¡ ÇÑ Çà¿¡ ÇϳªÀÇ ¹®ÀåÀ» ÀÔ·ÂÇÏ´Â ÇÁ·Î±×·¡¹Ö ½ºÅ¸ÀÏÀ» »ç¿ëÇÒ ¶§ ÃÖ»óÀÇ °á°ú¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù. ¸¸¾à, ·çÇÁ³ª Á¦¾î ±¸¹®À¸·Î È®ÀåµÈ º¹ÀâÇÑ ÇüÅÂÀÇ ¸ÅÅ©·Î¸¦ »ç¿ëÇÑ °æ¿ì¿¡´Â ¸ÅÅ©·Î°¡ È£ÃâµÈ ÇุÀ» Ãâ·ÂÇØ ÁÖ´Â gcovÀÇ Åë°è´Â Å« µµ¿òÀÌ µÇÁö ¾Ê´Â´Ù. º¹ÀâÇÑ ÇüÅÂÀÇ ¸ÅÅ©·Î°¡ ¸¶Ä¡ ÇÔ¼ö¿Í °°ÀÌ »ç¿ëµÉ °æ¿ì¿¡´Â ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ ¸ÅÅ©·Î°¡ ¾Æ´Ñ ÀζóÀÎ ÇÔ¼ö(inline function)ÀÇ ÇüÅ·Π¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

gcov´Â ¼Ò½º ÆÄÀÏÀÎ `sourcefile.c'¸¦ ±¸¼ºÇÏ´Â °¢°¢ÀÇ ÇàµéÀÌ ¸î ¹ø¾¿ ½ÇÇàµÇ¾ú´Â Áö¸¦ ¾Ë·ÁÁÖ´Â ·Î±× ÆÄÀÏÀÎ `sourcefile.gcov'¸¦ »ý¼ºÇϴµ¥, ÀÌ·¯ÇÑ ·Î±× ÆÄÀÏÀº gprof¿Í ÇÔ²² ÇÁ·Î±×·¥À» º¸´Ù ³ªÀº ¼º´ÉÀ¸·Î Æ©´×Çϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. gprof´Â gcov·ÎºÎÅÍ ¾òÀº Á¤º¸¿¡ µ¡ºÙ¿©¼­ ½Ã°£¿¡ ´ëÇÑ Á¤º¸µµ ÇÔ²² Á¦°øÇØ ÁÙ ¼ö ÀÖ´Ù.

gcov´Â GNU CC·Î ÄÄÆÄÀÏµÈ Äڵ忡¼­¸¸ µ¿ÀÛÇϸç, ´Ù¸¥ Á¾·ùÀÇ ÇÁ·ÎÆÄÀϸµÀ̳ª Å×½ºÆ® Ä¿¹ö¸®Áö ¹æ½Ä°ú´Â ȣȯµÇÁö ¾Ê´Â´Ù


gcovÀÇ »ç¿ë¹ý

gcov [-b] [-c] [-v] [-n] [-l] [-f] [-o µð·ºÅ丮À̸§] ¼Ò½ºÆÄÀÏÀ̸§
-b
Ãâ·Â ÆÄÀÏ¿¡ ºÐ±â°¡ ÀϾ Ƚ¼ö¿¡ ´ëÇÑ »çÇ×À» ±â·ÏÇÏ°í ºÐ±â¿¡ ´ëÇÑ ¿ä¾à Á¤º¸¸¦ Ç¥ÁØ Ãâ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù. ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé ÇÁ·Î±×·¥ ¾È¿¡¼­ °¢°¢ÀÇ ºÐ±â°¡ ¾î´À Á¤µµÀÇ ºóµµ·Î ÀϾ´Â Áö¸¦ È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù.

-c
ºÐ±â°¡ ÀϾ ºóµµ¸¦ ¹éºÐÀ²ÀÌ ¾Æ´Ñ Ƚ¼ö·Î Ç¥½ÃÇØ ÁØ´Ù. (1.5 ¹öÀü¿¡´Â ÀÌ ¿É¼ÇÀÌ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù.)

-v
gcovÀÇ ¹öÀüÀ» Áø´Ü Ãâ·Â(standard error)À¸·Î Ãâ·ÂÇØ ÁØ´Ù.

-n
Ãâ·Â ÆÄÀÏÀ» »ý¼ºÇÏÁö ¾Ê´Â´Ù.

-l
ÀÎŬ·çµå(include)µÈ ¼Ò½º ÆÄÀÏÀ» À§Çؼ­ ±ä À̸§ÀÇ Ãâ·Â ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. ¿¹¸¦ µé¸é, ½ÇÁ¦ Äڵ尡 `x.h' Çì´õ ÆÄÀÏ ¾È¿¡ Æ÷ÇԵǾî ÀÖ°í, ÀÌ Çì´õ ÆÄÀÏÀÌ `a.c' ÆÄÀÏ ¾È¿¡ Æ÷ÇԵǾî ÀÖÀ» °æ¿ì¿¡ `a.c' ÆÄÀÏÀ» gcovÀÇ Àμö·Î -l ¿É¼Ç°ú ÇÔ²² ½ÇÇà½ÃÅ°¸é `x.h.gcov'°¡ ¾Æ´Ñ `a.c.x.h.gcov'¶ó´Â À̸§À¸·Î Ãâ·Â ÆÄÀÏÀ» ¸¸µé ¼ö ÀÖ´Ù. ÀÌ°ÍÀº `x.h' ÆÄÀÏÀÌ ¿©·¯ °³ÀÇ ¼Ò½º ÆÄÀÏ ¾È¿¡ Æ÷ÇԵǾî ÀÖÀ» °æ¿ì¿¡ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Ù.

-f
ÆÄÀÏ¿¡ ´ëÇÑ ¿ä¾à Á¤º¸ ÀÌ¿Ü¿¡ °¢°¢ÀÇ ÇÔ¼ö¿¡ ´ëÇÑ ¿ä¾à Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.

-o
¿ÀÇÁÁ§Æ® ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮¸¦ ÁöÁ¤ÇÑ´Ù. gcov´Â -o ¿É¼ÇÀ¸·Î ÁöÁ¤ÇÑ µð·ºÅ丮¿¡¼­ .bb¿Í .bbg ±×¸®°í .da¸¦ È®ÀåÀÚ·Î °®´Â ÆÄÀÏÀ» °Ë»öÇÑ´Ù.


gcov¸¦ »ç¿ëÇϱâ À§Çؼ­´Â GNU CCÀÇ `-fprofile-arcs -ftest-coverage' ¿É¼ÇÀ» »ç¿ëÇؼ­ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇØ¾ß ÇÑ´Ù. ÀÌ ¿É¼ÇµéÀº GNU CC ÄÄÆÄÀÏ·¯·Î ÇÏ¿©±Ý ÇÁ·Î±×·¥ÀÇ ÇÃ·Î¿ì ±×·¡ÇÁ(flow graph)¸¦ Æ÷ÇÔÇÑ gcovÀÇ »ç¿ë¿¡ ÇÊ¿äÇÑ ºÎ°¡ÀûÀÎ Á¤º¸¸¦ »ý¼ºÇϵµ·Ï ÇÒ ¼ö ÀÖÀ¸¸ç, ÇÁ·ÎÆÄÀϸµ Á¤º¸¸¦ ¸¸µé±â À§ÇÑ »çÇ×µéÀ» ¿ÀÇÁÁ§Æ® ÆÄÀÏ¿¡ Ãß°¡½Ãų ¼ö ÀÖ´Ù. ÀÌ ÆÄÀϵéÀº ¼Ò½º Äڵ尡 ÀÖ´Â µð·ºÅ丮 ¾È¿¡ »ý¼ºµÈ´Ù.

ÄÄÆÄÀÏÀÌ ¿Ï·áµÈ ÈÄ¿¡ gcov¸¦ ½ÇÇàÇϸé Ãâ·Â ÆÄÀÏÀÌ »ý¼ºµÇ´Âµ¥, `-fprofile-arcs' ¿É¼Ç°ú ÇÔ²² ÄÄÆÄÀÏ µÈ ¼Ò½º ÄÚµåÀÇ °æ¿ì¿¡´Â .da¸¦ È®ÀåÀÚ·Î °®´Â µ¥ÀÌÅÍ ÆÄÀÏÀÌ ¼Ò½º µð·ºÅ丮¿¡ »ý¼ºµÈ´Ù. ´ÙÀ½Àº ¼Ò½º ÆÄÀÏÀÇ À̸§ÀÌ `tmp.c'ÀÎ °æ¿ì¿¡ ´ëÇÑ ±âº»ÀûÀÎ gcovÀÇ »ç¿ë ¿¹ÀÌ´Ù. ¸ÕÀú, ´ÙÀ½°ú °°Àº ³»¿ëÀ» ´ã°í ÀÖ´Â ¼Ò½º ÄÚµå `tmp.c'¸¦ ÀÛ¼ºÇÑ´Ù.

                main()
                {
                 int i, total;   
                 total = 0;
                 for (i = 0; i < 10; i++)
                  total += i;
                 if (total != 45)
                   printf ("Failure\n");
                 else
                   printf ("Success\n");
                }


gcc¿Í gcov¸¦ ´ÙÀ½°ú °°Àº ¼ø¼­·Î ½ÇÇà½ÃŲ´Ù.

$ gcc -fprofile-arcs -ftest-coverage tmp.c
$ ./a.out
$ gcov tmp.c
 87.50% of 8 source lines executed in file tmp.c
Creating tmp.c.gcov.


`tmp.c.gcov' ÆÄÀÏÀº ´ÙÀ½°ú °°Àº ½ÇÇà °á°ú¸¦ ´ã°í ÀÖ´Ù. ¿ÞÂÊ¿¡ Ãâ·ÂµÈ ¼ýÀÚ´Â ÇØ´ç ÇàÀÌ ½ÇÇàµÈ Ƚ¼ö¸¦ ÀǹÌÇÑ´Ù.

                main()
                {
           1      int i, total;
                
           1      total = 0;
                
          11      for (i = 0; i < 10; i++)
          10        total += i;
                
           1      if (total != 45)
      ######        printf ("Failure\n");
                  else
           1        printf ("Success\n");
           1    }


`-b' ¿É¼ÇÀ» »ç¿ëÇÑ °æ¿ìÀÇ Ãâ·Â °á°ú´Â ´ÙÀ½°ú °°´Ù.

$ gcov -b tmp.c
 87.50% of 8 source lines executed in file tmp.c
 80.00% of 5 branches executed in file tmp.c
 80.00% of 5 branches taken at least once in file tmp.c
 50.00% of 2 calls executed in file tmp.c
Creating tmp.c.gcov.


°á°ú·Î »ý¼ºµÇ´Â `tmp.c.gcov' ÆÄÀÏ¿¡´Â ´ÙÀ½°ú °°Àº ÇüÅÂÀÇ Åë°è Á¤º¸°¡ Æ÷ÇԵȴÙ.

                main()
                {
           1      int i, total;
                
           1      total = 0;
                
          11      for (i = 0; i < 10; i++)
branch 0 taken = 91%
branch 1 taken = 100%
branch 2 taken = 100%
          10        total += i;
                
           1      if (total != 45)
branch 0 taken = 100%
      ######        printf ("Failure\n");
call 0 never executed
branch 1 never executed
                  else
           1        printf ("Success\n");
call 0 returns = 100%
           1    }


Àüü Äڵ带 ±¸¼ºÇÏ´Â ´ÜÀ§ ºí·Ïµé¿¡ ´ëÇؼ­ ºí·ÏÀÇ ¸¶Áö¸· Çà ¹Ø¿¡´Â ÇØ´ç ºí·ÏÀÌ ºÐ±â(branch) µÇ¸é¼­ ³¡³µ´ÂÁö, ¾Æ´Ï¸é ´Ù¸¥ ·çƾÀ» È£Ãâ(call) Çϸ鼭 ³¡³µ´Â Áö¸¦ ¾Ë·ÁÁÖ´Â °£´ÜÇÑ ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù. ¿©·¯ °³ÀÇ ºí·ÏÀÌ ÇÔ²² ¸¶¹«¸® µÇ´Â À§Ä¡¿¡ ÀÖ´Â ÇàÀÇ °æ¿ì¿¡´Â ¿©·¯ °³ÀÇ ºÐ±â³ª È£Ãâ »çÇ×ÀÌ Ç¥½ÃµÉ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡´Â °¢°¢ÀÇ ºÐ±â¿Í È£Ãâ¿¡ ´ëÇؼ­ `branch 0', `branch 1'°ú °°Àº Çü½ÄÀÇ ½Äº° ¹øÈ£°¡ Ç¥½ÃµÇÁö¸¸, ´Ü¼øÈ÷ ¼Ò½º Äڵ带 Àд ¹æ¹ýÀ¸·Î ºÐ±â³ª È£ÃâÀÌ ½ÃÀÛµÈ ¿ø·¡ÀÇ À§Ä¡·Î Á¤È®È÷ °Å½½·¯ ¿Ã¶ó°¡´Â °ÍÀº °áÄÚ ½¬¿î ÀÏÀÌ ¾Æ´Ï´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î ³·Àº ¼ýÀÚ¸¦ °®´Â ºÐ±â¿Í È£ÃâÀϼö·Ï ¼Ò½º Äڵ忡¼­ ¿ÞÂÊ ¹æÇâÀ¸·Î º¸´Ù ¸Ö¸® À§Ä¡ÇÏ°Ô µÈ´Ù.

ºÐ±âÀÇ °æ¿ì, ÃÖ¼ÒÇÑ ÇÑ ¹ø ÀÌ»ó ½ÇÇàµÇ¾úÀ» ¶§¿¡´Â ÇØ´ç ºÐ±â°¡ ¼±ÅÃµÈ È½¼ö¸¦ ºÐ±â°¡ ½ÇÇàµÈ Ƚ¼ö·Î ³ª´« ¹éºÐÀ²ÀÌ Ç¥½ÃµÈ´Ù. ¸¸¾à ¼±ÅÃµÈ ºÐ±â°¡ ½ÇÇàµÇÁö ¾ÊÀº °æ¿ì¿¡´Â `never executed'¶ó´Â ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù.

È£ÃâÀÇ °æ¿ì, ÃÖ¼ÒÇÑ ÇÑ ¹ø ÀÌ»ó ½ÇÇàµÇ¾úÀ» ¶§¿¡´Â È£Ãâ¿¡ ´ëÇÑ ¸®ÅÏ°ªÀÌ ¹ÝȯµÈ Ƚ¼ö¸¦ È£ÃâÀÌ ½ÇÇàµÈ Ƚ¼ö·Î ³ª´« ¹éºÐÀ²ÀÌ Ç¥½ÃµÈ´Ù. ÀÌ °ªÀº ÀϹÝÀûÀ¸·Î 100%°¡ µÇ¾î¾ß ÇÏÁö¸¸, ¸ðµç È£Ãâ¿¡ ´ëÇؼ­ ¸®ÅÏ°ªÀÌ µÇµ¹·Á ÁöÁö ¾Ê´Â exit³ª longjmp¸¦ »ç¿ëÇÏ´Â ÇÔ¼öÀÇ °æ¿ì¿¡´Â 100%º¸´Ù ÀÛÀº ¼öÄ¡°¡ Ç¥½ÃµÉ ¼öµµ ÀÖ´Ù.

½ÇÇà Ƚ¼ö´Â ´©ÀûµÈ´Ù. µû¶ó¼­, .da ÆÄÀÏÀ» »èÁ¦ÇÏÁö ¾ÊÀº »óÅ¿¡¼­ À§ÀÇ ¿¹Á¦ ÇÁ·Î±×·¥À» ´Ù½Ã ½ÇÇà½ÃÅ°¸é °¢°¢ÀÇ ¼Ò½º ÄÚµå ÇàÀÌ ½ÇÇàµÈ Ƚ¼ö¸¦ ³ªÅ¸³»´Â ¼ýÀÚ°¡ ÀÌÀüÀÇ 2¹è·Î Áõ°¡ÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀº ¸î °¡Áö Ãø¸é¿¡ À־ ÀÌÁ¡À» Á¦°øÇÑ´Ù. ¿¹¸¦ µé¸é, Å×½ºÆ®¼öÆ®(testsuite)ÀÇ ÀϺηΠ¸¹Àº ÇÁ·Î±×·¥µéÀÌ ½ÇÇàµÉ ¶§ À̸¦ ÃàÀûµÈ µ¥ÀÌÅÍ·Î »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ¿©·¯ °³ÀÇ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Âµ¥ µû¸¥ º¸´Ù Á¤È®ÇÑ Àå±â Á¤º¸(long-term information)¸¦ Á¦°øÇØ ÁÙ ¼ö ÀÖ´Ù.

.da ÆÄÀÏ ¾ÈÀÇ µ¥ÀÌÅÍ´Â ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ±â ¹Ù·Î Á÷Àü¿¡ ±â·ÏµÈ´Ù. `-fprofile-arcs' ¿É¼Ç°ú ÇÔ²² ½ÇÇàµÈ ¸ðµç ¼Ò½º ÆÄÀϵ鿡 ´ëÇؼ­ ÇÁ·ÎÆÄÀϸµ ÄÚµå´Â .da ÆÄÀÏÀÌ Á¸ÀçÇÏ°í ÀÖ´Â Áö¸¦ ¸ÕÀú È®ÀÎÇÑ´Ù. ¸¸¾à ÀÌ ÆÄÀÏÀÌ ½ÇÇà ÆÄÀÏ°ú ´ÜÀ§ ºí·ÏÀÇ ¼ýÀÚ¿¡ ´ëÇÑ Â÷À̸¦ °®°í ÀÖ´Ù¸é .da ÆÄÀÏÀÇ ³»¿ëÀ» ¹«½ÃÇÑ µÚ¿¡ »õ·Î¿î ½ÇÇà Ƚ¼ö¸¦ ÆÄÀÏ¿¡ Ãß°¡ÇÑ µÚ¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÑ´Ù.


gcov¿Í ÄÚµå ÃÖÀûÈ­

ÇÁ·Î±×·¥ÀÇ Äڵ带 gcov¸¦ ÀÌ¿ëÇؼ­ ÃÖÀûÈ­½ÃÅ°·Á°í ÇÑ´Ù¸é, ¸ÕÀú 2°³ÀÇ ¿É¼ÇÀÎ `-fprofile-arcs -ftest-coverage'¸¦ »ç¿ëÇؼ­ GNU CC·Î ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. µÎ °³ÀÇ ¿É¼Ç ÀÌ¿Ü¿¡ ¶Ç´Ù¸¥ GNU CCÀÇ ¿É¼ÇµéÀ» ÇÔ²² »ç¿ëÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ±×·¯³ª gcov°¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ¸¸µé±â À§Çؼ­´Â ÇÁ·Î±×·¥À» ±¸¼ºÇÏ´Â ¸ðµç ÇàµéÀÇ ½ÇÇàÀ» È®½ÇÇÏ°Ô º¸ÀåÇϱâ À§Çؼ­ GNU CCÀÇ ÃÖÀûÈ­ ¿É¼ÇÀ» »ç¿ëÇؼ­´Â ¾ÈµÈ´Ù. ÇÁ·Î±×·¥ ÃÖÀûÈ­ µµ±¸µéÀº ƯÁ¤ÇÑ ¾ÆÅ°ÅØó »ó¿¡¼­ ¸î °³ÀÇ ÇàµéÀ» »èÁ¦ÇÑ µÚ¿¡ À̵éÀ» ´Ù¸¥ Çà¿¡ °áÇÕ½Ãų ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº °£´ÜÇÑ ÄÚµåÀÇ ¿¹¸¦ º¸ÀÚ.

if (a != b)
  c = 1;
else
  c = 0;


ƯÁ¤ÇÑ ¾ÆÅ°ÅØóÀÇ ½Ã½ºÅÛ¿¡¼­´Â À§ÀÇ Äڵ尡 ÇϳªÀÇ ÀνºÆ®·°¼Ç(instruction)À¸·Î ÄÄÆÄÀÏ µÉ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡´Â ÄÚµåµéÀÌ Çà ´ÜÀ§·Î ºÐ¸®µÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡ gcov°¡ ½ÇÇà Ƚ¼ö¸¦ Çະ·Î »êÃâÇÏ´Â °ÍÀÌ ºÒ°¡´É ÇØÁø´Ù. µû¶ó¼­ ÇÁ·Î±×·¥À» ÃÖÀûÈ­½ÃÄѼ­ ÄÄÆÄÀÏ ÇÒ °æ¿ì¿¡´Â gcov¿¡ ÀÇÇÑ Ãâ·Â Á¤º¸°¡ ´ÙÀ½°ú °°ÀÌ µÉ ¼öµµ ÀÖ´Ù.

      100  if (a != b)
      100    c = 1;
      100  else
      100    c = 0;


À§ÀÇ ºí·ÏÀº ÃÖÀûÈ­ °á°ú·Î ÀÎÇؼ­ ÇϳªÀÇ ÄÚµå·Î °áÇÕµÇ¾î ¸ðµÎ 100ȸ¾¿ ½ÇÇàµÈ °ÍÀ¸·Î ³ªÅ¸³ª°í ÀÖ´Ù. ¾î¶² Àǹ̿¡¼­ ÀÌ·¯ÇÑ °á°ú´Â ¿Ã¹Ù¸¥ °ÍÀ̶ó°í º¼ ¼ö ÀÖ´Ù. ¿Ö³ÄÇϸé 4ÇàÀÇ Äڵ尡 ÇϳªÀÇ ÀνºÆ®·°¼ÇÀ» ±¸¼ºÇÏ°í Àֱ⠶§¹®ÀÌ´Ù. ±×·¯³ª À§ÀÇ °á°ú¸¦ ÅëÇؼ­´Â °á°ú°¡ 0ÀÎ °æ¿ì¿Í 1ÀÎ °æ¿ì°¡ °¢°¢ ¸î ¹ø¾¿ ³ªÅ¸³µ´Â Áö¸¦ È®ÀÎÇÒ ¼ö ¾ø´Ù.


gcov µ¥ÀÌÅÍ ÆÄÀÏ

gcov´Â ÇÁ·ÎÆÄÀϸµÀ» À§Çؼ­ ¼¼ °³ÀÇ ÆÄÀÏÀ» »ç¿ëÇϴµ¥, ÀÌ ÆÄÀϵéÀÇ À̸§Àº ¿ø·¡ÀÇ ¼Ò½º ÆÄÀÏÀÌ °®°í ÀÖ´ø À̸§¿¡ .bb (Basic Block)¿Í .bbg (Basic Block Graph) ±×¸®°í .da (DAta)¸¦ È®ÀåÀÚ·Î ºÙÀÎ °ÍÀÌ´Ù. ÀÌ ÆÄÀϵéÀº ¼Ò½º ÆÄÀÏÀÌ ÀÖ´ø µð·ºÅ丮¿¡ »ý¼ºµÇ¸ç Ç÷§Æû¿¡ µ¶¸³ÀûÀÎ ÇüÅ·Πµ¥ÀÌÅ͸¦ ÀúÀåÇÏ°í ÀÖ´Ù.

.bb¿Í .bbg ÆÄÀÏÀº ¼Ò½º ÆÄÀÏÀ» `-ftest-coverage' ¿É¼Ç°ú ÇÔ²² GNU CC·Î ÄÄÆÄÀÏÇÒ ¶§ »ý¼ºµÈ´Ù. .bb ÆÄÀÏÀº Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇÑ ¼Ò½º ÆÄÀϵéÀÇ ¸ñ·Ï°ú ÀÌ ÆÄÀÏ ¾È¿¡ Æ÷ÇÔµÈ ÇÔ¼öµéÀÇ ¸ñ·ÏÀ» ´ã°í ÀÖ´Ù. ¶ÇÇÑ ¼Ò½º ÆÄÀÏ ¾ÈÀÇ ´ÜÀ§ ºí·Ïµé¿¡ ´ëÀÀµÇ´Â Çà ¹øÈ£¸¦ ´ã°í ÀÖ´Ù.

.bb ÆÄÀÏÀÇ Çü½ÄÀº ¼Ò½º ÆÄÀÏÀ» ±¸¼ºÇÏ°í ÀÖ´Â ´ÜÀ§ ºí·ÏµéÀÇ ½ÃÀÛ À§Ä¡¸¦ ³ªÅ¸³»´Â Çà ¹øÈ£¿¡ ÇØ´çÇÏ´Â 4¹ÙÀÌÆ® Á¤¼öµéÀÇ ¸ñ·ÏÀ¸·Î ±¸¼ºµÇ¾î Àִµ¥, °¢°¢ÀÇ ¸ñ·ÏµéÀº Çà ¹øÈ£ 0À¸·Î ±¸ºÐµÈ´Ù. ¿¹Á¦·Î »ç¿ëµÈ `tmp.c'·ÎºÎÅÍ »ý¼ºµÈ `tmp.bb' ÆÄÀÏ°ú ¹ÙÀ̳ʸ® Á¤º¸¸¦ Ãâ·ÂÇØ ÁÙ ¼ö ÀÖ´Â od ¸í·É¾î¸¦ ÀÌ¿ëÇÑ .bb ÆÄÀÏÀÇ Ãâ·Â ÇüÅ´ ´ÙÀ½°ú °°´Ù. ¿©±â¼­´Â .bb ÆÄÀÏÀÇ ±¸¼º ÇüŸ¦ ¼³¸íÇϱâ À§Çؼ­ µ¿ÀÏÇÑ `tmp.bb' ÆÄÀÏÀÇ ³»¿ëÀ» 4¹ÙÀÌÆ® ÇüÅÂÀÇ Á¤¼ö¿Í ASCII ÇüÅ·Π°¢°¢ Ãâ·ÂÇÑ µÚ¿¡ paste ¸í·É¾î¸¦ ÀÌ¿ëÇؼ­ ÇÑÇ྿ ´ëÀÀ½ÃŲ Ãâ·Â ÇüŸ¦ »ç¿ëÇß´Ù.

      $ paste 1 2 `od -w4 -d tmp.bb>1; od -w4 -c tmp.bb>2`
        0000000     2 32768     |     0000000 002  \0  \0 200
	0000004 24941 28265     |     0000004   m   a   i   n
	0000010     0     0     |     0000010  \0  \0  \0  \0
	0000014     2 32768     |     0000014 002  \0  \0 200
	0000020     0     0     |     0000020  \0  \0  \0  \0
	0000024     1 32768     |     0000024 001  \0  \0 200
	0000030 28020 11888     |     0000030   t   m   p   .
	0000034    99     0     |     0000034   c  \0  \0  \0
	0000040     1 32768     |     0000040 001  \0  \0 200
	0000044     3     0     |     0000044 003  \0  \0  \0
	0000050     4     0     |     0000050 004  \0  \0  \0
	0000054     5     0     |     0000054 005  \0  \0  \0
	0000060     0     0     |     0000060  \0  \0  \0  \0
	*	*               |
	0000074     6     0     |     0000074 006  \0  \0  \0
	0000100     5     0     |     0000100 005  \0  \0  \0
	0000104     0     0     |     0000104  \0  \0  \0  \0
	*	*               |
	0000114     7     0     |     0000114  \a  \0  \0  \0
	0000120     0     0     |     0000120  \0  \0  \0  \0
	0000124     8     0     |     0000124  \b  \0  \0  \0
	0000130     0     0     |     0000130  \0  \0  \0  \0
	*	*               |
	0000140    10     0     |     0000140  \n  \0  \0  \0
	0000144     0     0     |     0000144  \0  \0  \0  \0
	*	*               |           
	0000154    11     0     |     0000154  \v  \0  \0  \0
	0000160     2 32768     |     0000160 002  \0  \0 200
	0000164 18271 20300     |     0000164   _   G   L   O
	0000170 16706 24396     |     0000170   B   A   L   _
	0000174 18734 27950     |     0000174   .   I   .   m
	0000200 26977 18286     |     0000200   a   i   n   G
	0000204 20291    86     |     0000204   C   O   V  \0
	0000210     2 32768     |     0000210 002  \0  \0 200
	0000214     0     0     |     0000214  \0  \0  \0  \0
	*	*


Çà ¹øÈ£ -1Àº (od¸¦ ½ÇÇàÇÑ À§ÀÇ ¿¹¿¡¼­´Â À½¼ö¸¦ 2ÀÇ º¸¼ö·Î Ç¥ÇöÇÏ´Â ÄÄÇ»ÅÍÀÇ ¼öü°è¿¡ ÀÇÇؼ­ `1 32768''ÀÌ -1À» ÀǹÌÇÏ°Ô µÈ´Ù.) ¼Ò½º ÆÄÀÏÀÇ À̸§À» ³ªÅ¸³»±â À§Çؼ­ »ç¿ëÇϸç, .bb ÆÄÀÏÀ» ÆĽÌÇÒ ¶§ º¸´Ù ½Äº°À» ¿ëÀÌÇÏ°Ô Çϱâ À§Çؼ­ ³¡³ª´Â À§Ä¡¿¡µµ -1ÀÌ Çѹø ´õ Ç¥½ÃµÈ´Ù. À§ÀÇ Ãâ·Â ¿¹¿¡¼­ µÎ°³ÀÇ -1 (`1 32768') »çÀÌ¿¡ ÆÄÀÏÀÇ À̸§ÀÎ `tmp.c'°¡ ±â·ÏµÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. Çà ¹øÈ£ -2´Â (od¸¦ ½ÇÇàÇÑ À§ÀÇ ¿¹¿¡¼­´Â À½¼ö¸¦ 2ÀÇ º¸¼ö·Î Ç¥ÇöÇÏ´Â ÄÄÇ»ÅÍÀÇ ¼öü°è¿¡ ÀÇÇؼ­ `2 32768''ÀÌ -2¸¦ ÀǹÌÇÏ°Ô µÈ´Ù.) ÇÔ¼öÀÇ À̸§À» ³ªÅ¸³»±â À§Çؼ­ »ç¿ëµÇ¸ç, -1ÀÇ °æ¿ì¿Í ¸¶Âù°¡Áö·Î ³¡³ª´Â À§Ä¡¿¡ Çѹø ´õ Ç¥½ÃµÈ´Ù. ÀÌ ¼ýÀÚµéÀº ¸ðµÎ 4 ¹ÙÀÌÆ® Á¤¼ö·Î ±â·ÏµÈ´Ù. À§ÀÇ ¿¹¿¡¼­´Â `tmp.c' ÆÄÀÏ ¾È¿¡¼­ »ç¿ëµÈ µÎ°³ÀÇ ÇÔ¼öÀÎ main()°ú printf()¿¡ ÇØ´çÇÏ´Â À̸§ÀÌ ±â·ÏµÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

.bbg ÆÄÀÏÀº ¼Ò½º Äڵ忡 ´ëÇÑ ÇÁ·Î±×·¥ ÇÃ·Î¿ì ±×·¡ÇÁ¸¦ À籸¼ºÇϴµ¥ »ç¿ëµÈ´Ù. ÀÌ ÆÄÀÏÀº ÇϳªÀÇ ´ÜÀ§ ºí·ÏÀ¸·ÎºÎÅÍ ¹ß»ý °¡´ÉÇÑ ºÐ±âÀÎ arcsµéÀÇ ¸ñ·ÏÀ» ´ã°í ÀÖÀ¸¸ç .bb ÆÄÀÏ°ú ÇÔ²² »ç¿ëµÇ¾î gcov°¡ ÇÁ·Î±×·¥ ÇÃ·Î¿ì ±×·¡ÇÁ¸¦ ¸¸µé ¼ö ÀÖ°Ô ÇØÁØ´Ù. .bbg ÆÄÀÏÀÇ Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

       ù ¹ø° ÇÔ¼ö¸¦ ±¸¼ºÇÏ´Â ±âº» ºí·Ï(basic block)ÀÇ ¼ýÀÚ (4¹ÙÀÌÆ® Á¤¼ö)
       ù ¹ø° ÇÔ¼ö¸¦ ±¸¼ºÇÏ´Â arcsÀÇ ¼ýÀÚ (4¹ÙÀÌÆ® Á¤¼ö)
       ù ¹ø° ±âº» ºí·Ï ¾ÈÀÇ arcsÀÇ ¼ýÀÚ (4¹ÙÀÌÆ® Á¤¼ö)
       ù ¹ø° arcÀÇ µ¥½ºÆ¼³×ÀÌ¼Ç ±âº» ºí·Ï (4¹ÙÀÌÆ® Á¤¼ö)
       Ç÷¡±× ºñÆ® (4¹ÙÀÌÆ® Á¤¼ö)
       µÎ ¹ø° arcÀÇ µ¥½ºÆ¼³×ÀÌ¼Ç ±âº» ºí·Ï (4¹ÙÀÌÆ® Á¤¼ö)
       Ç÷¡±× ºñÆ® (4¹ÙÀÌÆ® Á¤¼ö)
       ...
       N¹ø° arcÀÇ µ¥½ºÆ¼³×ÀÌ¼Ç ±âº» ºí·Ï (4¹ÙÀÌÆ® Á¤¼ö)
       Ç÷¡±× ºñÆ® (4¹ÙÀÌÆ® Á¤¼ö)
       µÎ ¹ø° ±âº» ºí·Ï ¾ÈÀÇ arcsÀÇ ¼ýÀÚ (4¹ÙÀÌÆ® Á¤¼ö)
       ù ¹ø° arcÀÇ µ¥½ºÆ¼³×ÀÌ¼Ç ±âº» ºí·Ï (4¹ÙÀÌÆ® Á¤¼ö)
       Ç÷¡±× ºñÆ® (4¹ÙÀÌÆ® Á¤¼ö)
       ...

4¹ÙÀÌÆ® ¼ýÀÚ·Î ÀúÀåµÇ´Â -1Àº ´ÜÀ§ ºí·Ï ¾È¿¡ Æ÷ÇÔµÈ ÇÔ¼öµéÀ» ±¸º°ÇÏ´Â ½Äº°ÀÚ·Î »ç¿ëµÈ´Ù. ¶ÇÇÑ ÆÄÀÏÀÌ ¿Ã¹Ù¸£°Ô ÀÐÇôÁ³´Â Áö¸¦ °ËÁõÇϴµ¥ »ç¿ëµÇ±âµµ ÇÑ´Ù.

.da ÆÄÀÏÀº GNU CCÀÇ `-fprofile-arcs' ¿É¼ÇÀ¸·Î ÄÄÆÄÀÏµÈ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» Æ÷ÇÔÇÏ´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§ °¢°¢ÀÇ ¼Ò½º ÆÄÀϸ¶´Ù »ý¼ºµÈ´Ù. .da ÆÄÀÏÀº ¼Ò½º ÆÄÀÏÀÌ ÀÌ ¿É¼Ç°ú ÇÔ²² ½ÇÇàµÈ ÈÄ¿¡ ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ ÀÖ´Â À§Ä¡¿¡ ÀúÀåµÇ´Âµ¥, ¼Ò½º ÆÄÀÏÀÇ À̸§¿¡ .da¸¦ È®ÀåÀÚ·Î °®´Â À̸§ÀÌ »ç¿ëµÈ´Ù.

.da ÆÄÀÏÀÇ Æ÷¸ËÀº ¸Å¿ì °£´ÜÇÏ´Ù.

      $ od -w4 -d tmp.da
	0000000     7     0     0     0
	0000010     1     0     0     0
	0000020    10     0     0     0
	0000030     1     0     0     0
	0000040     0     0     0     0
	0000050     1     0     0     0
	*
	0000100

óÀ½ 8¹ÙÀÌÆ®, Áï ù ¹ø° ¼ýÀÚÀÎ 7Àº ÆÄÀÏ ¾È¿¡ ÀÖ´Â Ä«¿îÅÍÀÇ °¹¼ö¸¦ ÀǹÌÇÑ´Ù. À̾îÁö´Â 8¹ÙÀÌÆ® ´ÜÀ§ÀÇ ¼ýÀÚµéÀº ÇÁ·Î±×·¥ ¾È¿¡¼­ °¢°¢ÀÇ arcsµéÀÌ ½ÇÇàµÈ Ƚ¼öÀÌ´Ù. (gcov.c ¼Ò½º ÆÄÀÏ ÂüÁ¶) Ä«¿îÅ͵éÀº .gcov ÆÄÀÏ°ú ¸¶Âù°¡Áö·Î °á°ú°¡ ´©ÀûµÇ´Â ÇüŸ¦ °®°í ÀÖ´Ù. µû¶ó¼­ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§¸¶´Ù Ä«¿îÅ͵éÀº ±âÁ¸ÀÇ °ª¿¡ »õ·Î¿î °ªÀÌ Ãß°¡µÇ´Â ÇüŸ¦ ¶ì°Ô µÈ´Ù. ¸¸¾à, .da ÆÄÀÏÀÇ ³»¿ëÀÌ ÇÁ·Î±×·¥ÀÇ arcs Á¤º¸¿Í ´Ù¸¦ °æ¿ì¿¡´Â ±âÁ¸ÀÇ ³»¿ëÀº ¹«½ÃµÇ°í ³»¿ëÀÌ »õ·Ó°Ô »ý¼ºµÈ´Ù. Áï, ¼Ò½º°¡ ¼öÁ¤µÉ °æ¿ì¿¡´Â ¼öÁ¤µÈ ¼Ò½º·Î ¸¸µé¾îÁø ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ ½ÇÇàµÉ ¶§ .da ÆÄÀÏÀÇ ³»¿ë ¶ÇÇÑ ÀÚµ¿À¸·Î º¯°æµÈ´Ù.

.bb¿Í .bbg ±×¸®°í .da ¼¼ °³ÀÇ ÆÄÀϵéÀº Á¤¼öÇü ÀڷḦ ÀúÀåÇϱâ À§Çؼ­ ¸ðµÎ gcov-io.h Çì´õ ÆÄÀÏ¿¡ Á¤ÀÇµÈ ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥, ÀÌ Çì´õ ÆÄÀÏ¿¡ Æ÷ÇԵǾî ÀÖ´Â ÇÔ¼öµéÀº ¾ÆÅ°ÅØó¿¡ ¹«°üÇÏ°Ô ÀÔÃâ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÀúÀåÇÏ°í °Ë»öÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù.


¸ñÂ÷, ¿µ¹®