2012-12-09 18 views
6

Sto debug di una funzione molto complessa C++ che mi dà alcuni risultati inaspettati sotto alcuni input. Mi piacerebbe confrontare le esecuzioni di codice con input diversi in modo da scoprire quale parte mi provoca bug. Il strumento che può confrontare percorsi di esecuzione di codice è quello che sto cercando. Per favore fatemi sapere se esiste uno strumento del genere. O altrimenti se ci sono alcune tecniche che posso impiegare per fare la stessa cosa?Confronta percorsi di esecuzione dello stesso codice sotto diversi ingressi

Per descrivere concretamente il mio problema, qui sto usando un esempio forzato.

dire che questo è la funzione in pseudocodice ,

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(); 
} 

ingresso Dato 15000, la funzione calcola l'importo esatto dell'imposta, ma in qualche modo ingresso 16000 fornisce una quantità tassa erronea. Presumibilmente, l'input 15000 e 16000 farebbe in modo che la funzione attraversasse esattamente gli stessi percorsi di esecuzione; d'altra parte, se vanno su percorsi diversi, allora qualcosa deve essere andato storto all'interno della funzione. Pertanto, uno strumento che confronta i percorsi di esecuzione rivelerebbe abbastanza informazioni che potrebbero aiutarmi a identificare rapidamente il bug. Sto cercando uno strumento del genere. Preferibilmente compatibile con Visual Studio 2010. Sarebbe meglio se un tale strumento mantenga anche i valori delle variabili.

P.S. il debug è l'ultima cosa che voglio fare perché la base di codice con cui sto lavorando è molto più grande e complessa rispetto al banale esempio payTax.

Per favore aiuto. Grazie.

+0

Avete Visual Studio 2010 installato e funzionante? In tal caso, hai provato a posizionare un punto di interruzione all'inizio della funzione 'payTax()', e poi eseguendo il programma nel debugger? –

+0

Sì. Come ho già detto, la funzione reale è mille volte più complessa dell'espansione inventata. Potrei usare il debugger, ma mi costerebbe molto più tempo che se avessi uno strumento del [email protected] Dan Nissenbaum – Shuo

+0

Senza dettagli completi è difficile dare una buona risposta, ma il debugger fa molto più che semplici breakpoint e single-stepping. È possibile utilizzare i punti di interruzione condizionali per tracciare quando l'esecuzione termina in qualche modo inaspettato con una pre-condizione specifica. Per il tuo esempio, il punto di interruzione potrebbe essere attivato solo su un determinato intervallo di input. – JasonD

risposta

3

Le parole chiave che stai cercando sono "copertura del codice" o "analisi della copertura" o "analisi della copertura del codice".

Quale strumento si utilizzerà dipenderà naturalmente dal resto dell'ambiente.

+0

Grazie. Ero anche a conoscenza della copertura del codice, ma non ho mai utilizzato nessuno strumento di copertura del codice. Ti dispiace condividere uno strumento che è stato testato e utilizzato con successo? – Shuo

-1

Lo strumento desiderato è printf o std::cerr!

E si ha un errore sostanziale nel codice: una dichiarazione come if (10000 < income < 30000) non funzionerà come previsto! Vuoi scriverlo come if(10000 < income && income < 30000).

E per mantenere test semplice, si prega di utilizzare le parentesi graffe come in:

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

Perché allora sarà molto più facile da aggiungere output di debug, come in:

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

EDIT

BTW: "uno strumento che confronta i percorsi di esecuzione rivelerebbe informazioni sufficienti [...]", MA nel senso che ti aspetti, tale strumento rivelerebbe TROPPO informazioni da gestire. La cosa migliore che puoi fare è eseguire il debug e verificare che il tuo codice stia facendo ciò che ti aspetti che faccia. Uno strumento di "copertura del codice" sarebbe probabilmente troppo grande per il tuo caso (e anche questi strumenti non sono economici).

+0

Lo stile del codice e la correttezza del gramma non sono un problema in quanto ho usato questo esempio. – Shuo

+0

Sì, ma leggi anche la mia modifica .. – Frunsi

+0

printf e std: cerr è troppo impegnativo perché ho una base di codice così grande e non ho familiarità con il codice stesso. – Shuo

Problemi correlati