我正在使用Visual Studio调试C / C ++代码。有一个循环被称为10000次并且在其中一个交互中,在循环结束时,有一个错误,因为程序试图访问长度为N的数组的N + 1值。我想回去调试错误的起源,我想知道在调试模式下,Visual Studio是否可以直观地突出显示或告诉我执行了哪些源代码行。然后更容易找到错误。有人知道这是否可行?
如果VS无法做到这一点,还有哪些方法可以做到这一点?
由于
编辑:我也想知道是否可以使用任何其他IDE(Eclipse,Xcode,命令行等)来完成此操作
答案 0 :(得分:9)
将条件断点放在数组访问的位置。这样你的程序就会在第N + 1次访问中断,你将拥有完整的堆栈跟踪。
答案 1 :(得分:6)
如果您知道必须进行多少次迭代(在本例中为10,000次),您肯定可以在 n 的循环上插入一个命中计数(错误之前的一个),然后再执行步骤 - 通过下一次迭代使用Intellisense为您提供有关可能导致问题的信息?
您是否有任何可以帮助我们的代码?
答案 2 :(得分:5)
vs2010中的intellitrace可以做到这一点
答案 3 :(得分:1)
我不知道任何此类工具,但替代方案是在每个条件中打印一条不同的消息。
if(somethingThatMightNotHappen) {
printf("This happened.\n");
...
}
答案 4 :(得分:1)
不,VS调试器不允许您向后移动。
但是,看一下条件断点。当循环运行Nth(或N-1th或其他)时间或满足特定条件(如变量idx > 1000
)并逐步执行代码时,您可能会中断。
答案 5 :(得分:0)
如果在Visual Studio中设置代码分析,则可以将其配置为提供代码覆盖率信息,这些信息将提供您要查找的一些信息,但它无助于解决问题。
我将采取的方法是将循环计数减少到可管理的数量(比如10)并逐步完成代码。如果你知道你期望发生什么,我发现通过代码并验证它正在执行你期望的小测试集的操作可以澄清任何奇怪的行为。
根据我的经验,没有什么可以预测计算机会做什么,然后验证你们都同意。最常见的原因是:
Off-by-one(最后三个)只是算法中最常见的错误。
答案 6 :(得分:0)
单元测试框架可以满足您的需求。您需要创建一个运行您要调用的函数的单元测试。然后,编辑测试运行配置以启用代码覆盖。
最后,一旦您运行了单元测试(可以只执行一行代码),请转到“代码覆盖率结果”窗口并选择“显示代码覆盖率颜色”选项。执行的代码将显示为蓝色,未执行的代码将显示为红色。
Nifty,是吗?
更新在回应有关C ++的评论时,我确实认为此功能适用于C ++,但我从未使用过它。尝试右键单击实现要测试代码覆盖率的函数的代码。应该有一个选项说“创建单元测试”。在执行此操作之前,请务必构建代码。
答案 7 :(得分:0)
尝试捕捉异常!只需将循环中的代码放入try-block后跟一个带断点的catch-block。
答案 8 :(得分:0)
其中一些调试技术已经被提及,我不能保证所有使用C ++的工作,但ScottGu在他的blog post中有一个很好的技巧列表。
我想你已经知道了这一点,但对我来说,就像你在调试模式中寻找调用堆栈选项卡一样。您可以在循环中使用命中计数或条件调试模式,当出现错误时,您将返回到调用堆栈中的数据来源并设置一些断点。然后,您可以再次运行程序并检查数据的构建方式。