gcov
: Å×½ºÆ® Ä¿¹ö¸®Áö ÇÁ·Î±×·¥
gcov
´Â GNU CC¿Í ÇÔ²² »ç¿ëÇؼ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÄÚµå Ä¿¹ö¸®Áö(code coverage) Å×½ºÆ®¸¦
¼öÇàÇÒ ¼ö ÀÖ´Â µµ±¸ÀÌ´Ù. ÀÌ Àå¿¡¼´Â gcov
¹öÀü 1.5¸¦ ´ë»óÀ¸·Î ´ÙÀ½°ú °°Àº »çÇ×µéÀ» ¼³¸íÇÑ´Ù.
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 [-b] [-c] [-v] [-n] [-l] [-f] [-o µð·ºÅ丮À̸§] ¼Ò½ºÆÄÀÏÀ̸§
-b
-c
-v
-n
-l
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
¸¦ ÀÌ¿ëÇؼ ÃÖÀûȽÃÅ°·Á°í ÇÑ´Ù¸é, ¸ÕÀú 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
´Â ÇÁ·ÎÆÄÀϸµÀ» À§Çؼ ¼¼ °³ÀÇ ÆÄÀÏÀ» »ç¿ëÇϴµ¥, ÀÌ ÆÄÀϵéÀÇ À̸§Àº ¿ø·¡ÀÇ ¼Ò½º ÆÄÀÏÀÌ
°®°í ÀÖ´ø À̸§¿¡ .bb
(Basic Block)¿Í .bbg
(Basic Block Graph)
±×¸®°í .da
(DAta)¸¦ È®ÀåÀÚ·Î
ºÙÀÎ °ÍÀÌ´Ù. ÀÌ ÆÄÀϵéÀº ¼Ò½º ÆÄÀÏÀÌ ÀÖ´ø µð·ºÅ丮¿¡ »ý¼ºµÇ¸ç Ç÷§Æû¿¡ µ¶¸³ÀûÀÎ ÇüÅ·Î
µ¥ÀÌÅ͸¦ ÀúÀåÇÏ°í ÀÖ´Ù.
.bb
¿Í .bbg
ÆÄÀÏÀº ¼Ò½º ÆÄÀÏÀ» `-ftest-coverage' ¿É¼Ç°ú ÇÔ²²
GNU CC·Î ÄÄÆÄÀÏÇÒ ¶§ »ý¼ºµÈ´Ù.
.bb
ÆÄÀÏÀº Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇÑ ¼Ò½º ÆÄÀϵéÀÇ ¸ñ·Ï°ú ÀÌ ÆÄÀÏ ¾È¿¡ Æ÷ÇÔµÈ ÇÔ¼öµéÀÇ ¸ñ·ÏÀ» ´ã°í ÀÖ´Ù.
¶ÇÇÑ ¼Ò½º ÆÄÀÏ ¾ÈÀÇ ´ÜÀ§ ºí·Ïµé¿¡ ´ëÀÀµÇ´Â Çà ¹øÈ£¸¦ ´ã°í ÀÖ´Ù.
4¹ÙÀÌÆ® ¼ýÀÚ·Î ÀúÀåµÇ´Â -1Àº ´ÜÀ§ ºí·Ï ¾È¿¡ Æ÷ÇÔµÈ ÇÔ¼öµéÀ» ±¸º°ÇÏ´Â ½Äº°ÀÚ·Î »ç¿ëµÈ´Ù.
¶ÇÇÑ ÆÄÀÏÀÌ ¿Ã¹Ù¸£°Ô ÀÐÇôÁ³´Â Áö¸¦ °ËÁõÇϴµ¥ »ç¿ëµÇ±âµµ ÇÑ´Ù.
óÀ½ 8¹ÙÀÌÆ®, Áï ù ¹ø° ¼ýÀÚÀÎ 7Àº ÆÄÀÏ ¾È¿¡ ÀÖ´Â Ä«¿îÅÍÀÇ °¹¼ö¸¦ ÀǹÌÇÑ´Ù.
À̾îÁö´Â 8¹ÙÀÌÆ® ´ÜÀ§ÀÇ ¼ýÀÚµéÀº ÇÁ·Î±×·¥ ¾È¿¡¼ °¢°¢ÀÇ arcsµéÀÌ ½ÇÇàµÈ Ƚ¼öÀÌ´Ù.
(
.bb
ÆÄÀÏÀÇ Çü½ÄÀº ¼Ò½º ÆÄÀÏÀ» ±¸¼ºÇÏ°í ÀÖ´Â ´ÜÀ§ ºí·ÏµéÀÇ ½ÃÀÛ À§Ä¡¸¦ ³ªÅ¸³»´Â Çà ¹øÈ£¿¡
ÇØ´çÇÏ´Â 4¹ÙÀÌÆ® Á¤¼öµéÀÇ ¸ñ·ÏÀ¸·Î ±¸¼ºµÇ¾î Àִµ¥, °¢°¢ÀÇ ¸ñ·ÏµéÀº Çà ¹øÈ£ 0À¸·Î ±¸ºÐµÈ´Ù.
¿¹Á¦·Î »ç¿ëµÈ `tmp.c'·ÎºÎÅÍ »ý¼ºµÈ `tmp.bb' ÆÄÀÏ°ú ¹ÙÀ̳ʸ® Á¤º¸¸¦ Ãâ·ÂÇØ
ÁÙ ¼ö ÀÖ´Â .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¹ÙÀÌÆ® Á¤¼ö)
...
.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
gcov.c ¼Ò½º ÆÄÀÏ ÂüÁ¶
)
Ä«¿îÅ͵éÀº .gcov
ÆÄÀÏ°ú ¸¶Âù°¡Áö·Î °á°ú°¡ ´©ÀûµÇ´Â ÇüŸ¦ °®°í ÀÖ´Ù.
µû¶ó¼ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§¸¶´Ù Ä«¿îÅ͵éÀº ±âÁ¸ÀÇ °ª¿¡ »õ·Î¿î °ªÀÌ Ãß°¡µÇ´Â
ÇüŸ¦ ¶ì°Ô µÈ´Ù. ¸¸¾à, .da
ÆÄÀÏÀÇ ³»¿ëÀÌ ÇÁ·Î±×·¥ÀÇ arcs Á¤º¸¿Í ´Ù¸¦
°æ¿ì¿¡´Â ±âÁ¸ÀÇ ³»¿ëÀº ¹«½ÃµÇ°í ³»¿ëÀÌ »õ·Ó°Ô »ý¼ºµÈ´Ù. Áï, ¼Ò½º°¡ ¼öÁ¤µÉ
°æ¿ì¿¡´Â ¼öÁ¤µÈ ¼Ò½º·Î ¸¸µé¾îÁø ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ ½ÇÇàµÉ ¶§ .da
ÆÄÀÏÀÇ
³»¿ë ¶ÇÇÑ ÀÚµ¿À¸·Î º¯°æµÈ´Ù.
.bb
¿Í .bbg
±×¸®°í .da
¼¼ °³ÀÇ ÆÄÀϵéÀº Á¤¼öÇü ÀڷḦ ÀúÀåÇϱâ À§Çؼ ¸ðµÎ
gcov-io.h
Çì´õ ÆÄÀÏ¿¡ Á¤ÀÇµÈ ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥,
ÀÌ Çì´õ ÆÄÀÏ¿¡ Æ÷ÇԵǾî ÀÖ´Â ÇÔ¼öµéÀº ¾ÆÅ°ÅØó¿¡ ¹«°üÇÏ°Ô ÀÔÃâ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦
ÀúÀåÇÏ°í °Ë»öÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù.
¸ñÂ÷, ¿µ¹®