调试时如何在if语句中满足条件时停止

时间:2013-07-10 09:44:18

标签: c++ debugging breakpoints

如果在调试时满足if语句中的条件,如何停止? 例如:

if (!check()) {
  int a = 0;
}

int a = 0;是虚拟代码然后我在那里放了一个断点。 如果我在一个空的if循环中放置一个断点,调试器就不会停在那里, 它只会在它可以执行的指令处停止。即使你做了一个;只是一个声明 它不会停止。

我可以用其他方式执行此操作而不是编写虚拟代码吗?

由于

2 个答案:

答案 0 :(得分:10)

  

我可以用其他方式执行此操作而不是编写虚拟代码吗?

是!

在调试器中,您应该能够添加断点并将其设置为仅在满足特定条件时中断。如何执行此操作取决于您的IDE,但在我的内容中,我可以右键单击代码编辑器装订线中的断点或单独的“断点”窗口,然后从弹出菜单中选择“属性”。然后我得到这个对话框:

Breakpoint properties dialog with Condition set

你可以看到我设置了'Condition'属性,每次代码命中该断点时都会对其进行评估 - 但断点只会在条件为true时中断。也就是说,如果check()在一切正常后返回true!check()会在check()返回false时将其中断。

如果这个方法被大量调用,这往往会使程序变慢一些,因为通常要评估这样的表达式,调试器必须(内部)进入并评估某些东西。但它功能齐全。请注意您可以设置的所有其他属性,并且在单击“高级”按钮后甚至没有达到对话框的样子...

回答您的其他问题:

  

如果我在一个空的if循环中放置一个断点,调试器就不会停止   在那里,它只在它可以执行的指令处停止。即使你这样做   int a;只是声明它不会停止。

如果if块(非循环)为空,则没有任何内容可以停止。它只能停在实际代码上。 int a;只是一个变量声明;对于简单类型,实际上没有为此生成代码。 (例如,它可以用于更复杂的类型,MyClass a;,因为它会调用构造函数。)即使你写了更多的代码:

if (!check()) {
  int a;
  a = 5;
  b = a;
}

你的编译器可能仍然没有为此生成任何代码,因为它可能会发现代码实际上从未做过任何事情。这在某种程度上取决于您的优化设置,但有些编译器会优化它,即使没有任何特定的优化设置。

有时,由于各种原因(有时仅仅是条件评估的速度),打破代码而不是使用IDE会很方便。在这种情况下,我倾向于使用函数调用来打破,因为编译器不知道该功能不会修改程序的状态,也无法对其进行优化:

if (!check()) {
  rand(); // <- breakpoint here
}

但通常很好地利用IDE和调试器功能是一种更好的方法。

编辑:,因为这已经被投票了(谢谢你们)我想我会添加另一种方法,为了完整性。使用interrupt 3, which is patched in by the debugger.发生软件/调试器断点int 3汇编指令只有一个字节长,因此可以通过任何其他指令进行修补;当程序中断时,旧指令可以暂时修补。但是,除了调试器可以将其置于动态之外,您还可以将其放入代码中。

换句话说,您可以强制程序中断代码(并被调试器捕获;如果您没有在调试器下运行,这可能会导致问题;通常,您的程序将中止)通过类似的方式。语法取决于您的环境:

if (!check()) {
  __asm int 3
}

甚至更好,避免依赖于环境的代码,许多C ++编译器都有内在函数或宏,例如DebugBreak();__debugbreak,您可以这样使用:

if (!check()) {
  DebugBreak();
}

当您在调试器下运行程序时,您会发现该行的执行中断。

没有理由正常使用它。我见过的是一个自定义断言处理程序,它在断言失败时进入调试器,但允许执行继续执行。

答案 1 :(得分:0)

使用assertion。它用于调试时间错误检查。如果条件为假(等于零),则执行立即停止。