如果在调试时满足if语句中的条件,如何停止? 例如:
if (!check()) {
int a = 0;
}
int a = 0;是虚拟代码然后我在那里放了一个断点。 如果我在一个空的if循环中放置一个断点,调试器就不会停在那里, 它只会在它可以执行的指令处停止。即使你做了一个;只是一个声明 它不会停止。
我可以用其他方式执行此操作而不是编写虚拟代码吗?
由于
答案 0 :(得分:10)
我可以用其他方式执行此操作而不是编写虚拟代码吗?
是!
在调试器中,您应该能够添加断点并将其设置为仅在满足特定条件时中断。如何执行此操作取决于您的IDE,但在我的内容中,我可以右键单击代码编辑器装订线中的断点或单独的“断点”窗口,然后从弹出菜单中选择“属性”。然后我得到这个对话框:
你可以看到我设置了'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。它用于调试时间错误检查。如果条件为假(等于零),则执行立即停止。