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