gcov

2016-09-21 4 views
7

के साथ टेम्पलेट्स की इनलाइनिंग को दबाने के लिए कैसे मैं कोड और शाखा कवरेज प्राप्त करने के लिए जीसीओवी के साथ जीसीसी 4.9 का उपयोग कर रहा हूं। हालांकि, शाखा कवरेज के परिणाम मेरे सी ++ कोड के लिए पूरी तरह से बेकार हैं। ऐसा लगता है कि जीसीसी सभी -fno-*-inline झंडे का उपयोग करने के बावजूद टेम्पलेट्स को रेखांकित करता है।gcov

#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
    string foo; 
    foo = "abc"; 
    cout << foo << endl; 
} 

मैं g++ -O0 -fno-inline -fno-inline-small-functions -fno-default-inline --coverage -fprofile-arcs test.cpp -o test

साथ कार्यक्रम संकलन test, gcovr -r . -b प्रिंट चलाने के बाद:

------------------------------------------------------------------------------ 
          GCC Code Coverage Report 
Directory: . 
------------------------------------------------------------------------------ 
File         Branches Taken Cover Missing 
------------------------------------------------------------------------------ 
test.cpp          14  7 50% 7,8,9,10 
------------------------------------------------------------------------------ 
TOTAL           14  7 50% 
------------------------------------------------------------------------------ 

वहाँ नहीं है एक

यहाँ एक छोटा सा उदाहरण अनुप्रयोग है कि समस्या को दिखाता है हमारे main फ़ंक्शन में एकल शाखा। उदाहरण के लिए, लाइन 7 में string foo; शामिल है। ऐसा लगता है कि std::basic_string<...> के निर्माता में कुछ विवरण हैं, लेकिन main के कवरेज को देखते समय यह उपयोगी जानकारी नहीं है।

समस्या यह है कि इन सभी रेखांकित शाखाएं मिलती हैं और मेरे वास्तविक इकाई परीक्षणों के लिए गणना की गई शाखा कवरेज परिणामस्वरूप लगभग 40% होती है। मुझे अपने कोड की शाखा कवरेज में रूचि है, क्योंकि सी ++ मानक लाइब्रेरी में मैंने कितनी शाखाएं मारां।

क्या कंपाइलर में पूरी तरह से इनलाइनिंग बंद करने या इनलाइन शाखाओं पर विचार करने के लिए जीसीओवी को बताने का कोई तरीका नहीं है? मुझे उस विषय के बारे में जीसीओवी होमपेज या किसी और जगह पर कोई गाइड नहीं मिला।

किसी भी मदद की बहुत सराहना की जाती है।

+2

और gcov आउटपुट फाइलें क्या दिखाती हैं? सभी std लाइब्रेरी कोड को बिना किसी इनलाइन के सारांश में 'test.cpp' के लिए जिम्मेदार ठहराया जाएगा, लेकिन विस्तृत आउटपुट दिखाएगा कि शाखाओं में कौन से वास्तविक कार्य होते हैं। – Useless

उत्तर

4

अच्छा, आपको हमेशा अपनी उम्मीदों को दोबारा जांचना चाहिए। gcov आउटपुट पर खुद को इंगित करने के लिए बहुत बहुत धन्यवाद @ बेकार। आप बिल्कुल सही नहीं थे, हालांकि: शाखाओं को test.cpp फ़ाइल के लिए जिम्मेदार नहीं ठहराया गया है। gcovr-k के साथ चल रहा है और सभी इंटरमीडिएट फाइलों को देखकर दिखाता है कि gcov सही ढंग से #usr#include#c++#4.9#bits#basic_string.h.gcov जैसी फ़ाइलों का उत्पादन करता है जो चीजों के सी ++ मानक लाइब्रेरी पक्ष के लिए कवरेज दिखाते हैं।

हालांकि, test.cpp में सभी शाखाओं का कारण इनलाइन नहीं है। यह अपवाद है। मानक पुस्तकालय में प्रत्येक कॉल संभावित अपवादों के कारण एक शाखा है (उदा। std::bad_alloc)। cat foo.cpp.gcov प्रिंट के माध्यम से

------------------------------------------------------------------------------ 
          GCC Code Coverage Report 
Directory: . 
------------------------------------------------------------------------------ 
File         Branches Taken Cover Missing 
------------------------------------------------------------------------------ 
test.cpp          4  2 50% 10 
------------------------------------------------------------------------------ 
TOTAL           4  2 50% 
------------------------------------------------------------------------------ 

gcov उत्पादन में गहरी खुदाई: संकलक झंडे को -fno-exceptions जोड़ना निम्न उत्पादन देता

 -: 0:Source:test.cpp 
     -: 0:Graph:/home/neverlord/gcov/test.gcno 
     -: 0:Data:/home/neverlord/gcov/test.gcda 
     -: 0:Runs:1 
     -: 0:Programs:1 
     -: 1:#include <string> 
     -: 2:#include <iostream> 
     -: 3: 
     -: 4:using namespace std; 
     -: 5: 
function main called 1 returned 100% blocks executed 100% 
     1: 6:int main() { 
     1: 7: string foo; 
call 0 returned 1 
     1: 8: foo = "abc"; 
call 0 returned 1 
     1: 9: cout << foo << endl; 
call 0 returned 1 
call 1 returned 1 
call 2 returned 1 
function _GLOBAL__sub_I_main called 1 returned 100% blocks executed 100% 
function _Z41__static_initialization_and_destruction_0ii called 1 returned 100% blocks executed 100% 
     4: 10:} 
call 0 returned 1 
branch 1 taken 1 (fallthrough) 
branch 2 taken 0 
branch 3 taken 1 (fallthrough) 
branch 4 taken 0 

शोर लिए खेद है।

संबंधित मुद्दे