2012-12-09 21 views
6

非常に複雑なC++関数をデバッグしているので、入力によっては予期しない結果が出ます。さまざまな入力の下でコードの実行を比較したいので、どの部分がバグの原因になっているのかを知ることができます。コード実行パスを比較できるツールが私が探しているツールです。そのようなツールが存在するかどうか教えてください。そうでなければ、私は同じことをするために採用することができるいくつかのテクニックがありますか?異なるコードで同じコードの実行パスを比較する

私の問題を具体的に説明するために、ここではわかりやすい例を使用しています。

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は関数がまったく同じ実行パスを通過するようにします。一方で、もし彼らが別の道を行くなら、何かが関数内で間違っていたはずです。したがって、実行パスを比較するツールでは、バグをすばやく特定するのに役立つ情報が十分に表示されます。私はそのようなツールを探しています。好ましくはVisual Studio 2010と互換性があります。このようなツールでも変数の値が保持されていると良いでしょう。

P.S.デバッグは私がやりたい最後のものです。なぜなら、私が扱っているコードベースは、簡単なpayTaxの例よりはるかに大きくて複雑なものだからです。

助けてください。ありがとう。

+0

Visual Studio 2010を起動して実行していますか?もしそうなら、関数 'payTax()'の先頭にブレークポイントを置いてデバッガでプログラムを実行しようとしましたか? –

+0

はい。私が言ったように、実際の機能は、考案されたexmpleよりも何千も複雑です。私はデバッガを使用することができましたが、私にこのようなツールがある場合よりもはるかに時間がかかります。@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(... 

EDIT

BTW: "実行パスを比較するツールは十分な情報[...]"を表示しますが、期待している意味でこのようなツール処理すべき大量の情報が明らかになるでしょう。あなたが行うことができる最も良いことは、デバッグし、あなたのコードがあなたが期待することをしていることを確認することです。 "コードカバレッジ"ツールはおそらくあなたのケースには大きすぎるでしょう(また、そのようなツールは安価ではありません)。

+0

私はちょうど例としてこれを使用して以来、コードスタイルと文法の正確さはここでは問題にはなりません。 – Shuo

+0

はい、また私の編集を読む.. – Frunsi

+0

printfとstd:cerrはあまりにも多くの努力をしています。私はこのような大きなコードベースを持っているので、コード自体に慣れていません。 – Shuo

関連する問題