2012-12-09 28 views
6

मैं एक बहुत ही जटिल सी ++ फ़ंक्शन डिबग कर रहा हूं जो मुझे कुछ इनपुट के तहत कुछ अप्रत्याशित परिणाम देता है। मैं अलग-अलग इनपुट के तहत कोड निष्पादन की तुलना करना चाहता हूं ताकि मुझे पता चल सके कि कौन सा हिस्सा मुझे बग का कारण बनता है। उपकरण जो कोड निष्पादन पथों की तुलना कर सकता है वह है जिसे मैं ढूंढ रहा हूं। अगर ऐसा उपकरण मौजूद है तो कृपया मुझे बताएं। या अन्यथा अगर कुछ तकनीकें हैं तो मैं एक ही काम करने के लिए नियोजित कर सकता हूं?विभिन्न इनपुट के तहत एक ही कोड के निष्पादन पथ की तुलना करें

मेरी समस्या का ठोस रूप से वर्णन करने के लिए, यहां मैं एक प्रदूषित उदाहरण का उपयोग कर रहा हूं।

double payTax(double income) 
{ 
    if (income < 10000) 
     return noTax(); 
    else if (10000 < income < 30000) 
     return levelOneTax(); 
    else if (30000 < income < 48000) 
     return levelTwoTax(); 
    else 
     return levelThreeAboveTax(); 
} 

को देखते हुए इनपुट 15000, समारोह कर की सही मात्रा की गणना करता है, लेकिन किसी भी तरह इनपुट 16000 एक गलत कर राशि देता है इस स्यूडोकोड में समारोह है कहो,। माना जाता है कि इनपुट 15000 और 16000 फ़ंक्शन को उसी निष्पादन पथ के माध्यम से जाने का कारण बनता है; दूसरी ओर, यदि वे अलग-अलग पथ जाते हैं, तो फ़ंक्शन के भीतर कुछ गलत हो जाना चाहिए। इसलिए, एक उपकरण जो निष्पादन पथ की तुलना करता है वह पर्याप्त जानकारी प्रकट करेगा जो मुझे तुरंत बग की पहचान करने में मदद कर सकता है। मैं इस तरह के एक उपकरण की तलाश में हूँ। विजुअल स्टूडियो 2010 के साथ पसंदीदा रूप से संगत। यह बेहतर होगा यदि ऐसा टूल चर के मान भी रखता है।

पीएस डीबगिंग आखिरी चीज है जो मैं करना चाहता हूं क्योंकि जिस कोड बेस के साथ मैं काम कर रहा हूं वह मामूली पेटेक्स उदाहरण से काफी बड़ा और जटिल है।

कृपया मदद करें। धन्यवाद।

+0

क्या आपके पास विजुअल स्टूडियो 2010 है और चल रहा है? यदि हां, तो क्या आपने फ़ंक्शन 'payTax()' की शुरुआत में ब्रेकपॉइंट डालने का प्रयास किया है, और फिर प्रोग्राम को डीबगर में चला रहा है? –

+0

हां। जैसा कि मैंने कहा है, वास्तविक कार्य प्रत्याशित अपमान से हजार गुना अधिक जटिल है। मैं डीबगर का उपयोग कर सकता था, लेकिन अगर मेरे पास ऐसा उपकरण था तो मुझे अधिक समय लगेगा।@Dan Nissenbaum – Shuo

+0

पूर्ण विवरण के बिना एक अच्छा जवाब देना मुश्किल है, लेकिन डीबगर केवल मूल ब्रेकपॉइंट्स और सिंगल-स्टेपिंग से अधिक करता है। जब आप निष्पादन किसी पूर्व शर्त के साथ कहीं अप्रत्याशित होते हैं तो आप ट्रेस करने के लिए सशर्त ब्रेकपॉइंट्स का उपयोग कर सकते हैं। आपके उदाहरण के लिए, ब्रेकपॉइंट केवल इनपुट की एक निश्चित सीमा पर ही आग लग सकता है। – JasonD

उत्तर

3

जो कीवर्ड आप खोज रहे हैं वह "कोड कवरेज" या "कवरेज विश्लेषण" या "कोड कवरेज विश्लेषण" है।

आपके द्वारा उपयोग किए जाने वाले टूल का स्वाभाविक रूप से आपके शेष वातावरण पर निर्भर करेगा।

+0

धन्यवाद। मुझे कोड कवरेज के बारे में भी पता था, लेकिन मैंने वास्तव में किसी भी कोड कवरेज टूल का उपयोग नहीं किया है। क्या आप एक उपकरण साझा करते हैं जिसे सफलतापूर्वक परीक्षण और उपयोग किया गया है? – Shuo

-1

उपकरण जो आप चाहते हैं printf या std::cerr है!

और आपके कोड में पर्याप्त त्रुटि है: if (10000 < income < 30000) जैसे एक बयान अपेक्षित काम नहीं करेगा! आप इसे if(10000 < income && income < 30000) लिखना चाहते हैं। डिबग आउटपुट को जोड़ने के लिए, के रूप में

if(10000 < income && income < 30000) { 
    return levelOneTax(); 
} else if(... 

तो क्योंकि यह बहुत आसान हो जाएगा::

और सरल का परीक्षण करने, के रूप में कर्ली कोष्ठक का उपयोग करें

if(10000 < income && income < 30000) { 
    std::cerr << "using levelOneTax for income=" << income << std::endl; 
    return levelOneTax(); 
} else if(... 

संपादित

बीटीडब्लू: "एक उपकरण जो निष्पादन पथ की तुलना करता है पर्याप्त जानकारी प्रकट करेगा [...]", लेकिन जिस अर्थ में आप उम्मीद कर रहे हैं, इस तरह के उपकरण संभालने के लिए बहुत सारी जानकारी प्रकट होगी। सबसे अच्छी बात यह है कि आप डीबगिंग और सत्यापन कर रहे हैं कि आपका कोड वह कर रहा है जो आप उम्मीद करते हैं। आपके मामले के लिए "कोड कवरेज" टूल शायद बहुत बड़ा होगा (और ऐसे टूल भी सस्ते नहीं हैं)।

+0

कोड शैली और ग्रामा शुद्धता यहां कोई चिंता नहीं है क्योंकि मैंने इसे अभी एक उदाहरण के रूप में उपयोग किया है। – Shuo

+0

हां, लेकिन मेरे संपादन को भी पढ़ें .. – Frunsi

+0

printf और std: cerr बहुत अधिक प्रयास है क्योंकि मेरे पास इतना बड़ा कोड बेस है और मैं कोड से परिचित नहीं हूं। – Shuo