gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:47 24 4
gpt4 key购买 nike

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

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

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

除了编写伪代码,我可以用其他方式做到这一点吗?

谢谢

最佳答案

Can I do this in other way rather than writing dummy code?

是的!

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

Breakpoint properties dialog with Condition set

您可以看到我已经设置了“Condition”属性,每次代码遇到该断点时都会对该属性进行求值 - 但断点只会在条件为 true 时中断。即,如果 check() 在一切正常时返回 true!check() 将在 check()< 时使其中断 返回 false

如果此方法被多次调用,这往往会使您的程序变慢一点,因为通常要评估这样的表达式,调试器必须(内部)中断并评估某些内容。但它的功能很简洁。请注意您还可以设置的所有其他属性,这甚至还没有达到单击“高级”按钮后对话框的样子...

回答您的其他问题:

If I put a breakpoint inside an empty if loop the debugger won't stop there, it only stops at instructions it can execute. Even if you do int a; just a declaration it won't stop.

如果 if block (不是循环)是空的,那么它就没有什么可以停止的。它只能停在实际代码上。 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();
}

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

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

关于c++ - 调试时如何在满足if语句中的条件时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17567401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com