Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
iOS ¸²¸ÇÂʼì²âÔ­ÀíÓëÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂʹ¤¾ßʵÏÖ
 
  1779  次浏览      31
 2019-1-28  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×Ô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 ÔöÁ¿´úÂë²âÊÔ¸²¸ÇÂÊÉú³ÉÁ÷³Ìͼ

×ܽá

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

 

   
1779 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì