我正在调试一个非常复杂的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 :(得分:3)
您要查找的关键字是“代码覆盖率”或“覆盖率分析”或“代码覆盖率分析”。
您使用的工具自然取决于您的其他环境。
答案 1 :(得分:-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( ...
修改强>
BTW:“一个比较执行路径的工具会显示足够的信息[...]”,但就你所期望的那样,这样的工具会显示太多要处理的信息。您可以做的最好的事情是调试并验证您的代码是否按预期执行。 “代码覆盖率”工具可能对您的情况来说太大了(而且这些工具也不便宜)。