比较不同输入下相同代码的执行路径 我调试了一个非常复杂的C++函数,它在一些输入下给了我一些意想不到的结果。我想比较不同输入下的代码执行情况,以便找出导致错误的部分。可以比较代码执行路径的工具是我正在寻找的。如果有这样的工具,请告诉我。或者,如果有一些技术我可以用来做同样的事情

比较不同输入下相同代码的执行路径 我调试了一个非常复杂的C++函数,它在一些输入下给了我一些意想不到的结果。我想比较不同输入下的代码执行情况,以便找出导致错误的部分。可以比较代码执行路径的工具是我正在寻找的。如果有这样的工具,请告诉我。或者,如果有一些技术我可以用来做同样的事情,c++,execution,C++,Execution,为了具体描述我的问题,这里我使用了一个人为的例子 假设这是伪代码中的函数 double payTax(double income) { if (income < 10000) return noTax(); else if ( 10000 < income < 30000) return levelOneTax(); else if (30000 < income < 48000) return levelTwo

为了具体描述我的问题,这里我使用了一个人为的例子

假设这是伪代码中的函数

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();
}
双重纳税(双重收入)
{
如果(收入<10000)
返回noTax();
否则如果(10000<收入<30000)
返回levelOneTax();
否则如果(30000<收入<48000)
返回级别二税();
其他的
纳税申报表();
}
给定输入15000,函数计算正确的税额,但不知何故输入16000给出了错误的税额。据推测,输入15000和16000将导致函数通过完全相同的执行路径;另一方面,如果它们走的是不同的路径,那么函数中一定出了问题。因此,一个比较执行路径的工具将显示足够的信息,可以帮助我快速识别错误。我在找这样的工具。最好与Visual Studio 2010兼容。如果这样的工具还保留变量的值,那就更好了

p.S.调试是我最不想做的事情,因为我使用的代码库比简单的payTax示例要大得多,复杂得多


请帮忙。谢谢。

您要查找的关键字是“代码覆盖率”或“覆盖率分析”或“代码覆盖率分析”


您使用的工具自然取决于您环境的其他部分。

您需要的工具是
printf
std::cerr

您的代码中有一个重大错误:像
if(10000
这样的语句将无法按预期工作!您希望像
if(10000
那样编写它

为了保持测试的简单性,请使用以下括号:

if( 10000 < income && income < 30000 ) {
    return levelOneTax();
} else if( ...
if(10000
因为这样添加调试输出就容易多了,如:

if( 10000 < income && income < 30000 ) {
    std::cerr << "using levelOneTax for income=" << income << std::endl;
    return levelOneTax();
} else if( ...
if(10000您是否已启动并运行Visual Studio 2010?如果是,您是否已尝试在函数
payTax()的开头放置断点
,然后在调试器中运行程序?是的。正如我所说,实际的函数比人为的示例复杂上千倍。我可以使用调试器,但这比使用这样的工具花费的时间要多得多。@Dan Nissenbaum没有完整的细节很难给出一个好的答案,但调试器做的不仅仅是调试sic断点和单步执行。您可以使用条件断点来跟踪执行是否在给定的前提条件下意外结束。例如,断点只能在给定的输入范围内触发。@Shuo我也一直在寻找这样的工具(尽管适用于.NET/C#),会发现它非常有用!你找到过任何工具或替代解决方案吗?谢谢。我也知道代码覆盖率,但我自己没有真正使用过任何代码覆盖率工具。你介意分享一个已经成功测试和使用过的工具吗?代码样式和语法正确性在这里不是一个问题,因为我只是把它作为一个例子。printf还有std:cerr太费劲了,因为我有这么大的代码库,而且我对代码本身不熟悉。我想你的意思是代码覆盖工具对我来说太大了。但我正在寻找一个简单的工具,它只提供两次执行的差异,这就是我需要的。另一个想法:尝试类似于“单元测试”的东西是的,AFAIK当前可用的代码覆盖工具对于您的用例来说太大了。