2012-12-09 47 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

是的。正如我所說的,真正的功能比設計的實例要複雜上千倍。我可以使用調試器,但如果我有這樣一個工具,它會花費我更多的時間。@Dan Nissenbaum – Shuo

+0

如果沒有完整的細節,給出一個很好的答案是非常棘手的,但是調試器不僅僅是基本的斷點和單步執行。您可以使用條件斷點來追蹤執行何時以給定的前提條件結束於意外的地方。對於你的例子,斷點只能在給定的輸入範圍內觸發。 – JasonD

回答

3

您正在查找的關鍵字是「代碼覆蓋率」或「覆蓋率分析」或「代碼覆蓋率分析」。

您使用的工具自然取決於您的其他環境。

+0

謝謝。我也知道代碼覆蓋率,但我自己並沒有真正使用任何代碼覆蓋工具。你介意共享一個已經成功測試和使用的工具嗎? – Shuo

-1

你想要的工具是printfstd::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