óÀ½, ÀÌÀü, ´ÙÀ½, ¸¶Áö¸· ¼½¼Ç, ¸ñÂ÷


ÇÁ·ÎÆÄÀϸµÀÇ ¾ÈÂÊ

ÇÁ·ÎÆÄÀϸµÀÇ ±¸Çö¹æ¹ý

ÇÁ·ÎÆÄÀϸµÀÇ µ¿ÀÛ ¿ø¸®´Â ÇÁ·Î±×·¥³»¿¡ ÀÖ´Â °¢°¢ÀÇ ÇÔ¼öµéÀÌ È£ÃâµÉ ¶§, È£ÃâµÈ ÁöÁ¡¿¡ ´ëÇÑ Á¤º¸µéÀ» º¸°üÇصεµ·Ï ¿ø·¡ Äڵ忡 ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ ³»ºÎ ÇÔ¼ö¸¦ Ãß°¡µÈ Äڵ带 ¸¸µé°í ÀÌ Äڵ带 ´Ù½Ã ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÇÏ´Â °ÍÀÌ´Ù. ÇÔ¼ö È£Ãâ½Ã¿¡ º¸°üµÇ´Â Á¤º¸¸¦ »ç¿ëÇÏ¿© ÇÁ·ÎÆÄÀÏ·¯´Â ¾î¶² ÇÔ¼ö°¡ È£ÃâµÇ¾ú´ÂÁö, ¸î ¹øÀ̳ª È£ÃâµÇ¾ú´Â Áö¸¦ ¾Ë¾Æ³»°Ô µÈ´Ù.  ÄÄÆÄÀÏ·¯ÀÇ  `-pg' ¿É¼ÇÀ» »ç¿ëÇϸé ÄÄÆÄÀÏ·¯´Â ÇÁ·Î±×·¥³»ÀÇ ¸ðµç ÇÔ¼ö¿¡ ÇÁ·ÎÆÄÀϸµ¿ë ³»ºÎ ÇÔ¼ö -mcount : ¿î¿µÃ¼Á¦³ª ÄÄÆÄÀÏ·¯ÀÇ ¹öÀü¿¡ µû¶ó _mcount, ¶Ç´Â __mcount·Î À̸§ÀÌ ¹Ù²ð ¼öµµ ÀÖÀ½ -¿¡ ´ëÇÑ È£ÃâÀ» ÃÖÃÊÀÇ µ¿ÀÛÁß Çϳª·Î »ðÀÔÇÑ´Ù.

ÇÁ·ÎÆÄÀϸµ ¶óÀ̺귯¸®¿¡ Æ÷ÇԵǾî ÀÖ´Â mcount ·çƾÀº ¸Þ¸ð¸®»óÀÇ call graph table¿¡ ÀÚ½ÅÀÇ parent routine, child routine°ú parent's parent routinÀ» ±â·ÏÇÑ´Ù. ÀÌ·¯ÇÑ °úÁ¤Àº ÀϹÝÀûÀ¸·Î childÀÇ ÁÖ¼Ò¿Í original parent³»¿¡ ÀÖ´Â return address¸¦  Ã£±â À§ÇÑ ½ºÅà ÇÁ·¹ÀÓ(stack frame) °Ë»ç¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù. ±×·¯³ª ÀÌ·¯ÇÑ °úÁ¤¿¡¼­ »ç¿ëµÇ´Â ¿¬»êµéÀº ¸Ó½®¿¡ µû¶ó ´Ù¸£±â ¶§¹®¿¡, ´ëºÎºÐ mcount ·çƾ ÀÚü´Â ÇÊ¿äÇÑ Á¤º¸¸¦ ÃßÃâÇÑ ÈÄ, frompc, selfpc ÀÎÀÚ¸¦ »ç¿ëÇÏ¿© ÀÏ¹Ý CÇÔ¼öÀÎ __mcount_internal ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï ÄÚµùµÈ short assembly-language stub routineÀÌ´Ù. mcount ·çƾ³»ºÎ¿¡¼­ È£ÃâµÇ´Â __mcount_internal ÇÔ¼ö´Â ¸Þ¸ð¸®»óÀÇ call graph¸¦ °ü¸®ÇÑ´Ù. call graph´Â __mcount_internal ÇÔ¼ö¿¡¼­ ÀÎÀÚ·Î ¹ÞÀº i) frompc, selfpc¿Í  ii) call arcs °¢°¢¿¡ ´ëÇÑ traversal Ƚ¼ö¸¦ ±â·ÏÇÑ´Ù.

GCC version 2¿¡¼­´Â ½ºÅà ÇÁ·¹ÀÓ¿¡¼­ ÇÁ·ÎÆÄÀϸµ¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ÃßÃâÇÏ´Â ¹ü¿ë mcount ÇÔ¼ö¸¦ °¡´ÉÄÉÇÏ´Â __builtin_return_addressÇÔ¼ö°¡ Á¦°øµÈ´Ù. ±×·¯³ª ÀϺΠÄÄÇ»ÅÍ, ƯÈ÷ SPARC ¸Ó½®¿¡¼­ __builtin_return_addressÇÔ¼ö´Â ¸¹Àº computationÀ» ÇÊ¿ä·Î Çϱ⠶§¹®¿¡ ¼º´É»óÀÇ ÀÌÀ¯·Î ¾î¼Àºí¸® ¹öÀüÀÇ mcount °¡ »ç¿ëµÈ´Ù.

¶óÀ̺귯¸® ·çƾ¿¡ ´ëÇÑ È£Ãâ Ƚ¼ö Á¤º¸´Â ÇÁ·ÎÆÄÀϸµ¿ë C¶óÀ̺귯¸®(`-lc_p' ¿É¼Ç¿¡ ÀÇÇØ ÁöÁ¤µÇ´Â libc_p.a)-¿¡¼­ ¼öÁýµÈ´Ù. ÇÁ·ÎÆÄÀϸµ¿ë C¶óÀ̺귯¸®´Â `-pg' ¿É¼ÇÀ¸·Î ÄÄÆÄÀÏÇÑ´Ù´Â Á¡À» Á¦¿ÜÇÏ°í´Â ÀÏ¹Ý C¶óÀ̺귯¸®¿Í µ¿ÀÏÇÏ´Ù. ÇÁ·Î±×·¥ ¸µÅ©½Ã¿¡ `gcc ... -pg' ¿É¼ÇÀ» »ç¿ëÇϸé ÀÚµ¿À¸·Î ÇÁ·ÎÆÄÀϸµ¿ë C¶óÀ̺귯¸®¿Í ¸µÅ©µÈ´Ù.

ÇÁ·ÎÆÄÀϸµ¿¡´Â ÇÁ·Î±×·¥ ¼öÇàÀ» °¨½ÃÇÏ°í, ÇÁ·Î±×·¥ Ä«¿îÅÍ(PC: program counter)°¡ ¹ß»ýÇÏ´Â ÁöÁ¡ÀÇ È÷½ºÅä±×·¥À» À¯ÁöÇÏ´Â ÀÛ¾÷ÀÌ Æ÷ÇԵȴÙ.. ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ Åë»ó 1ÃÊ¿¡ 100ȸÁ¤µµ ÇÁ·Î±×·¥ Ä«¿îÅ͸¦ °Ë»çÇÑ´Ù. ±×·¯³ª ÇÁ·Î±×·¥ Ä«¿îÅÍÀÇ Á¤È®ÇÑ °Ë»ç ºóµµ´Â ½Ã½ºÅÛ¸¶´Ù ´Þ¶óÁú ¼ö ÀÖ´Ù.

ÇÁ·Î±×·¥ Ä«¿îÅÍÀÇ °Ë»ç´Â ´ÙÀ½¿¡ ¼³¸íÇÒ µÎ°¡Áö ¹æ½ÄÁß Çϳª¸¦ »ç¿ëÇÑ´Ù. ´ëºÎºÐÀÇ À¯´Ð½º °è¿­ ¿î¿µÃ¼Á¦¿¡¼­´Â memory array¸¦ scale factor¿Í ÇÔ²² Ä¿³Î¿¡ µî·ÏÇÏ´Â profil() ½Ã½ºÅÛ ÄÝÀÌ Á¦°øµÈ´Ù( scale factor¿¡ ÀÇÇØ ÇÁ·Î±×·¥ÀÇ ÁÖ¼Ò °ø°£ÀÌ ¾î¶»°Ô memory array¿¡ ¸ÅÇεÉÁö °áÁ¤µÈ´Ù). ÀϹÝÀûÀÎ scaling°ªÀº ÁÖ¼Ò°ø°£ÀÇ 2¿¡¼­ 8¹ÙÀÌÆ®¸¶´Ù ÇϳªÀÇ memory array slot¿¡ ¸ÊÇÎÇÑ´Ù. ÇÁ·ÎÆÄÀϸµ ±â´ÉÀÌ Ãß°¡µÈ ÇÁ·Î±×·¥ÀÇ ½ÇÇà½Ã, ½Ã½ºÅÛ Å¬·° ƽ¸¶´Ù, ÇÁ·Î±×·¥ Ä«¿îÅÍÀÇ °ªÀ» °Ë»çÇÏ¿© memory array³»ÀÇ ´ëÀÀÇÏ´Â slotÀ» Áõ°¡½ÃŲ´Ù. ÀÌ·¯ÇÑ ÀÏ·ÃÀÇ ÀÛ¾÷Àº Ä¿³Î¿¡¼­ ¼öÇàµÇ±â ¶§¹®¿¡, ¾à°£ÀÇ ½Ã½ºÅÛ ¿À¹öÇìµå¸¦ °¡Áö°Ô µÈ´Ù( Ä¿³ÎÀº clock interrupt¸¦ ó¸®Çϱâ À§ÇÏ¿© ÇÁ·Î¼¼½º¸¦ ÀÎÆ®·´Æ®Çϴµ¥ ÀÌ ºÎºÐÀÌ ¿À¹öÇìµå·Î ÀÛ¿ëÇÑ´Ù).

±×·¯³ª ÀϺΠ¿î¿µÃ¼Á¦- ƯÈ÷ Linux 2.0 ¶Ç´Â ±× ÀÌÀü ¹öÀü -¿¡¼­´Â profil() ½Ã½ºÅÛ ÄÝÀÌ Á¦°øµÇÁö ¾Ê´Â´Ù. profil() ½Ã½ºÅÛ ÄÝÀÌ Á¦°øµÇÁö ¾Ê´Â ¿î¿µÃ¼Á¦¿¡¼­´Â Ä¿³ÎÀÌ setitimer()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÁÖ±âÀûÀ¸·Î ÇÁ·Î¼¼½º¿¡ ÇÁ·ÎÆÄÀϸµ ½Ã±×³ÎÀ» Àü´ÞÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù. ÇÁ·ÎÆÄÀϸµ ½Ã±×³ÎÀÌ ÇÁ·Î±×·¥ Ä«¿îÅ͸¦ °Ë»çÇÏ°í memory array³»¿¡ ÀÖ´Â slotÀ» Áõ°¡½ÃŲ´Ù. ÀÌ ¹æ¹ýÀº »ùÇøµÇÒ ¶§¸¶´Ù user space¿¡ ½Ã±×³ÎÀ» Àü´ÞÇÏ¿©¾ß Çϱ⠶§¹®¿¡, Ä¿³Î ±â¹ÝÀÇ ÇÁ·ÎÆÄÀϸµº¸´Ù ¿À¹öÇìµå°¡ ¸¹¾ÆÁö°Ô µÈ´Ù. ¶ÇÇÑ ½Ã±×³Î Àü´Þ¿¡ µû¸¥ ½Ã°£ Áö¿¬À¸·Î ÀÎÇØ, Á¤È®µµ°¡ ´Ù¼Ò ¶³¾îÁö´Â ´ÜÁ¡µµ ÀÖ´Ù.

startup routine monstartup Àº ¸ÕÀú È÷½ºÅä±×·¥¿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í, À§¿¡¼­ ¼³¸íÇÑ profil() ÇÔ¼ö¸¦ È£ÃâÇϰųª ¶Ç´Â Ŭ·° ½Ã±×³Î Çڵ鷯(clock signal handler)¸¦ ¼³Á¤ÇÏ´Â ¹æ½ÄÁß Çϳª¸¦ »ç¿ëÇÏ¿© ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ ÀÛ¾÷À» °³½ÃÇÑ´Ù. monstartup Àº ¿©·¯ °¡Áö ¹æ½ÄÀ¸·Î È£ÃâµÉ ¼ö ÀÖ´Ù. Linux ½Ã½ºÅÛÀÇ °æ¿ì, ÇÁ·ÎÆÄÀϸµ ±â´ÉÀ» È°¼ºÈ­ÇÏ¿© ÄÄÆÄÀÏÇϸé ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â startup fileÀÎ crt0.o ´ë½Å¿¡ ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ startup fileÀÎ gcrt0.o ¸¦ »ç¿ëÇÑ´Ù. gcrt0.o´Â ¸ÕÀú monstartup¸¦ È£ÃâÇÏ°í ´ÙÀ½¿¡ main À» È£ÃâÇÑ´Ù. ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ startup file gcrt0.o °¡ »ç¿ëµÇ°Ô ÇÏ·Á¸é ¸µÅ©½Ã¿¡ `gcc ... -pg' ¸¦ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù. SPARC ½Ã½ºÅÛÀÇ °æ¿ì¿¡´Â Ưº°ÇÑ startup·çƾÀÌ »ç¿ëµÇÁö´Â ¾Ê°í, ´ë½Å¿¡ ´ë°³´Â main ÀÌ È£ÃâµÇ¾úÀ» ¶§ óÀ½À¸·Î È£ÃâµÇ´Â ·çƾ mcount ÇÔ¼ö¿¡¼­ monstartup À» È£ÃâÇÑ´Ù.

ÄÄÆÄÀÏ·¯ÀÇ `-a' ¿É¼ÇÀÌ »ç¿ëµÈ °æ¿ì, ±âº» ºí·Ï Ä«¿îÆà ±â´Éµµ È°¼ºÈ­µÇ°í, °¢°¢ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀº  ÃʱⰪÀ» 0·Î ÇÏ´Â Ä«¿îÆ®µéÀÇ Á¤Àû ¹è¿­(static array of counts)°ú ÇÔ²² ÄÄÆÄÀϵȴÙ. ½ÇÇàÄÚµå ³»ºÎ¿¡´Â »õ·Î¿î ±âº» ºí·ÏÀÌ ½ÃÀÛÇÒ ¶§ ¸¶´Ù (Áï, if ¹®ÀÌ ³ªÅ¸³¯ ¶§¸¶´Ù), ±× À§Ä¡¿¡ ¹è¿­³»ÀÇ ÇØ´ç Ä«¿îÆ®¸¦ Áõ°¡½ÃÅ°´Â ÀνºÆ®·°¼ÇµéÀÌ »ðÀԵȴÙ.  ÄÄÆÄÀÏ ½Ã¿¡ °¢°¢ÀÇ ±âº» ºí·ÏÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ ±â·ÏÇϱâ À§ÇÑ ÁÖ¼ÒÀÇ ½ÖÀ» ¿ø¼Ò·Î ÇÏ´Â ¹è¿­(paired array)ÀÌ ¸¸µé¾îÁø´Ù. À̵é ÀڷᱸÁ¶µé- ¿ÀºêÁ§Æ®È­ÀÏ¿¡ ±âº» ºí·Ï Ä«¿îÆÃÀ» À§ÇØ Ãß°¡µÈ Á¤Àû ¹è¿­°ú ÄÄÆÄÀϽÿ¡ ±âº» ºí·ÏÀÇ ÁÖ¼Ò¸¦ ±â·ÏÇϱâ À§ÇØ ¸¸µé¾îÁø ÁÖ¼ÒÀÇ ½ÖÀ» ¿ø¼Ò·Î ÇÏ´Â ¹è¿­-À» ÅëÇØ ±âº» ºí·ÏÀÌ ½ÇÇàµÈ Ƚ¼ö¿Í ±âº» ºí·ÏÀÇ ÁÖ¼Ò¸¦ ±â·ÏÇÏ°Ô µÈ´Ù.

ÇÁ·ÎÆÄÀϸµ ¶óÀ̺귯¸®¿¡´Â cleanup routine mcleanupÀÌ Æ÷ÇԵǾî ÀÖ´Ù. cleanup routine mcleanupÀº ´ë°³ ÇÁ·Î±×·¥ Á¾·á½Ã¿¡ ÀÚµ¿À¸·Î È£ÃâµÇµµ·Ï atexit() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© µî·ÏµÈ´Ù. mcleanup Àº ¸Þ¸ð¸®»ó¿¡ ÀÖ´Â ÇÁ·ÎÆÄÀϸµ °ü·Ã Á¤º¸¸¦ `gmon.out' ÆÄÀÏ¿¡ ±â·ÏÇÏ´Â ÀÏÀ» ¼öÇàÇÑ´Ù. ÇÁ·ÎÆÄÀϸµÀÌ ´Ù ³¡³ª¸é ¿©·¯ °¡Áö Çì´õµéÀÌ Ãâ·ÂµÇ°í, È÷½ºÅä±×·¥ÀÌ ±â·ÏµÇ¸ç, ¸¶Á÷¸·À¸·Î call graph arc¿Í ±âº» ºí·Ï Ä«¿îÆÃÀÌ Ãâ·ÂµÇ°Ô µÈ´Ù.

gprof ¿¡¼­ ³ª¿Â Ãâ·ÂÀ» ÅëÇؼ­ ÇÁ·Î±×·¥³»ÀÇ ¾î¶² ºÎºÐÀÌ I/O¶Ç´Â swapping bandwidth·Î ÀÎÇØ Á¦ÇÑÀ» ¹Þ°í ÀÖ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë ¼ö´Â ¾ø´Ù. ÀÌ´Â ÇÁ·Î±×·¥ Ä«¿îÅÍÀÇ »ýÇõéÀÌ ÇÁ·Î±×·¥ ½ÇÇàÁß(In run state)¿¡ °íÁ¤µÈ °£°ÝÀ¸·Î ¼öÁýµÇ¾ú±â ¶§¹®ÀÌ´Ù. µû¶ó¼­ gprof Ãâ·Â³»¿¡ ÀÖ´Â ½Ã°£ ÃøÁ¤°ªµé¿¡´Â ÇÁ·Î±×·¥ÀÌ swappingÀ̳ª I/O¶Ç´Â ÇÁ·Î¼¼½º ½ºÄÉÁ층¿¡ ÀÇÇØ ½ÇÇà »óÅ¿¡ ÀÖÁö ¾ÊÀ» ¶§( not in run )ÀÇ ½Ã°£¿¡ ´ëÇÑ Á¤º¸´Â Çϳªµµ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù.  ¿¹¸¦ µé¾î, ÇÁ·Î±×·¥ÀÇ Æ¯Á¤ ºÎºÐ¿¡¼­ ¹°¸®Àû ¸Þ¸ð¸®º¸´Ù Å« ¾çÀÇ µ¥ÀÌÅ͸¦ ¸¸µé¾î ³¾ °æ¿ì¿¡´Â thrashingÀ¸·Î ÀÎÇØ »ó´çÈ÷ ´À·Á Áú ¼ö °¡ ÀÖ´Ù. ±×·¯³ª gprof ¿¡¼­´Â thrashingÀ¸·Î ÀÎÇØ ´À·ÁÁ³´ø ±â°£À» ¾ÆÁÖ ÂªÀº ½Ã°£À¸·Î º¸°íÇÒ ¼öµµ ÀÖ´Ù. ÇÑÆí, ½ÇÇà ½Ã°£¿¡ µû¸¥ »ùÇøµÀº ½Ã½ºÅÛ³»ÀÇ ´Ù¸¥ »ç¿ëÀڵ鿡 ÀÇÇØ ¹ß»ýÇÑ ·Îµå¿¡ ÀÇÇØ ÇÁ·ÎÆÄÀϸµ Ãâ·Â °á°ú°¡ Á÷Á¢ÀûÀÎ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.

ÇÁ·ÎÆÄÀϸµ µ¥ÀÌÅÍ ÆÄÀÏ Æ÷¸Ë (Profiling Data File Format)

ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ¿¡ »ç¿ëµÇ¾ú´ø ÀÌÀü BSD°è¿­ÀÇ ÆÄÀÏ Æ÷¸ËÀº data fileÀÌ gprof fileÀÎÁö¸¦ °Ë»çÇϴµ¥ »ç¿ëÇÏ´Â magic cookie°¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù. ¶ÇÇÑ ÀÌ Æ÷¸Ë¿¡´Â ¹öÀü ¹øÈ£(version number)¸¦ °¡Áö°í ÀÖÁö ¾Ê¾Ò±â ¶§¹®¿¡, ÆÄÀÏ Æ÷¸ËÀ» º¯°æÇϱⰡ ºÒ°¡´ÉÇÏ¿´´Ù. GNU gprof ´Â magic cookie¿Í ¹öÀü ¹øÈ£(version number)¸¦ ¸ðµÎ Á¦°øÇÏ´Â »õ·Î¿î ÆÄÀÏ Æ÷¸ËÀ» »ç¿ëÇÑ´Ù. ÀÌÀü ¹öÀü°úÀÇ È£È¯¼ºÀ» À§Çؼ­ GNU gprof °¡ °è¼ÓÇؼ­ ÀÌÀü BSD°è¿­ÀÇ Æ÷¸ËÀ» Áö¿øÇϱâ´Â ÇÏÁö¸¸ ¸ðµç ±â´ÉÀÌ Á¦°øµÇ´Â °ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î, ±âº» ºí·Ï ½ÇÇà Ä«¿îÆ®¿Í °°Àº ±â´ÉÀº ÀÌÀü ÆÄÀÏ Æ÷¸ËÀ¸·Î´Â Ç¥ÇöÇÒ ¼ö ¾ø´Ù.

GNU gprof ¿¡¼­ »ç¿ëÇÏ´Â »õ·Î¿î ÆÄÀÏ Æ÷¸ËÀº `gmon_out.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù. »õ·Î¿î ÆÄÀÏ Æ÷¸ËÀº ÃßÈÄ È®ÀåÀ» À§ÇÑ ¿¹ºñ ¹ÙÀÌÆ®µé°ú magic cookie¿Í ¹öÀü ¹øÈ£¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â Çì´õ·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ ÆÄÀϳ»¿¡ ÀÖ´Â ¸ðµç µ¥ÀÌÅÍ´Â ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ°¡ ¼öÁýµÈ È£½ºÆ®ÀÇ ¾ÆÅ°ÅØÃĸ¦ µû¸£´Â Æ÷¸ËÀ¸·Î µÇ¾îÀÖ´Ù. GNU gprof Àº ÇØ´ç È£½ºÆ®ÀÇ ¾ÆÅ°ÅØÃÄ¿¡¼­ »ç¿ëÁßÀÎ byte-order¿¡ ÀÚµ¿À¸·Î ¸ÂÃá´Ù.

»õ·Î¿î ÆÄÀÏ Æ÷¸Ë¿¡¼­´Â Çì´õ, ·¹ÄÚµåÀÇ ¼øÀ¸·Î Ãâ·ÂµÈ´Ù. ÇöÀç´Â ¼¼ °³ÀÇ ¼­·Î ´Ù¸¥ ·¹ÄÚµå ŸÀÔ- È÷½ºÅä±×·¥ ·¹ÄÚµå, call-graph arc ·¹ÄÚµå, ±âº» ºí·Ï ½ÇÇà Ä«¿îÆ® ·¹ÄÚµå- ÀÌ ÀÖ´Ù. °¢°¢ÀÇ ÇÁ·ÎÆÄÀϸµ µ¥ÀÌÅÍ ÆÄÀÏÀº ÀÓÀÇ °¹¼ö°³ÀÇ ·¹ÄÚµå ŸÀÏÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. GNU gprof ´Â ÇÁ·ÎÆÄÀϸµ µ¥ÀÌÅÍ ÆÄÀÏÀ» ÀоîµéÀÎÈÄ,µ¿ÀÏÇÑ Å¸ÀÔÀÇ ·¹ÄÚµåµé³¢¸® ¼­·Î ȣȯ¼ºÀÌ ÀÖ´ÂÁö¸¦ È®ÀÎÇÏ°í ¸ðµç ·¹ÄÚµåµéÀÇ ÇÕÁýÇÕÀ» ±¸ÇÑ´Ù. ¿¹¸¦ µé¾î, ±âº» ºí·Ï Ä«¿îÆ® ·¹ÄÚµå ŸÀÔÀÇ °æ¿ì, ÀÌµé ·¹ÄÚµåÀÇ ÇÕÁýÇÕÀº ¸ðµç ±âº» ºí·ÏÀÇ ½ÇÇà Ä«¿îÆ®ÀÇ ´Ü¼ø ÇÕÀÌ´Ù.

È÷½ºÅä±×·¥ ·¹ÄÚµå (Histogram Records)

È÷½ºÅä±×·¥ ·¹ÄÚµå´Â Çì´õ¿Í binsÀÇ ¹è¿­·Î ±¸¼ºµÈ´Ù. Çì´õ¿¡´Â È÷½ºÅä±×·¥ÀÌ Ã¤¿öÁö´Â text-segment range, ¹ÙÀÌÆ® ´ÜÀ§ÀÇ È÷½ºÅä±×·¥ Å©±â(±¸Çü BSDÆ÷¸Ë°ú ´Þ¸®, ÀÌ Å©±â¿¡´Â Çì´õÀÇ Å©±â´Â Æ÷ÇÔµÇÁö ¾Ê´Â´Ù), ÇÁ·ÎÆÄÀϸµ Ŭ·°ÀÇ ¼Óµµ, ÇÁ·ÎÆÄÀϸµ Ŭ·° ¼Óµµ¿¡ µû¶ó ½ºÄÉÀÏµÈ ÈÄ¿¡ bin Ä«¿îÆ®µéÀÌ ³ªÅ¸³»´Â ¹°¸®Àû ´ÜÀ§(physical dimension)°¡ Æ÷ÇԵǾî ÀÖ´Ù.  ¹°¸®Àû ´ÜÀ§´Â ÃÖ´ë 15°³ÀÇ ¹®ÀÚ·Î ±¸¼ºµÈ À̸§°ú 1°³ÀÇ ¹®ÀÚ·ÎµÈ ¾àÀڷΠǥ½ÃµÈ´Ù. ¿¹¸¦ µé¾î, ½Ç½Ã°£(real-time)À» ³ªÅ¸³»´Â È÷½ºÅä±×·¥Àº ½ÇÁ¦ ¼öÄ¡ ´ÜÀ§ À̸§À¸·Î "seconds", ½ÇÁ¦ ¼öÄ¡ ´ÜÀ§ÀÇ ¾àÀÚ·Î "s"·Î Ç¥½ÃÇÑ´Ù.  ÀÌ ±â´ÉÀº ¼º´É ¸ð´ÏÅÍ Çϵå¿þ¾î(performance monitor hardware)¸¦ Áö¿øÇÏ´Â ¾ÆÅ°ÅØÃÄ¿¡¼­ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Ù.  ¿¹¸¦ µé¾î, DEC OSF/1¿¡¼­´Â "uprofile" ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ÀνºÆ®·°¼ÇÀÇ Ä³½¬ ¹Ì¾²¿¡ ´ëÇÑ È÷½ºÅä±×·¥À» ¸¸µé ¼ö ÀÖ´Ù. ÀÌ °æ¿ì, È÷½ºÅä±×·¥ Çì´õ¿¡ ÀÖ´Â ½ÇÁ¦ ¼öÄ¡ ´ÜÀ§ÀÇ À̸§Àº "i-cache misses" ·Î, ´ÜÀ§ÀÇ ¾à¾î´Â "1"·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù( ij½¬ ¹Ì¾²ÀÇ È½¼ö´Â ´Ü¼ø Ä«¿îÆ®ÀÌÁö ¹°¸®ÀûÀÎ ´ÜÀ§°¡ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù). ¶ÇÇÑ ÀÌ °æ¿ì¿¡ ÇÁ·ÎÆÄÀϸµ ¼Óµµ(profiling rate)´Â 1·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù.

È÷½ºÅä±×·¥ binÀº 16ºñÆ® ¼ýÀÚ·Î °¢°¢ÀÇ binÀº µ¿ÀÏÇÑ Å©±âÀÇ text-space¸¦ ³ªÅ¸³½´Ù. ¿¹¸¦ µé¾î, text-segment°¡ 1,000 ¹ÙÀÌÆ®ÀÌ°í È÷½ºÅä±×·¥¿¡ 10°³ÀÇ binÀÌ ÀÖ´Ù¸é, °¢°¢ÀÇ binÀº 100¹ÙÀÌÆ®¸¦ ³ªÅ¸³½´Ù.

Call-Graph ·¹ÄÚµå (Call-Graph Records)

Call-graph ·¹ÄÚµå´Â BSD°è¿­ÀÇ ÆÄÀÏ Æ÷¸Ë¿¡¼­ »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ Æ÷¸ËÀ» °¡Áö°í ÀÖ´Ù. Call-graph ·¹ÄÚµå´Â call graphÀÇ ÇϳªÀÇ arc¿Í ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ arc°¡ traversedµÈ Ƚ¼ö¸¦ ³ªÅ¸³»´Â Ä«¿îÆ®·Î ±¸¼ºµÈ´Ù. Arc´Â ÁÖ¼ÒÀÇ ½ÖÀ¸·Î Ç¥ÇöµÇ¸ç, ù ¹ø° ÁÖ¼Ò´Â caller ÇÔ¼öÀÇ ³»ºÎ¿¡ ÀÖ´Â ÁÖ¼ÒÀÌ°í, µÎ ¹ø° ÁÖ¼Ò´Â calleeÇÔ¼ö³»ºÎ¿¡ ÀÖ´Â ÁÖ¼ÒÀ̾î¾ß ÇÑ´Ù. ÇÔ¼ö ´ÜÀ§·Î ÇÁ·ÎÆÄÀϸµÀ» ¼öÇàÇÒ¶§, À̵é ÁÖ¼Ò´Â °¢°¢ÀÇ ÇÔ¼ö ³»ºÎÀÇ ÀÓÀÇ À§Ä¡¸¦ Æ÷ÀÎÆ®ÇÒ ¼ö ÀÖÁö¸¸, ¶óÀÎ ´ÜÀ§·Î ÇÁ·ÎÆÄÀϸµÇÒ ¶§´Â À̵é ÁÖ¼Ò°¡ È£ÃâÀÌ ¹ß»ýÇÑ ÁöÁ¡(call-site)°ú ÇÔ¼öÀÇ entry-point¿¡ °¡´ÉÇÑ °¡±î¿ï¼ö·Ï ÁÁ´Ù. ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµ¿¡¼­ È£ÃâÁöÁ¡¶Ç´Â enrty-point¿¡ °¡´ÉÇÑ ±ÙÁ¢ÇÑ ÁÖ¼Ò¸¦ arc¿¡¼­ »ç¿ëÇÔÀ¸·Î¼­ ¶óÀÎ ´ÜÀ§ÀÇ Call graph°¡ ¼Ò½ºÄÚµåÀÇ ¾î´À ¶óÀο¡¼­ ƯÁ¤ ÇÔ¼ö°¡ È£ÃâµÇ¾ú´Â Áö¸¦ Á¤È®ÇÏ°Ô ±¸ºÐÇϵµ·Ï º¸ÀåÇÑ´Ù.

±âº» ºí·Ï ½ÇÇà Ä«¿îÆ® ·¹ÄÚµå (Basic-Block Execution Count Records)

±âº» ºí·Ï ½ÇÇà Ä«¿îÆ® ·¹ÄÚµå´Â Çì´õ¿Í address/count ½ÖµéÀÇ ½ÃÄö½º·Î ±¸¼ºµÇ¾î ÀÖ´Ù. Çì´õ´Â  ½ÃÄö½ºÀÇ Å©±â¸¦ ³ªÅ¸³»¸ç, °¢°¢ÀÇ address/count½Ö¿¡¼­ address´Â ±âº» ºí·Ï°ú ¿¬°üµÈ ÁÖ¼ÒÀ̸ç, count´Â ±âº» ºí·ÏÀÌ ½ÇÇàµÈ Ƚ¼öÀÌ´Ù. ±âº» ºí·Ï ³»¿¡ ÀÖ´Â ÀÓÀÇ ÁÖ¼Ò°¡ address¿¡ »ç¿ëµÉ ¼ö ÀÖ´Ù.

gprofÀÇ ³»ºÎ µ¿ÀÛ °úÁ¤

´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥°ú ¸¶Âù°¡Áö·Î gprof ´Â ¸ÕÀú ¸í·ÉÇà ¿É¼ÇÀ» ó¸®ÇÑ´Ù. SymspecsÀ» »ç¿ëÇÏ´Â ¿É¼ÇÀÌ ¸í·ÉÇà¿¡¼­ ¼³Á¤µÇ¾î ÀÖÀ¸¸é ¸í·ÉÇà ¿É¼Ç Ã³¸®¸¦ ÇÏ´Â Áß¿¡, gprof ´Â ÀÚ½ÅÀÇ symspec ¸®½ºÆ® (sym_ids.c:sym_id_add) ¸¦ ¸¸µç´Ù. gprof ´Â symspecs¸¦ ´ÜÀÏ ¿¬°á ¸®½ºÆ®(single linked list)·Î À¯ÁöÇÏ°í, ´ÜÀÏ ¿¬°á ¸®½ºÆ®´Â ³ªÁß¿¡ 12°³ÀÇ ½Éº¼ Å×À̺íµé·Î º¯È¯µÈ´Ù. 12°³ÀÇ ½Éº¼ Å×À̺íµéÀº 6°³ÀÇ include/exclude ½ÖÀ¸·Î ±¸¼ºµÈ´Ù. ¿©¼¸ °³ÀÇ include/exclude½ÖÀº ´ÙÀ½°ú °°´Ù.

1) flat profile¿ë (INCL_FLAT/EXCL_FLAT),
2) call graph arcs¿ë (INCL_ARCS/EXCL_ARCS),
3) call graph³»¿¡¼­ÀÇ Ãâ·Â±â´É Á¦¾î¿ë (INCL_GRAPH/EXCL_GRAPH),
4) call graph¿¡¼­ÀÇ ½Ã°£ ÀüÆÄ ±â´É Á¦¾î¿ë (INCL_TIME/EXCL_TIME),
5) annotated source ¸®½ºÆà ±â´É Á¦¾î¿ë (INCL_ANNO/EXCL_ANNO),
6) ½ÇÇà Ä«¿îÆ®(execution count) ¸®½ºÆà ±â´É Á¦¾î¿ë(INCL_EXEC/EXCL_EXEC).

¸í·ÉÇà ¿É¼ÇÀ» ó¸®ÇÑ ÈÄ¿¡, gprof ´Â ´ÙÀ½°ú °°Àº ÀÛ¾÷À» ÅëÇØ symspec ¸®½ºÆ®¸¦  ÀÛ¼ºÇÏ´Â ÀÛ¾÷À» ¸¶Ä£´Ù.

1)  default_excluded_list ¿¡ ÀÖ´Â ¸ðµç symspecs¸¦ exclude lists EXCL_TIME, EXCL_GRAPH¿¡ Ãß°¡,
2)  ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµÀÌ ÁöÁ¤µÈ °æ¿ì¿¡´Â default_excluded_list ¿¡ ÀÖ´Â symspecs¸¦ EXCL_FLAT ¿¡µµ Ãß°¡
     (EXCL_ANNO, EXCL_ARCS ¿Í EXCL_EXEC¿¡´Â default_excluded_list ¿¡ ÀÖ´Â symspecs°¡ Ãß°¡µÇÁö ¾Ê´Â´Ù.)

´ÙÀ½À¸·Î, ÀûÀýÇÑ Å©±âÀÇ ½Éº¼ ¹è¿­À» mallocÇÑ ÈÄ¿¡´Â ¿ÀºêÁ§ºê ÆÄÀÏÀ» ¿­°í, ¿ÀºêÁ§Æ® ÆÄÀÏÀÎÁö °Ë»çÇÏ°í, bfd_canonicalize_symtab¸¦ »ç¿ëÇÏ¿© ¿ÀºêÁ§Æ®ÀÇ ½Éº¼ Å×À̺í(core.c:core_init)À» Àбâ À§ÇÏ¿© BFD¶óÀ̺귯¸®°¡ È£ÃâµÈ´Ù. `--file-ordering' ¿É¼ÇÀÌ ¸í·ÉÇà¿¡¼­ ¼³Á¤µÇ¾ú´Ù¸é, ÀÌ ½ÃÁ¡¿¡¼­ ÇÔ¼ö ¸ÅÇÎÀÌ ÀÐÇôÁö°í,  `-c' ¿É¼ÇÀÌ ÁÖ¾îÁø °æ¿ì core text space°¡ ¸Þ¸ð¸®·Î ÀÐÇôµé¿©Áø´Ù.

À̶§¼­¾ß ºñ·Î¼Ò Sym structureÀÇ ¹è¿­ÀÎ gprof ÀÇ ÀÚü ½Éº¼ Å×À̺íÀÌ ¸¸µé¾îÁø´Ù. ÀÌ °úÁ¤Àº ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµÀ» ÁöÁ¤ÇÏ´Â `-l' ¿É¼Ç ¼³Á¤¿©ºÎ¿¡ µû¶ó, ´ÙÀ½¿¡ ¼³¸íÇÒ µÎ°¡Áö ¹æ½ÄÁß Çϳª¸¦ »ç¿ëÇÏ¿© ¼öÇàµÈ´Ù. ÀϹÝÀûÀÎ ÇÁ·ÎÆÄÀϸµÀÇ °æ¿ì, BFD canonical symbol tableÀ» °Ë»çÇÑ´Ù. ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµÀÏ ¶§¿¡´Â ¸ðµç text space address¸¦ °Ë»çÇÏ¿© ¶óÀÎ ¹øÈ£°¡ ¹Ù²ð ¶§¸¶´Ù, »õ·Î¿î ½Éº¼ Å×ÀÌºí ¿£Æ®¸®°¡ »ý¼ºµÈ´Ù. ¾î´À ¹æ½ÄÀ̵ç, ÇÊ¿äÇÑ ½Éº¼Å×À̺í Å©±â¸¦ °è»êÇÏ´Â °úÁ¤°ú ½ÇÁ¦ ½Éº¼À» ÀоîµéÀÌ´Â 2´Ü°è·Î ±¸¼ºµÈ´Ù. ÀÌµé ´Ü°èÀÇ Áß°£¿¡¼­, ÀûÀýÇÑ Å©±â Sym ŸÀÔÀÇ ´ÜÀÏ ¹è¿­ÀÌ »ý¼ºµÈ´Ù. ¸¶Áö¸·À¸·Î symtab.c:symtab_finalize À» È£ÃâÇÏ¿© ½Éº¼ Å×À̺íÀ» ¼ÒÆÃÇÏ°í, Áߺ¹µÈ ½Éº¼ ¿£Æ®¸®(µ¿ÀÏÇÑ ÁÖ¼Ò¸¦ °¡Áø ½Éº¼ ¿£Æ®¸®)¸¦ »èÁ¦ÇÑ´Ù.

½Éº¼ Å×À̺íÀº ´ÙÀ½°ú °°Àº µÎ°¡Áö ÀÌÀ¯·Î ¿¬¼ÓÀûÀÎ ¹è¿­(contiguous array)À̾î¾ß ÇÑ´Ù. ù° ½Éº¼ Å×À̺íÀ» ¼ÒÆ®Çϱâ À§ÇØ ¹è¿­À» ¼ÒÆ®ÇÏ´Â qsort ¶óÀ̺귯¸® ÇÔ¼ö¸¦ »ç¿ëÇϱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ ¸Þ¸ð¸® ÁÖ¼Ò¿¡ ±â¹ÝÇÏ¿© ÀÌÁø Ž»ö ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ´Â ½Éº¼ °Ë»ö ·çƾ(symtab.c:sym_lookup)¿¡¼­ ½Éº¼Å×À̺íÀÌ sorted arrayÀ̵µ·Ï ¿ä±¸Çϱ⠶§¹®ÀÌ´Ù. ÇÔ¼ö ½Éº¼Àº is_func Ç÷¡±×·Î ±¸ºÐµÇ°í, ¶óÀÎ ¹øÈ£ ½Éº¼Àº Ưº°ÇÑ Ç÷¡±× ¼³Á¤ÀÌ ¾ø´Ù. Ãß°¡ÀûÀ¸·Î ·ÎÄà ½Éº¼ÀÏ °æ¿ì¿¡´Â À̸¦ ³ªÅ¸³»±â À§ÇÏ¿© is_static Ç÷¡±×¸¦ °¡Áø´Ù.

ÀоîµéÀÎ ½Éº¼Å×À̺íÀ» »ç¿ëÇÏ¿©, symspecsÀ» Syms·Î ¹ø¿ªÇÑ´Ù(sym_ids.c:sym_id_parse). ÇϳªÀÇ symspecÀÌ º¹¼ö°³ÀÇ ½Éº¼À» ³ªÅ¸³¾ ¼ö ÀÖ´Ù´Â »ç½ÇÀ» ±â¾ïÇÏ¿©¾ß ÇÑ´Ù. ½Éº¼ Å×À̺í(syms)ÀÇ ¹è¿­ÀÌ ÇÑ °³ »ý¼ºµÈ´Ù. ½Éº¼ Å×À̺íÀÇ °¢°¢ÀÇ ¿£Æ®¸®´Â °¢°¢ÀÇ ¸®½ºÆÿ¡¼­ Æ÷ÇÔ ¶Ç´Â ¹èÁ¦µÉ symsÀÇ Å×À̺íÀÌ´Ù.  ¸¶½ºÅÍ ½Éº¼ Å×À̺í°ú symspecs´Â ÁßøµÈ ·çÇÁ¿¡ ÀÇÇØ °Ë»çµÇ°í, symspecs¿¡ ÀÏÄ¡ÇÏ´Â ¸ðµç ½Éº¼Àº ÀûÀýÇÑ syms Å×ÀÌºí¿¡ »ðÀԵȴÙ. ÀÌ °úÁ¤Àº µÎ ¹ø ¼öÇàµÇ´Âµ¥, ù ¹ø° ¼öÇà¿¡¼­´Â °¢°¢ÀÇ ½Éº¼ Å×ÀÌºí¿¡ ÇÊ¿äÇÑ Å©±â¸¦ °è»êÇÏ°í, µÎ ¹ø° ¼öÇà¿¡¼­ ½ÇÁ¦·Î Å×À̺íÀ» ¸¸µç´Ù. Å×À̺íÀ» À§ÇÑ °ø°£Àº ù ¹ø° ¼öÇà°ú µÎ ¹ø° ¼öÇà»çÀÌ¿¡¼­ mallocµÈ´Ù. ±×¸®°í³ª¼­ ¾î¶² ½Éº¼ÀÌ include symspecs list¶Ç´Â exclude symspec list¿¡ ÀÖ´Â Áö¸¦ °áÁ¤Çϱâ À§ÇØ, gprof Àº syms ¹è¿­¿¡ ÀÖ´Â Àû´çÇÑ Å×ÀÌºí¿¡ ½Éº¼ Ž»ö ·çƾÀ» »ç¿ëÇÑ´Ù.

´ÙÀ½À¸·Î ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ ÆÄÀÏ ÀÚü¸¦ Àдµ¥ (gmon_io.c:gmon_out_read), ¸ÕÀú »õ·Î¿î ½ºÅ¸ÀÏÀÇ gmon.out' Çì´õ¸¦ °Ë»çÇÏ°í, magic number¸¦ °Ë»çÇÏ¿© ½ÇÆÐÇϸé, ±¸Çü BSD `gmon.out' À¸·Î °¡Á¤ÇÑ´Ù.

hist.c:hist_read_rec ÇÔ¼ö´Â »õ·Î¿î ½ºÅ¸ÀÏÀÇ È÷½ºÅä±×·¥ ·¹ÄÚµåµéÀ» Àд´Ù. ÃÖÃÊ È÷½ºÅä±×·¥ ·¹Äڵ忡 ´ëÇÏ¿© ¸ðµç binÀ» º¸°üÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í, ¸ðµç binÀ» ÀоîµéÀδÙ. º¹¼ö°³ÀÇ ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ ÆÄÀÏ ¶Ç´Â º¹¼ö°³ÀÇ È÷½ºÅä±×·¥ ·¹Äڵ带 °¡Áø ÆÄÀÏÀ» ÀоîµéÀÏ ¶§, ½ÃÀÛ ÁÖ¼Ò, ³¡ÁÖ¼Ò, binÀÇ °¹¼ö, »ùÇøµ ¼Óµµ°¡ ¿©·¯ È÷½ºÅä±×·¥µé°£¿¡ ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀº °æ¿ì fatal errorÀÌ ¹ß»ýÇÑ´Ù. ¸ðµç È÷½ºÅä±×·¥ÀÌ ÀÏÄ¡ÇÏ´Â °æ¿ì, Ãß°¡ÀûÀÎ È÷½ºÅä±×·¥µéÀ» ±âÁ¸ÀÇ in-memory array¿¡ ´õÇÑ´Ù.

call graph ·¹Äڵ尡 ÀÐÇôÁö¸é¼­(call_graph.c:cg_read_rec), parent¿Í child addresses°¡ ½Éº¼ Å×ÀÌºí ¿£Æ®¸®¿¡ ¸ÅÄ¡µÇ¸ç, arc°¡ INCL_ARCS/EXCL_ARCS¸¦ »ç¿ëÇÑ symspec °Ë»ç¿¡¼­ ¼º°øÇÏ´Â °æ¿ì, cg_arcs.c:arc_add ¸¦ »ç¿ëÇÏ¿© call graph arc°¡ »ý¼ºµÈ´Ù. °¢°¢ÀÇ arc°¡ Ãß°¡µÇ¸é¼­, ¿¬°á ¸®½ºÆ®(linked list)´Â parent's child arc, child's parent arc¸¦ Á¤¸®ÇÑ´Ù. childÀÇ call count¿Í arcÀÇ call count´Â ·¹ÄÚµåÀÇ call count¸¸Å­ Áõ°¡µÈ´Ù.

¶óÀδÜÀ§ ÇÁ·ÎÆÄÀϸµÀÌ ¼±ÅõÆÀ» °æ¿ì¿¡¸¸ ±âº» ºí·Ï ·¹ÄÚµåµéÀÌ ÀÐÇôÁø´Ù(basic_blocks.c:bb_read_rec). °¢°¢ÀÇ ±âº» ºí·Ï address´Â ½Éº¼ Å×À̺íÀÇ »óÀÀÇÏ´Â ¶óÀÎ ½Éº¼°ú ¸ÅÄ¡µÇ°í, ½Éº¼ÀÇ bb_addr ¿Í bb_calls ¹è¿­¿¡ ¿£Æ®¸®°¡ ¸¸µé¾îÁø´Ù. µ¿ÀÏÇÑ ÁÖ¼Ò¸¦ °¡Áö´Â º¹¼ö°³ÀÇ ±âº» ºí·ÏÀÌ ÀÖ´Ù¸é, call count´Â ´©ÀûµÈ´Ù.

gmon.sum ÆÄÀÏ ´ýÇÁ¸¦ À§ÇÑ ¿É¼ÇÀÌ ÁöÁ¤µÈ °æ¿ì¿¡´Â gmon.sum ÆÄÀÏÀ» ´ýÇÁÇÑ´Ù(gmon_io.c:gmon_out_write).

µ¥ÀÌÅÍ ÆÄÀÏ ³»¿¡ È÷½ºÅä±×·¥ÀÌ ÀÖ´Ù¸é, ¸ðµç »ùÇà binÀ» ¼øȸÇÏ¿© ¹Ýº¹Çϸ鼭 È÷½ºÅä±×·¥À» ½Éº¼¿¡ ÇÒ´çÇÑ´Ù(hist.c:hist_assign_samples). ½Éº¼ Å×À̺íÀº ¸Þ¸ð¸® ÁÖ¼ÒÀÇ ¿À¸§Â÷¼øÀ¸·Î ¼ÒÆ®µÇ¾î ÀÖÀ¸¹Ç·Î, »ùÇà bin¿¡ ´ëÇÏ¿© À̵¿ÇÏ´Â °ÍÀº ´Ü¼øÈ÷ ½Éº¼Å×À̺íÀ» ¼ø¼­´ë·Î À̵¿ÇÏ´Â °Í°ú °°´Ù. ÀÌ °úÁ¤¿¡ INCL_FLAT/EXCL_FLAT¿¡ ´ëÇÑ symspec check°¡ Æ÷ÇԵǾî ÀÖ´Ù. È÷½ºÅä±×·¥ scale factor¿¡ µû¶ó, »ùÇà binÀº º¹¼ö°³ÀÇ symbolsÀ» Ä¿¹öÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ °æ¿ì »ùÇà ī¿îÆ®ÀÇ fraction(¿À¹ö·¦µÇ´Â Á¤µµ¿¡ ºñ·ÊÇÏ´Â)ÀÌ °¢°¢ÀÇ ½Éº¼¿¡ ÇÒ´çµÈ´Ù. ÀÌ·¯ÇÑ È¿°ú´Â ÀϹÝÀûÀÎ ÇÁ·ÎÆÄÀϸµ¿¡¼­´Â µå¹® °æ¿ìÁö¸¸, ¶óÀδÜÀ§ ÇÁ·ÎÆÄÀϸµ¿¡¼­ ¿À¹ö·¦Àº Á»´õ ÈçÈ÷ º¼ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î µÎ °³ÀÇ ÀÎÁ¢ÇÑ ¶óÀεéÀÌ 1/2 hit¸¦ ¸¸µé¾î ³¾ ¼öµµ ÀÖ´Ù.

µ¥ÀÌÅÍ ÆÄÀÏ ³»¿¡ call graph µ¥ÀÌÅÍ°¡ ÀÖ´Â °æ¿ì, cg_arcs.c:cg_assemble ÀÌ È£ÃâµÈ´Ù. ¸ÕÀú `-c' ¿É¼ÇÀÌ ÁöÁ¤µÇ¾ú´Ù¸é, ¸Ó½®¿¡ ÀÇÁ¸ÀûÀÎ ·çƾ (find_call) ÀÌ °¢°¢ÀÇ ½Éº¼ÀÇ ¸Ó½® Äڵ带 °Ë»çÇÏ¿© subroutine call ÀνºÆ®·°¼ÇÀ» ã¾Æ 0¹øÀÇ È£Ãâ Ä«¿îÆ®(call count)¸¦ °¡Áø call graph¿¡ Ãß°¡ÇÑ´Ù. ¸ðµç ½Éº¼µéÀ» depth-first numberingÀ» »ç¿ëÇÏ¿© topological sortÇÏ¿©(cg_dfn.c:cg_dfn), childrenÀÌ Ç×»ó ±×µéÀÇ parentº¸´Ù ÀûÀº ¹øÈ£¸¦ °¡Áöµµ·Ï ¸¸µç´Ù. ±× ´ÙÀ½¿¡ ½Éº¼ Å×ÀÌºí¿¡ ´ëÇÑ Æ÷ÀÎÅ͵éÀ» ¿ø¼Ò·Î ÇÏ´Â ¹è¿­À» ¸¸µé°í, ÀÌ ¹è¿­ÀÇ ¸ðµç ¿ø¼Òµé¿¡ µ¿ÀÏÇÑ topological number¸¦ ºÎ¿©ÇÑ´Ù. ¼ÒÆ®µÈ ½Éº¼ Æ÷ÀÎÅÍÀÇ ¹è¿­¿¡ ´ëÇÏ¿© ´ÙÀ½°ú °°Àº 2´Ü°è ÀÛ¾÷À» ¼öÇàÇÑ´Ù.

1) ³¡¿¡¼­ ½ÃÀÛÂÊÀ¸·Î (parents¿¡¼­ children ¹æÇâÀ¸·Î) child timeÀÇ fractionÀ» °è»êÇÏ°í °¢°¢ÀÇ parent¿Í print flag¿¡ propagateÇÑ´Ù. parentÀÇ include/exclude (print/no print) Ư¼ºÀÌ ( childrenÀÌ INCL_GRAPH ¶Ç´Â EXCL_GRAPH ¿¡ ¸í½ÃÀûÀ¸·Î ³ªÅ¸³ªÀÖÁö ¾ÊÀº °æ¿ì¿¡¸¸) children¿¡ pripagateµÇ¸é¼­, print flag´Â INCL_GRAPH/EXCL_GRAPH¿¡ ´ëÇÑ symspec 󸮸¦ ¹Ý¿µÇÑ´Ù.
2) ½ÃÀÛ¿¡¼­ ³¡ÂÊÀ¸·Î(children¿¡¼­ parents¹æÇâÀ¸·Î), call grapht¸¦ µû¶ó INCL_TIME/EXCL_TIME °Ë»ç¿¡ µû¶ó timingsÀ» ½ÇÁ¦·Î propagateÇÑ´Ù. the print flag, fractions, ¿Í timingsÀÌ ½Éº¼ ±¸Á¶¿¡ ÀúÀåµÇ¸é¼­, topological sort array´Â ¾ø¾îÁö°í, propagated time¿¡ µû¶ó ¼ÒÆ®µÈ Æ÷ÀÎÆ®ÀÇ ¹è¿­ÀÌ »õ·Î ¸¸µé¾î Áø´Ù.

¸¶Áö¸·À¸·Î, »ç¿ëÀÚ°¡ ¿äûÇÑ ´Ù¾çÇÑ ÇüÅÂÀÇ Ãâ·ÂÀÌ ÇÁ¸°Æ®µÈ´Ù. call graph (cg_print.c:cg_print)¿Í flat profile (hist.c:hist_print)Àº ÀÌ¹Ì °è»êµÈ °ªÀ» ÇÁ¸°Æ®ÇÑ °ÍÀÌ´Ù. annotated source ¸®½ºÆà (basic_blocks.c:print_annotated_source)Àº ±âº» ºí·Ï Á¤º¸°¡ ÀÖ´Â °æ¿ì À̸¦ »ç¿ëÇÏ¿© call count°¡ ÀÖ´Â °¢°¢ÀÇ ÄÚµå ¶óÀÎÀ» ·¹ÀÌºí¸µÇÑ´Ù. ±×·¸Ä¡ ¾Ê°í ±âº» ºí·Ï Á¤º¸°¡ ¾ø´Â °æ¿ì¿¡´Â ÇÔ¼ö È£Ãâ Ä«¿îÆ®(function call counts)¸¸ Ãâ·ÂÇÑ´Ù.

function ordering°ú °ü·ÃµÈ ÄÚµå´Â ¼Ò½º ÄÚµå(cg_print.c)¿¡ ÀϺΠÀß ¹®¼­È­µÇ¾î ÀÖ´Ù. function orderingÀº ±âº»ÀûÀ¸·Î, °¡Àå ¸¹ÀÌ »ç¿ëµÈ ÇÔ¼ö¿Í °¡Àå ÃÖ»óÀ§ÀÇ parent°¡ ¸ÕÀú À§Â÷ÇÏ°í, ±× ´ÙÀ½ ¼øÀ§ÀÇ ÇÔ¼ö, Àû°Ô »ç¿ëµÈ ÇÔ¼ö, »ç¿ëµÇÁö ¾ÊÀº ÇÔ¼ö¼øÀ¸·Î ¹èÄ¡ÇÑ´Ù.

gprof µð¹ö±ë

gprof ÇÁ·Î±×·¥ÀÌ µð¹ö±ë È°¼ºÈ­ ¼³Á¤À¸·Î ÄÄÆÄÀϵǾú´Ù¸é, `-d' ¿É¼ÇÀº gprof ÀÇ ³»ºÎ µ¿ÀÛ¿¡ ´ëÇÑ ÀÌÇظ¦ µµ¿ï ¼ö ÀÖ´Â µð¹ö±ë Á¤º¸¸¦ Ç¥ÁØ Ãâ·Â¿¡ ÇÁ¸°Æ®ÇÑ´Ù. '-d' ¿É¼ÇÀÇ ¿É¼Ç ÀÎÀÚ·Î ¸í½ÃµÈ µð¹ö±ë ¹øÈ£´Â ´ÙÀ½ÀÇ ¿É¼ÇÀÇ ÇÕÀÌ´Ù.

2 - Topological sort
Call graph ºÐ¼®°úÁ¤Áß ½Éº¼¿¡ ´ëÇÑ depth-first numberingÀ» ¸ð´ÏÅ͸µÇÑ´Ù.
4 - Cycles
½ÎÀÌŬ ÇìµåÀÎ ½Éº¼µéÀ» º¸¿©ÁØ´Ù.
16 - Tallying
call graph arcs¸¦ ÀоîµéÀ̸鼭, °¢°¢ÀÇ arc¿Í °¢°¢ÀÇ ÇÔ¼ö¿¡ ´ëÇÑ ÃÑ È£ÃâȽ¼ö Á¤º¸¸¦ º¸¿©ÁØ´Ù.
32 - Call graph arc sorting
°¢°¢ÀÇ call graph ¿£Æ®¸®³»ºÎ¿¡¼­ÀÇ °³º° parents/childrenÀÇ ¼ÒÆÿ¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¸¿©ÁØ´Ù.
64 - Reading histogram and call graph records
Shows address ranges of histograms as they are read, and each call graph arc
È÷½ºÅä±×·¥À» ÀоîµéÀ̸鼭 °¢°¢ÀÇ È÷½ºÅä±×·¥ÀÇ ÁÖ¼Ò ¹üÀ§(address range)¸¦ º¸¿©ÁØ´Ù. ¶ÇÇÑ °¢°¢ÀÇ call graph arc¸¦ º¸¿©ÁØ´Ù.
128 - Symbol table
¿ÀºêÁ§Æ® ÆÄÀÏ¿¡¼­, ½Éº¼Å×À̺íÀ» Àаí, ºÐ·ùÇÑÈÄ ¼ÒÆÃÇÑ´Ù. ¶óÀδÜÀ§ÀÇ ÇÁ·ÎÆÄÀϸµ(`-l' ¿É¼Ç)¿¡ ´ëÇؼ­´Â, ¶óÀκ°·Î ¸Þ¸ð¸® ÁÖ¼Ò¿¡ ÇÒ´çµÈ ¶óÀÎ ¹øÈ£µµ º¸¿©ÁØ´Ù.
256 - Static call graph
`-c' ¿É¼Ç ÁöÁ¤¿¡ µû¸¥ µ¿ÀÛ°úÁ¤À» ÃßÀûÇÑ´Ù.
512 - Symbol table and arc table lookups
½Éº¼ Å×ÀϺí°ú Arc Å×ÀÌºí¿¡ ´ëÇÑ °Ë»ö ·çƾÀÇ µ¿ÀÛ°úÁ¤À» ÀÚ¼¼È÷ º¸¿©ÁØ´Ù.
1024 - Call graph propagation
ÇÔ¼öÀÇ ½Ã°£ÀÌ call graph¸¦ µû¶ó ÀüÆĵǴ °úÁ¤À» º¸¿©ÁØ´Ù.
2048 - Basic-blocks
ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅͷκÎÅÍ ±âº» ºí·Ï ·¹Äڵ带 ÀоîµéÀÌ´Â µ¿ÇÑ ±âº» ºí·Ï ·¹Äڵ带 º¸¿©ÁØ´Ù( `-l' ¿É¼ÇÀÌ ÁöÁ¤µÈ °æ¿ì¿¡¸¸ À¯È¿)
4096 - Symspecs
sympspecÀ¸·ÎºÎÅÍ ½Éº¼À» ¸ÅÄ¡ÇÏ´Â ÆÐÅÏ ¸ÅĪ°úÁ¤À» º¸¿©ÁØ´Ù.
8192 - Annotate source
`-A' ¿É¼Ç ÁöÁ¤¿¡ µû¸¥ µ¿ÀÛ°úÁ¤À» ÃßÀûÇÑ´Ù.


óÀ½, ÀÌÀü, ´ÙÀ½, ¸¶Áö¸· ¼½¼Ç, ¸ñÂ÷