±à¼ÍƼö: |
±¾ÎÄÀ´×Ôsegmentfault.com,Ö÷Ҫͨ¹ý¶Ô¸²¸ÇÂÊÉú³É¡¢½âÎöÂß¼µÄ̽¾¿£¬½Ò¿ªÁ˸²¸ÇÂʼì²âµÄÉñÃØÃæÉ´¡£ |
|
±³¾°
¶ÔÆ»¹û¿ª·¢Õß¶øÑÔ£¬ÓÉÓÚÆ½Ì¨ÉóºËÖÜÆÚ½Ï³¤£¬¿Í»§¶Ë´úÂëµ¼ÖµÄÏßÉÏÎÊÌâÓ°Ïìʱ¼äÍùÍù±È½Ï¾Ã¡£Èç¹ûÔÚ¿ª·¢¡¢²âÊÔ½×¶ÎÄܹ»Ìáǰ±©Â¶ÎÊÌ⣬¾ÍÓÐÖúÓÚ±ÜÃâÏßÉÏʹʵķ¢Éú¡£´úÂ븲¸ÇÂʼì²âÕýÊǰïÖú¿ª·¢¡¢²âÊÔͬѧÌáǰ·¢ÏÖÎÊÌ⣬±£Ö¤´úÂëÖÊÁ¿µÄºÃ°ïÊÖ¡£
¶ÔÓÚ¿ª·¢Õß¶øÑÔ£¬´úÂ븲¸ÇÂÊ¿ÉÒÔ·´À¡Á½·½ÃæÐÅÏ¢£º
×Ô²âµÄ³ä·Ö³Ì¶È¡£
´úÂëÉè¼ÆµÄÈßÓà³Ì¶È¡£
¾¡¹Ü´úÂ븲¸ÇÂʶԴúÂëÖÊÁ¿ÓÐ×ÅÉÏÊöºÃ´¦£¬µ«ÔÚ iOS ¿ª·¢ÖÐȴʹÓõIJ»¶à¡£ÎÒÃǵ÷ÑÐÁËÊг¡Éϳ£ÓÃµÄ iOS
¸²¸ÇÂʼì²â¹¤¾ß£¬ÕâЩ¹¤¾ßÖ÷Òª´æÔÚÒÔÏÂËĸöÎÊÌ⣺
µÚÈý·½¹¤¾ßÓÐʱÉú³ÉµÄ¼ì²â±¨¸æÎļþ»á³ö´íÉõÖÁ»áʧ°Ü£¬¿ª·¢Õß¶Ô¸²¸ÇÂÊÉú³ÉÔÀí²»Á˽⣬Óöµ½ÕâÀàÎÊÌâÈÝÒׯúÓù¤¾ß¡£
µÚÈý·½¹¤¾ßÿ´ÎչʾȫÁ¿µÄ¸²¸ÇÂʱ¨¸æ£¬»á·ÖÉ¢¿ª·¢ÕߵĺܶྫÁ¦ÔÚδÐ޸IJ¿·Ö¡£¶øÔÚ¾ø´ó¶àÊýÇé¿öÏ£¬¿ª·¢ÕߵĹØ×¢ÖصãÔÚ±¾´ÎÐÂÔöºÍÐ޸ĵIJ¿·Ö¡£
Xcode ×Ô´øµÄ¸²¸ÇÂʼì²âÖ»ÊÊÓÃÓÚµ¥Ôª²âÊÔ³¡¾°£¬ÓÉÓÚÐèÇó±ä¸üƵ·±£¬ÒµÎñÍŶӿª·¢µ¥Ôª²âÊԵijɱ¾ºÜ¸ß¡£
ÒÑÓй¤¾ßºÜÄѺÍÏÖÓпª·¢Á÷³Ì½áºÏÆðÀ´£¬ÐèÒª¶îÍâ½øÐвâÊÔ£¬ÔËÐи²¸ÇÂʽű¾²ÅÄÜ»ñÈ¡±¨¸æÎļþ¡£
ΪÁ˽â¾öÉÏÊöÎÊÌ⣬ÎÒÃÇÉîÈëµ÷ÑÐÁ˸²¸ÇÂʱ¨¸æµÄÉú³ÉÂß¼£¬²¢½áºÏÍŶӵĿª·¢Á÷³Ì£¬¿ª·¢ÁËÒ»Ì×ǶÈëÔÚ´úÂëÌá½»Á÷³ÌÖС¢»ùÓÚµ¥´Î´úÂëÌá½»£¨git
commit£©Éú³É±¨¸æ¡¢¶Ô¿ª·¢Õß͸Ã÷µÄÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ß¡£¿ª·¢ÕßÖ»ÐèÒªÕý³£¿ª·¢£¬Í¨¹ýÄ£ÄâÆ÷²âÊÔ¿ª·¢´úÂ룬commit
±¾´Î´úÂ루commit ºÍ²âÊÔ˳Ðò¿É½»»»£©£¬ÍÆËÍ£¨git push£©µ½Ô¶¶Ë£¬¾Í¿ÉÒÔÔÚ±¾µØ¿´µ½Õâ´ÎÌá½»´úÂëµÄÏêϸ¸²¸ÇÂʱ¨¸æÁË¡£
±¾ÎÄ·ÖΪÁ½²¿·Ö£¬ÏÈ´Ó½éÉÜͨÓø²¸ÇÂʼì²âµÄÔÀí³ö·¢£¬ÈöÁÕß¶Ô¸²¸ÇÂʵÄÊÕ¼¯¡¢½âÎöÓÐÖ±¹ÛµÄÈÏʶ¡£Ö®ºó½éÉÜÎÒÃÇÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ßµÄʵÏÖ¡£
¸²¸ÇÂʼì²âÔÀí
Éú³É¸²¸ÇÂʱ¨¸æ£¬Ê×ÏÈÐèÒªÔÚ Xcode ÖÐÅäÖñàÒëÑ¡Ï±àÒëºó»áΪÿ¸ö¿ÉÖ´ÐÐÎļþÉú³É¶ÔÓ¦µÄ .gcno
Îļþ£»Ö®ºóÔÚ´úÂëÖе÷Óø²¸ÇÂÊ·Ö·¢º¯Êý£¬»áÉú³É¶ÔÓ¦µÄ .gcda Îļþ¡£
ÆäÖУ¬.gcno °üº¬ÁË´úÂë¼ÆÊýÆ÷ºÍÔ´ÂëµÄÓ³Éä¹ØÏµ£¬ .gcda ¼Ç¼ÁËÿ¶Î´úÂë¾ßÌåµÄÖ´ÐдÎÊý¡£¸²¸ÇÂʽâÎö¹¤¾ßÐèÒª½áºÏÕâÁ½¸öÎļþ¸ø³ö×îºóµÄ¼ì²â±¨±í¡£½ÓÏÂÀ´ÏÈ¿´¿´
.gcno µÄÉú³ÉÂß¼¡£
.gcno
ÀûÓà Clang ·Ö±ðÉú³ÉÔ´ÎļþµÄ AST ºÍ IR Îļþ£¬¶Ô±È·¢ÏÖ£¬AST Öв»´æÔÚ¼ÆÊýÖ¸Á¶ø
IR ÖдæÔÚÓÃÀ´¼Ç¼ִÐдÎÊýµÄ´úÂë¡£ËÑË÷ LLVM Ô´Âë¿ÉÒÔÕÒµ½¸²¸ÇÂÊÓ³Éä¹ØÏµÉú³ÉÔ´Âë¡£¸²¸ÇÂÊÓ³Éä¹ØÏµÉú³ÉÔ´ÂëÊÇ
LLVM µÄÒ»¸ö Pass£¬£¨ÏÂÎļò³Æ GCOVPass£©ÓÃÀ´Ïò IR ÖвåÈë¼ÆÊý´úÂë²¢Éú³É .gcno
Îļþ£¨¹ØÁª¼ÆÊýÖ¸ÁîºÍÔ´Îļþ£©¡£
ÏÂÃæ·Ö±ð½éÉÜIR²å×®Âß¼ºÍ .gcno Îļþ½á¹¹¡£
IR ²å×®Âß¼
´úÂëÐÐÊÇ·ñÖ´Ðе½£¬ÐèÒªÔÚÔËÐÐÖÐͳ¼Æ£¬Õâ¾ÍÐèÒª¶Ô´úÂë±¾Éí×öһЩÐ޸ģ¬LLVM ͨ¹ýÐÞ¸Ä IR ²åÈëÁ˼ÆÊý´úÂ룬Òò´ËÎÒÃDz»ÐèÒª¸Ä¶¯ÈκÎÔ´Îļþ£¬½öÐèÔÚ±àÒë½×¶ÎÔö¼Ó±àÒëÆ÷Ñ¡Ï¾ÍÄÜʵÏÖ¸²¸ÇÂʼì²âÁË¡£
´Ó±àÒëÆ÷½Ç¶È¿´£¬»ù±¾¿é£¨Basic Block£¬ÏÂÎļò³Æ BB£©ÊÇ´úÂëÖ´ÐеĻù±¾µ¥Ôª£¬LLVM »ùÓÚ
BB ½øÐи²¸ÇÂʼÆÊýÖ¸ÁîµÄ²åÈ룬BB µÄÌØµãÊÇ£º
Ö»ÓÐÒ»¸öÈë¿Ú¡£
Ö»ÓÐÒ»¸ö³ö¿Ú¡£
Ö»Òª»ù±¾¿éÖеÚÒ»ÌõÖ¸Áî±»Ö´ÐУ¬ÄÇô»ù±¾¿éÄÚËùÓÐÖ¸Áî¶¼»á˳ÐòÖ´ÐÐÒ»´Î¡£
¸²¸ÇÂʼÆÊýÖ¸ÁîµÄ²åÈë»á½øÐÐÁ½´ÎÑ»·£¬Íâ²ãÑ»·±éÀú±àÒëµ¥ÔªÖеĺ¯Êý£¬ÄÚ²ãÑ»·±éÀúº¯ÊýµÄ»ù±¾¿é¡£º¯Êý±éÀú½öÓÃÀ´Ïò
.gcno ÖÐдÈ뺯ÊýλÖÃÐÅÏ¢£¬ÕâÀï²»ÔÙ׸Êö¡£
Ò»¸öº¯ÊýÖлù±¾¿éµÄ²å×®·½·¨ÈçÏ£º
ͳ¼ÆËùÓÐ BB µÄºó¼ÌÊý n£¬´´½¨ºÍºó¼ÌÊý´óСÏàͬµÄÊý×é ctr[n]¡£
ÒÔºó¼ÌÊý±àºÅΪÐòºÅ½«Ö´ÐдÎÊýÒÀ´Î¼Ç¼ÔÚ ctr[i] λÖ㬶ÔÓÚ¶àºó¼ÌÇé¿ö¸ù¾ÝÌõ¼þÅжϲåÈë¡£
¾Ù¸öÀý×Ó£¬ÏÂÃæÊÇÒ»¶Î²ÂÊý×ÖµÄÓÎÏ·´úÂ룬µ±Íæ¼Ò²ÂÖÐÁËÎÒÃÇÔ¤ÉèµÄÊý×Ö10µÄʱºò»áÊä³öBingo£¬·ñÔòÊä³öYou
guessed wrong!¡£Õâ¶Î´úÂëµÄ¿ØÖÆÁ÷³ÌͼÈçͼ1Ëùʾ¡£
- (void)guessNumberGame:(NSInteger)guessNumber
{
NSLog(@"Welcome to the game");
if (guessNumber == 10) {
NSLog(@"Bingo!");
} else {
NSLog(@"You guess is wrong!");
}
} |
Àý1 ²ÂÊý×ÖÓÎÏ·
Õâ¶Î´úÂëÈç¹û¿ªÆôÁ˸²¸ÇÂʼì²â£¬»áÉú³ÉÒ»¸ö³¤¶ÈΪ 6 µÄ 64 λÊý×飬¶ÔÕÕ²å׮λÖ㬷½À¨ºÅÖбê¼ÇÁË×®µãÐòºÅ£¬Í¼
1 ÖдúÂëǰÊý×ÖΪËùÔÚÐÐÊý¡£

ͼ 1 ×®µãλÖÃ
.gcno¼ÆÊý·ûºÅºÍÎļþλÖùØÁª
.gcno ÊÇÓÃÀ´±£´æ¼ÆÊý²å׮λÖúÍÔ´ÎļþÖ®¼ä¹ØÏµµÄÎļþ¡£GCOVPass ÔÚͨ¹ýÁ½²ãÑ»·²åÈë¼ÆÊýÖ¸ÁîµÄͬʱ£¬»á½«Îļþ¼°
BB µÄÐÅϢдÈë .gcno Îļþ¡£Ð´Èë²½ÖèÈçÏ£º
´´½¨ .gcno Îļþ£¬Ð´Èë Magic number(oncg+version)¡£
Ëæ×ź¯Êý±éÀúдÈëÎļþµØÖ·¡¢º¯ÊýÃûºÍº¯ÊýÔÚÔ´ÎļþÖÐµÄÆðÖ¹ÐÐÊý£¨±ê¼ÇÎļþÃû£¬º¯ÊýÔÚÔ´Îļþ¶ÔÓ¦ÐÐÊý£©¡£
Ëæ×Å BB ±éÀú£¬Ð´Èë BB ±àºÅ¡¢BB ÆðÖ¹·¶Î§¡¢BB µÄºó¼Ì½Úµã±àºÅ£¨±ê¼Ç»ù±¾¿éÌø×ª¹ØÏµ£©¡£
дÈ뺯ÊýÖÐBB¶ÔÓ¦ÐкÅÐÅÏ¢£¨±ê×¢»ù±¾¿éÓëÔ´ÂëÐÐÊý¹ØÏµ£©¡£
´ÓÉÏÃæµÄдÈë²½Öè¿ÉÒÔ¿´³ö£¬.gcno Îļþ½á¹¹ÓÉËIJ¿·Ö×é³É£º
Îļþ½á¹¹
º¯Êý½á¹¹
BB ½á¹¹
BB Ðнṹ
ͨ¹ýÕâËIJ¿·Ö½á¹¹¿ÉÒÔÍêÈ«»¹Ô²å×®´úÂëºÍÔ´ÂëµÄ¹ØÁª£¬ÎÒÃÇÒÔ BB ½á¹¹ / BB ÐнṹΪÀý£¬¸ø³ö½á¹¹Í¼
2 (a) BB ½á¹¹£¬(b) BB ÐÐÐÅÏ¢½á¹¹£¬ÔÚ±¾ÕÂĩβ¸²¸ÇÂʽâÎö²¿·Ö£¬ÎÒÃÇÀûÓÃÕâ¸ö½á¹¹Í¼»¹Ô´úÂëÖ´ÐдÎÊý£¨Ã¿Ðеȸ߸ñ´ú±í
64bit£©£º

ͼ2 BB ½á¹¹ºÍ BB ÐÐÐÅÏ¢½á¹¹
.gcda
Èë¿Úº¯Êý
¹ØÓÚ .gcda µÄÉú³ÉÂß¼£¬¿É²Î¿¼¸²¸ÇÂÊÊý¾Ý·Ö·¢Ô´Âë¡£Õâ¸öÎļþÖаüº¬ÁË __gcov_flush()
º¯Êý£¬Õâ¸öº¯ÊýÕýÊÇ·Ö·¢Âß¼µÄÈë¿Ú¡£½ÓÏÂÀ´¿´¿´ __gcov_flush() ÈçºÎÉú³É .gcda Îļþ¡£
ͨ¹ýÔĶÁ´úÂëºÍµ÷ÊÔ£¬ÎÒÃÇ·¢ÏÖÔÚ¶þ½øÖÆ´úÂë¼ÓÔØÊ±£¬µ÷ÓÃÁËllvm_gcov_init(writeout_fn
wfn£¬ flush_fn ffn)º¯Êý£¬´«ÈëÁË_llvm_gcov_writeout£¨Ð´ gcov
Îļþ£©£¬_llvm_gcov_flush£¨gcov ½Úµã·Ö·¢£©Á½¸öº¯Êý£¬²¢ÇÒ¸ù¾Ýµ÷ÓÃ˳Ðò£¬·Ö±ð½¨Á¢ÁËÒÔÎļþΪ½ÚµãµÄÁ´±í½á¹¹¡££¨flush_fn_node
* £¬writeout_fn_node * £©
__gcov_flush() ´úÂëÈçÏÂËùʾ£¬µ±ÎÒÃÇÊÖ¶¯µ÷ÓÃ__gcov_flush() ½øÐи²¸ÇÂÊ·Ö·¢Ê±£¬»á±éÀúflush_fn_node
*Õâ¸öÁ´±í£¨¼´±éÀúËùÓÐÎļþ½Úµã£©£¬²¢µ÷Ó÷ַ¢º¯Êý_llvm_gcov_flush£¨curr->fn
ÕýÊÇ__llvm_gcov_flushº¯ÊýÀàÐÍ£©¡£
void __gcov_flush()
{
struct flush_fn_node *curr = flush_fn_head;
while (curr) {
curr->fn();
curr = curr->next;
}
} |
¾ßÌåµÄ·Ö·¢Âß¼
¹Û²ì__llvm_gcov_flush µÄ IR ´úÂ룬¿ÉÒÔ¿´µ½£º
ͼ3 __llvm_gcov_flush ´úÂëʾÀý
__llvm_gcov_flush Ïȵ÷ÓÃÁË__llvm_gcov_writeout£¬À´Ïò .gcda
дÈ븲¸ÇÂÊÐÅÏ¢¡£
×îºó½«¼ÆÊýÊý×éÇåÁã__llvm_gcov_ctr.xx¡£
¶ø__llvm_gcov_writeoutÂ߼Ϊ£º
Éú³É¶ÔÓ¦Ô´ÎļþµÄ .gcda Îļþ£¬Ð´Èë Magic number¡£
Ñ»·Ö´ÐÐ
llvm_gcda_emit_function: Ïò .gcda ÎļþдÈ뺯ÊýÐÅÏ¢¡£
llvm_gcda_emit_arcs: Ïò .gcda ÎļþдÈëBBÖ´ÐÐÐÅÏ¢£¬Èç¹ûÒѾ´æÔÚ .gcda
Îļþ£¬»áºÍ֮ǰµÄÖ´ÐдÎÊý½øÐкϲ¢¡£
µ÷ÓÃllvm_gcda_summary_info£¬Ð´ÈëУÑéÐÅÏ¢¡£
µ÷ÓÃllvm_gcda_end_file£¬Ð´½áÊø·û¡£
¸ÐÐËȤµÄͬѧ¿ÉÒÔ×Ô¼ºÉú³É IR Îļþ²é¿´¸ü¶àϸ½Ú£¬ÕâÀï²»ÔÙ׸Êö¡£
.gcda µÄÎļþ/º¯Êý½á¹¹ºÍ .gcno »ù±¾Ò»Ö£¬ÕâÀï²»ÔÙ׸Êö£¬Í³¼Æ²å×®ÐÅÏ¢½á¹¹Èçͼ 4 Ëùʾ¡£¶¨ÖÆ»¯µÄÊä³öÒ²¿ÉÒÔͨ¹ýÐÞ¸ÄÉÏÊöº¯ÊýÍê³É¡£ÎÒÃǵÄÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ß½â¾ö´úÂë
BB ½á¹¹±ä¶¯ºóºÏ²¢µ½ÒÑÓÐ .gcda Îļþ²»¼æÈݵÄÎÊÌ⣬ҲÊÇÐÞ¸ÄÉÏÊöº¯ÊýʵÏֵġ£

ͼ4 ¼ÆÊý×®Êä³ö½á¹¹
¸²¸ÇÂʽâÎö
ÔÚÁ˽âÁËÈçÉÏËùÊö .gcno £¬.gcda Éú³ÉÂß¼ÓëÎļþ½á¹¹Ö®ºó£¬ÎÒÃÇÒÔÀý 1 ÖеĴúÂëΪÀý£¬À´²ûÊö½âÎöËã·¨µÄʵÏÖ¡£
Àý 1 Öлù±¾¿é B0£¬B1 ¶ÔÓ¦µÄ .gcno Îļþ½á¹¹ÈçÏÂͼËùʾ£¬´ÓͼÖпÉÒÔ¿´³ö£¬BB µÄÖ÷½á¹¹ÍêÈ«¼Ç¼ÁË»ù±¾¿éÖ®¼äµÄÌø×ª¹ØÏµ¡£

ͼ5 B0£¬B1 ¶ÔÓ¦Ìø×ªÐÅÏ¢
B0£¬B1 µÄÐÐÐÅÏ¢ÔÚ .gcno ÖбíʾÈçÏÂͼËùʾ£¬B0 ¿éÒòΪÊÇÈë¿Ú¿é£¬Ö»ÓÐÒ»ÐУ¬¶ÔÓ¦ÐкſÉÒÔ´Ó
B1 ½á¹¹ÖлñÈ¡£¬¶ø B1 ÓÐÁ½ÐдúÂ룬»áÒÀ´Î°ÑÐкÅдÈë .gcno Îļþ¡£

ͼ6 B0£¬B1 ¶ÔÓ¦ÐÐÐÅÏ¢
ÔÚÊäÈëÊý×Ö 100 µÄÇé¿öÏ£¬Éú³ÉµÄ .gcda ÎļþÈçÏ£º

ͼ7 ÊäÈë 100 µÃµ½µÄ .gcda Îļþ
ͨ¹ý¿ØÖÆÁ÷³ÌͼÖнڵã³ö±ßµÄÖ´ÐдÎÊý¿ÉÒÔ¼ÆËã³ö BB µÄÖ´ÐдÎÊý£¬ºËÐÄË㷨Ϊ¼ÆËãÕâ¸ö BB µÄËùÓгö±ßµÄÖ´ÐдÎÊý£¬²»´æÔÚ³ö±ßµÄÇé¿öϼÆËãËùÓÐÈë±ßµÄÖ´ÐдÎÊý£¨¾ßÌåʵÏÖ¿ÉÒԲο¼
gcov ¹¤¾ßÔ´Â룩£¬¶ÔÓÚ B0 À´Ëµ£¬¼´¿´ index=0 µÄÖ´ÐдÎÊý¡£¶ø B1 µÄÖ´ÐдÎÊý¼´ index=1£¬2
µÄÖ´ÐдÎÊýµÄºÍ£¬¶ÔÕÕÉÏͼÖÐ .gcda Îļþ¿ÉÒÔÍÆ¶Ï³ö£¬B0 µÄÖ´ÐдÎÊýΪ ctr[0]=1£¬B1
µÄÖ´ÐдÎÊýÊÇ ctr[1]+ctr[2]=1£¬ B2 µÄÖ´ÐдÎÊýÊÇ ctr[3]=0£¬B4 µÄÖ´ÐдÎÊýΪ
ctr[4]=1£¬B5 µÄÖ´ÐдÎÊýΪ ctr[5]=1¡£
¾¹ýÉÏÊö½âÎö£¬×îÖÕÉú³ÉµÄ HTML ÈçÏÂͼËùʾ£¨ÀûÓà lcov£©£º

ͼ8 ¸²¸ÇÂʼì²â±¨¸æ
ÒÔÉÏÊÇ Clang Éú³É¸²¸ÇÂÊÐÅÏ¢ºÍ½âÎöµÄ¹ý³Ì£¬ÏÂÃæ½éÉÜÃÀÍŵ½µê²ÍÒû iOS ÍŶӻùÓÚÒÔÉÏÔÀí×öµÄÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ß¡£
ÔöÁ¿´úÂ븲¸ÇÂʼì²âÔÀí
·½°¸È¨ºâ
ÓÉÓÚ gcov ¹¤¾ß£¨ºÍÇ°ÃæµÄ .gcov ÎļþÇø·Ö£¬gcov ÊǸ²¸ÇÂʱ¨¸æÉú³É¹¤¾ß£©Éú³ÉµÄ¸²¸ÇÂʼì²â±¨¸æ¿É¶ÁÐÔ²»¼Ñ£¬Èçͼ
9 Ëùʾ¡£ÎÒÃÇ×öµÄÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ßÊÇ»ùÓÚ lcov µÄÀ©Õ¹£¬±¨¸æÕ¹Ê¾ÈçÉϽÚĩβͼ 8 Ëùʾ¡£

ͼ9 gcov Êä³ö£¬ÐÐǰÊý×Ö´ú±íÖ´ÐдÎÊý£¬#### ´ú±íûִÐÐ
±È gcov Ö±½ÓÉú³É±¨¸æ¶àÁËÒ»²½£¬lcov µÄ´¦ÀíÁ÷³ÌÊǽ« .gcno ºÍ .gcda Îļþ½âÎö³ÉÒ»¸öÒÔ
.info ½áβµÄÖмäÎļþ£¨Õâ¸öÎļþÒѾ°üº¬È«²¿¸²¸ÇÂÊÐÅÏ¢ÁË£©£¬Ö®ºóͨ¹ý¸²¸ÇÂʱ¨¸æÉú³É¹¤¾ßÉú³É¿É¶ÁÐԱȽϺõÄ
HTML ±¨¸æ¡£
½áºÏǰÁ½ÕÂÄÚÈݺ͸²¸ÇÂʱ¨¸æÉú³É²½Ö裬¸²¸ÇÂÊÉú³ÉÁ÷³ÌÈçÏÂͼËùʾ¡£¿¼Âǵ½ÔöÁ¿´úÂ븲¸ÇÂʼì²âÖдúÂëÔöÁ¿²¿·ÖÐèҪͨ¹ý
Git »ñÈ¡£¬±È½Ï×ÔÈ»µÄÏë·¨ÊÇÓà git diff µÄÐÅϢȥ¹ýÂ˸²¸ÇÂʵÄÄÚÈÝ¡£¸ù¾Ý¹ýÂ˵ãµÄ²»Í¬£¬´æÔÚÒÔÏÂÁ½Ì×·½°¸£º
1.ͨ¹ý GCOVPass ¹ýÂË£¬Ö»¶ÔÐ޸ĵĴúÂë½øÐвå×®£¬Ã¿´ÎÐ޸ĺóÐèÖØÐ²å×®¡£
2.ͨ¹ý .info ¹ýÂË£¬Ò»´ÎÐÔΪËùÓдúÂë²å×®£¬»ñȡȫ²¿¸²¸ÇÂÊÐÅÏ¢£¬¹ýÂ˸²¸ÇÂÊÐÅÏ¢¡£

ͼ10 ¸²¸ÇÂÊÉú³ÉÁ÷³Ì
·ÖÎöÕâÁ½¸ö·½°¸£¬µÚÒ»¸ö·½°¸ÐèÒª×Ô¶¨Òå LLVM µÄ Pass£¬½ø¶ø»áÒýÈëÒÔÏÂÁ½¸öÎÊÌ⣺
Ö»ÄÜʹÓÿªÔ´ Clang ½øÐбàÒ룬²»ÀûÓÚ½ÓÈëÕý³£µÄ¿ª·¢Á÷³Ì¡£
ÿ´ÎÖØÐ²å×®»á¶ªÊ§Ö®Ç°µÄ¸²¸ÇÂÊÐÅÏ¢£¬¶à´ÎÔËÐÐÖ»Äܵõ½×îºóÒ»´ÎµÄ½á¹û¡£
¶øµÚ¶þ¸ö·½°¸Ïà¶Ô¸ü¼ÓÇáÁ¿£¬Ö»ÐèÒª¹ýÂËÖмä¸ñʽÎļþ£¬²»½ö¿ÉÒÔ½â¾öÎÒÃÇÔÚÎÄÕ¿ªÍ·Ìáµ½µÄÎÊÌ⣬Ҳ¿ÉÒÔ±ÜÃâÉÏÊöÎÊÌ⣺
¿ÉÒԺܷ½±ãµØ¼ÓÈ뵽ƽ³£´úÂëµÄ¿ª·¢Á÷³ÌÖУ¬ÉõÖÁ¶Ô¿ª·¢Õß͸Ã÷¡£
δÐÞ¸ÄÎļþµÄ¸²¸ÇÂÊ¿ÉÒÔµþ¼Ó£¨ÓÐÐ޸ĵÄÄÇЩ¿ØÖÆÁ÷³Ìͼ½á¹¹¿ÉÄܱ仯£¬ÎÞ·¨µþ¼Ó£©¡£
Òò´ËÎÒÃÇʵ¼Ê¿ª·¢Ñ¡¶¨µÄ¹ýÂ˵ãÊÇÔÚ .info ¡£ÔÚÑ¡¶¨ÁË·½°¸ 2 Ö®ºó£¬ÎÒÃǶÔÖмäÎļþ .info
½øÐÐÁËһϵÁе÷ÑУ¬È·¶¨ÁËÎļþ»ù±¾¸ñʽ£¨º¯Êý/´úÂëÐи²¸ÇÂʶÔÓ¦µÄÎļþµÄ±íʾ£©£¬ÕâÀï²»ÔÙ׸Êö£¬¾ßÌå¿ÉÒԲο¼
.info Éú³ÉÎĵµ¡£
ÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ßµÄʵÏÖ
ǰһ½ÚÊÇʵÏÖÔöÁ¿´úÂ븲¸ÇÂʼì²âµÄ»ù±¾·½°¸Ñ¡Ôñ£¬ÎªÁ˸üºÃµØ½ÓÈëÏÖÓпª·¢Á÷³Ì£¬ÎÒÃÇ×öÁËÒÔϼ¸·½ÃæµÄÓÅ»¯¡£
½µµÍʹÓóɱ¾
ÔÚ½ÓÈë·½Ãæ£¬½ÓÈëÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ßÖ»ÐèÒ»´Î½ÓÈëÅäÖã¬Í¬²½µ½´úÂë²Ö¿âºó£¬ÍŶÓÖгÉÔ±ÎÞÐèÅäÖü´¿ÉʹÓ㬽µµÍÁ˽ÓÈë³É±¾¡£
ÔÚʹÓ÷½Ã棬¿¼Âǵ½²å×®ÔÚ±àÒëʱ½øÐУ¬¶ÔÈ«²¿´úÂë½øÐвå×®»áºÜ´ó³Ì¶È½µµÍ±àÒëËÙ¶È£¬ÎÒÃÇͨ¹ý½âÎö Podfile£¨iOS
¿ª·¢ÖнÏΪ³£Óõİü¹ÜÀí¹¤¾ß CocoaPods µÄÒÀÀµÃèÊöÎļþ£©£¬Ö»¶Ô Podfile ÖÐʹÓñ¾µØ´úÂëµÄ²Ö¿â½øÐвå×®£¨¿ÉÅäÖÃÖ¸¶¨²Ö¿â£©£¬½µµÍÁËÍŶӵĿª·¢³É±¾¡£
¶Ô¿ª·¢Õß͸Ã÷
½ÓÈëÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ßºó£¬¿ª·¢ÕßÎÞÐèÌØÊâ²Ù×÷£¬Ò²²»ÐèÒª¶Ô¹¤³Ì×öÈÎºÎÆäËûÐ޸ģ¬Õý³£µÄ git commit
´úÂ룬git push µ½Ô¶¶Ë¾Í»á×Ô¶¯Éú³É²¢ÉÏ´«Õâ´Î commit µÄ¸²¸ÇÂÊÐÅÏ¢ÁË¡£
ΪÁË×öµ½ÕâÒ»µã£¬ÎÒÃÇÔÚ½ÓÈë Pod µÄ¹ý³ÌÖУ¬×Ô¶¯²¿ÊðÁË Git µÄ pre-push ½Å±¾¡£ÊìϤ
Git µÄͬѧ֪µÀ£¬Git µÄ hooks ÊÇ¿ª·¢Õߵı¾µØ½Å±¾£¬²»»á±»ÄÉÈë°æ±¾¿ØÖÆ£¬ÈçºÎͨ¹ýÒ»´ÎÅäÖþÍÈÃÕâ¸ö²Ö¿âµÄËùÓÐʹÓóÉÔ±¶¼ÄÜ¿ªÆô£¬ÊÇ×öºÃÕâ¼þʵÄÒ»¸öÄѵ㡣
ÎÒÃÇ¿¼Âǵ½ Pod ±¾Éí»á±»ÄÉÈë°æ±¾¿ØÖÆ£¬Òò´ËÀûÓÃÁË CocoaPods µÄÒ»¸öÊôÐÔ script_phase£¬Ôö¼ÓÁË
Pod ±àÒëºó½Å±¾£¬À´°ïÖúÎÒÃÇ°Ñ pre-push ²åÈëµ½±¾µØ²Ö¿â¡£ÀûÓà script_phase
²åÈ뻹´øÀ´ÁËÁíÍâÒ»¸öºÃ´¦£¬ÎÒÃÇ¿ÉÒÔÖ±½Ó»ñÈ¡µ½¹¤³ÌµÄ»º´æÎļþ£¬Ò²±ÜÃâÁË .gcno / .gcda Îļþ»ñÈ¡µÄ²»È·¶¨ÐÔ¡£Õû¸öÁ÷³ÌÈçÏ£º

ͼ11 pre-push ·Ö·¢Á÷³Ì
¸²¸ÇÂÊÀÛ¼Æ
ÔÚʵÏÖÁ˸²¸ÇÂʵĹýÂ˺ó£¬ÎÒÃÇÔÚʵ¼Ê¿ª·¢ÖÐÓöµ½ÁËÁíÍâÒ»¸öÎÊÌ⣺Ð޸ķÖÖ§/Ñ»·½á¹¹ºóÉú³ÉµÄ .gcda
ÎļþÎÞ·¨ºÍ֮ǰµÄºÏ²¢¡£ ÔÚÕâÖÖÇé¿öÏ£¬__gcov_flush»áÖ±½Ó·µ»Ø£¬²»ÔÙдÈë .gcda ÎļþÁ˵¼Ö¸²¸ÇÂʼì²âʧ°Ü£¬ÕâÒ²ÊÇÊÐÃæÉÏÒÑÓй¤¾ßµÄͨÓÃÎÊÌâ¡£
¶øÕâ¸öÎÊÌâÔÚ¿ª·¢¹ý³ÌÖкܳ£¼û£¬±ÈÈçÎÒÃǸøÀý 1 ÖеÄÓÎÏ·Ôö¼ÓһЩÌáʾ£¬µ±ÊäÈë±ÈÔ¤ÉèÊý×Ö´óʱ£¬ÎÒÃǾÍÌáʾ³öÀ´£¬·´Ö®ÒàÈ»¡£
- (void)guessNumberGame:(NSInteger)guessNumber
{
NSInteger targetNumber = 10;
NSLog(@"Welcome to the game");
if (guessNumber == targetNumber) {
NSLog(@"Bingo!");
} else if (guessNumber > targetNumber) {
NSLog(@"Input number is larger than the given
target!");
} else {
NSLog(@"Input number is smaller than the
given target!");
}
} |
Õâ¸öÎÊÌâÀ§ÈÅÁËÎÒÃǺܾã¬Ò²Íƶ¯Á˶Ը²¸ÇÂʼì²âÔÀíµÄµ÷ÑС£½áºÏÇ°Ãæ¸²¸ÇÂʼì²âµÄÔÀí¿ÉÒÔÖªµÀ£¬²»Äܺϲ¢µÄÔÒòÊÇÉú³ÉµÄ¿ØÖÆÁ÷³Ìͼ±ÈÔÀ´¶àÁËÁ½Ìõ±ß£¨
.gcno ºÍ¾ÉµÄ .gcda Ò²²»ÄÜÆ¥ÅäÁË£©£¬·´Ó³ÔÚ .gcda ÉϾÍÊÇÊý×é¶àÁËÁ½¸öÊý¾Ý¡£¿¼Âǵ½´úÂë±ä¶¯ºó£¬ÔÓеĸ²¸ÇÂÊÐÅÏ¢ÒѾûÓÐÒâÒåÁË£¬µ±·¢Éú±ßÊý²»Ò»ÖµÄʱºò£¬ÎÒÃÇ»áɾ³ýµô¾ÉµÄ
.gcda Îļþ£¬Ö»±£Áô×îР.gcda Îļþ£¨Óб䶯Çé¿öÏ .gcno »áÖØÐÂÉú³É£©¡£ÈçÏÂͼËùʾ£º

ͼ12 ¸²¸ÇÂʳåÍ»½â¾öËã·¨
ÕûÌåÁ÷³Ìͼ
½áºÏÉÏÊöÁ÷³Ì£¬ÎÒÃǵÄÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ßµÄÕûÌåÁ÷³ÌÈçͼ 13 Ëùʾ¡£
¿ª·¢ÕßÖ»Ðè½øÐнÓÈëÅäÖã¬ÔÙ´ÎÔËÐÐʱ£¬¹¤³ÌÖÐÄÇЩ×÷Ϊ±¾µØ²Ö¿â½øÐпª·¢µÄ´úÂë¿â»á±»×Ô¶¯²å×®£¬²¢ÔÚ .git
Ŀ¼²åÈë hooks ÐÅÏ¢£»µ±¿ª·¢ÕßʹÓÃÄ£ÄâÆ÷½øÐÐÐèÇó×Ô²âʱ£¬²å׮ͳ¼Æ½á¹û»á±»×Ô¶¯·Ö·¢³öÈ¥£»ÔÚ´úÂë±»ÍÆµ½Ô¶¶Ëǰ£¬»á¸ù¾Ý²å׮ͳ¼Æ½á¹û£¬Éú³É½ö°üº¬±¾´Î´úÂëÐ޸ĵÄÏêϸÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʱ¨¸æ£¬ÒÔ¼°ÏòÔ¶¶ËÍÆË͸²¸ÇÂÊÐÅÏ¢£»Í¬Ê±Èç¹û²âÊÔ¸²¸ÇÂÊСÓÚ
80% »áÇ¿ÖÆ¾Ü¾øÌá½»£¨¿ÉÅäÖùرգ¬°Ù·Ö±È¿É×Ô¶¨Ò壩£¬±£Ö¤Ö»Óо¹ý³ä·Ö×Ô²âµÄ´úÂë²ÅÄÜÌá½»µ½Ô¶¶Ë¡£

ͼ13 ÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂÊÉú³ÉÁ÷³Ìͼ
×ܽá
ÒÔÉÏÊÇÎÒÃÇÔÚ´úÂ뿪·¢ÖÊÁ¿·½Ãæ×öµÄһЩ»ýÀÛºÍ̽Ë÷¡£Í¨¹ý¶Ô¸²¸ÇÂÊÉú³É¡¢½âÎöÂß¼µÄ̽¾¿£¬ÎÒÃǽҿªÁ˸²¸ÇÂʼì²âµÄÉñÃØÃæÉ´¡£¿ª·¢½×¶ÎµÄÔöÁ¿´úÂ븲¸ÇÂʼì²â£¬¿ÉÒÔ°ïÖú¿ª·¢Õß¾Û½¹±ä¶¯´úÂëµÄÂ߼ȱÏÝ£¬´Ó¶ø¸üºÃµØ±ÜÃâÏßÉÏÎÊÌâ¡£
|