2016-05-20 14 views
5

मैं एक C++ लाइब्रेरी में मीट्रिक परीक्षण कवरेज के लिए gcov का उपयोग कर रहा हूं। किसी कारण से, gcov निष्पादन योग्य के रूप में कई फ़ाइलों में लाइनों को पहचान नहीं रहा है। किसी दिए गए फ़ाइल में 160-कुछ लाइनों में से यह कहेंगे कि उनमें से 40 निष्पादन योग्य हैं। उदाहरण के लिए:gcov स्रोत फ़ाइल में लाइनों को अनदेखा कर रहा है

  -: 0:Source:../evo/NK.h 
    -: 0:Graph:test_driver.gcno 
    -: 0:Data:test_driver.gcda 
    -: 0:Runs:1 
    -: 0:Programs:1 
    -: 1:// This file is part of Empirical, https://github.com/devosoft/Empirical 
    -: 2:// Copyright (C) Michigan State University, 2016. 
    -: 3:// Released under the MIT Software license; see doc/LICENSE 
    -: 4:// 
    -: 5:// 
    -: 6:// This file provides code to build NK-based algorithms. 
    -: 7: 
    -: 8:#ifndef EMP_EVO_NK_H 
    -: 9:#define EMP_EVO_NK_H 
    -: 10: 
    -: 11:#include <array> 
    -: 12: 
    -: 13:#include "../tools/BitVector.h" 
    -: 14:#include "../tools/const_utils.h" 
    -: 15:#include "../tools/Random.h" 
    -: 16:#include "../tools/vector.h" 
    -: 17: 
    -: 18:namespace emp { 
    -: 19:namespace evo { 
    -: 20: 
    -: 21: class NKLandscape { 
    -: 22: private: 
    -: 23: const uint32_t N; 
    -: 24: const uint32_t K; 
    -: 25: const uint32_t state_count; 
    -: 26: const uint32_t total_count; 
    -: 27: emp::vector< emp::vector<double> > landscape; 
    -: 28: 
    -: 29: public: 
    -: 30: NKLandscape() = delete; 
    -: 31: NKLandscape(const NKLandscape &) = delete; 
    -: 32: NKLandscape(int _N, int _K, emp::Random & random) 
    -: 33:  : N(_N), K(_K) 
    -: 34:  , state_count(emp::constant::IntPow<uint32_t>(2,K+1)) 
    -: 35:  , total_count(N * state_count) 
    -: 36:  , landscape(N) 
    -: 37: { 
    -: 38:  for (auto & ltable : landscape) { 
    -: 39:  ltable.resize(state_count); 
    -: 40:  for (double & pos : ltable) { 
    -: 41:   pos = random.GetDouble(); 
    -: 42:  } 
    -: 43:  } 
    -: 44: } 
    -: 45: ~NKLandscape() { ; } 
    -: 46: NKLandscape & operator=(const NKLandscape &) = delete; 
    -: 47: 
    -: 48: int GetN() const { return N; } 
    -: 49: int GetK() const { return K; } 
    -: 50: int GetStateCount() const { return state_count; } 
    -: 51: int GetTotalCount() const { return total_count; } 
    -: 52: 
    -: 53: double GetFitness(int n, uint32_t state) const { 
    -: 54:  emp_assert(state < state_count, state, state_count); 
    -: 55:  return landscape[n][state]; 
    -: 56: } 
    -: 57: double GetFitness(std::vector<uint32_t> states) const { 
    -: 58:  emp_assert(states.size() == N); 
    -: 59:  double total = landscape[0][states[0]]; 
    -: 60:  for (int i = 1; i < N; i++) total += GetFitness(i,states[i]); 
    -: 61:  return total; 
    -: 62: } 
    -: 63: double GetFitness(BitVector genome) const { 
    -: 64:  emp_assert(genome.GetSize() == N); 
    -: 65: 
    -: 66:  // Use a double-length genome to easily handle wrap-around. 
    -: 67:  genome.Resize(N*2); 
    -: 68:  genome |= (genome << N); 
    -: 69: 
    -: 70:  double total = 0.0; 
    -: 71:  uint32_t mask = emp::constant::MaskLow<uint32_t>(K+1); 
    -: 72:  for (int i = 0; i < N; i++) { 
    -: 73:  const uint32_t cur_val = (genome >> i).GetUInt(0) & mask; 
    -: 74:   const double cur_fit = GetFitness(i, cur_val); 
    -: 75:  total += cur_fit; 
    -: 76:  } 
    -: 77:  return total; 
    -: 78: } 
    -: 79: }; 
    -: 80: 
    -: 81:} 
    3: 82:} 
    -: 83: 
    -: 84:#endif 

यहाँ, gcov लगभग सभी गैर-निष्पादन के रूप में फ़ाइल की पंक्तियों के निशान है, लेकिन लाइन 82 का 3 फांसी ट्रैक करता है: एक भी बंद कोष्ठक।

यह मुझे कोई समझ नहीं आता है और मैं वेब पर इस मुद्दे के बारे में कुछ भी नहीं ढूंढ पाया। किसी भी तरह की सहायता का स्वागत किया जाएगा।

उत्तर

1

यहाँ gcov के व्यवहार (और gcovr और lcov जैसे संबंधित सॉफ्टवेयर) के लिए एक मोटा प्रवाह संचित्र है:

gcov data flow

चित्रा: gcov डेटा प्रवाह

जब संकलक (जीसीसी) ऑब्जेक्ट कोड उत्पन्न करता है और कवरेज/प्रोफाइलिंग इंस्ट्रूमेंटेशन डालने के लिए कहा गया था, यह दो अतिरिक्त चीजें करता है:

  • ऑब्जेक्ट कोड निष्पादन पर एक .gcda फ़ाइल में कवरेज मीट्रिक लिखने के लिए वाद्ययंत्र है।
  • ए .gcno फ़ाइल जेनरेट की गई है, जो ऑब्जेक्ट कोड की संरचना का वर्णन करती है।

gcov उपयोगिता तब कवरेज मीट्रिक की गणना करने के लिए .gcda और .gcno फ़ाइलों को पार करती है। एनोटेटेड स्रोत रिपोर्ट के लिए, यह स्रोत फ़ाइल भी पढ़ता है।

क्योंकि यह संकलक है जो यह निर्धारित करता है कि ऑब्जेक्ट कोड का कौन सा हिस्सा किसी विशेष रेखा से मेल खाता है, जो रिपोर्ट आपने दिखायी है वह सही है: वह पंक्ति मौजूद नहीं है। अधिक सटीक: उन स्रोत कोड लाइनों के लिए कोई ऑब्जेक्ट कोड उत्पन्न नहीं हुआ था। यह आमतौर पर अपेक्षित व्यवहार होता है, क्योंकि कई स्रोत कोड लाइनें संकलित-समय घोषणाएं होती हैं।

आपके मामले में आपके पास inline functions के साथ एक सी ++ कक्षा है (कक्षा परिभाषा के भीतर कोई फ़ंक्शन परिभाषाएं अंतर्निहित रूप से इनलाइन हैं)। कंपाइलर को इनलाइन फ़ंक्शंस के लिए कोड उत्पन्न करने की आवश्यकता नहीं है जिनका उपयोग नहीं किया जाता है। यदि आप गैर-इनलाइन फ़ंक्शंस का उपयोग करते हैं तो यह अलग होगा, यानी हेडर फ़ाइल में फ़ंक्शंस घोषित करें और एक .cpp फ़ाइल में कार्यान्वयन प्रदान करें।

तो बंद होने वाली ब्रेस के तीन निष्पादन के साथ क्या हो रहा है? कंपाइलर को अक्सर स्थैतिक वस्तुओं के प्रारंभिकरण और सफाई के साथ जुड़े कुछ कोड को उत्सर्जित करने की आवश्यकता होती है। यह कोड वास्तव में एक विशिष्ट रेखा से जुड़ा नहीं है, और इसलिए आपकी संकलन इकाई में अंतिम पंक्ति के हिस्से के रूप में दिखाई देता है।

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