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

C++ 调试时,如何在满足if语句中的条件时停止,c++,debugging,breakpoints,C++,Debugging,Breakpoints,调试时,如果满足if语句中的条件,如何停止? 例如: if (!check()) { int a = 0; } int a=0;是伪代码,然后我在那里放了一个断点。 如果我把断点放在一个空的If循环中,调试器就不会停在那里, 它只在可以执行的指令处停止。即使你做了INTA;只是一份声明 它不会停止 我可以用其他方式来做这件事,而不是编写伪代码吗 谢谢请使用手机。它用于调试时错误检查。如果条件为false(等于零),执行将立即停止 我可以用其他方式来做这件事,而不是编写伪代码吗 对! 在调试

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

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

我可以用其他方式来做这件事,而不是编写伪代码吗

谢谢

请使用手机。它用于调试时错误检查。如果条件为false(等于零),执行将立即停止

我可以用其他方式来做这件事,而不是编写伪代码吗

对!

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

您可以看到,我设置了“Condition”属性,每次代码到达该断点时都会对该属性进行计算,但只有当条件为
true
时,断点才会中断。也就是说,如果一切正常时
check()
返回
true
!check()
将在
check()
返回
false
时使其中断

如果频繁调用此方法,则会使程序速度减慢一点,因为通常要计算这样的表达式,调试器必须(在内部)插入并计算某些内容。但它的功能很好。请注意,您还可以设置所有其他属性,但在单击“高级”按钮后,这些属性甚至无法显示对话框的外观

要回答您的其他问题:

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

如果If块(非循环)是空的,那么它就没有什么可以停止的。它只能在实际代码上停止<代码>INTA只是一个变量声明;对于简单类型,实际上没有为此生成代码。(它可以用于更复杂的类型,例如,
MyClass a;
,因为这样会调用构造函数。)即使您编写了更多的代码:

if (!check()) {
  int a;
  a = 5;
  b = a;
}
您的编译器可能仍然不会为此生成任何代码,因为它可能会发现代码实际上从未执行任何操作。这在某种程度上取决于您的优化设置,但有些编译器甚至在没有任何特定优化设置的情况下也会对其进行优化

有时,出于各种原因(有时只是条件计算的速度),插入代码比使用IDE更方便。在这种情况下,我倾向于使用函数调用来打开,因为编译器不知道函数不会修改程序的状态,也无法优化它:

if (!check()) {
  rand(); // <- breakpoint here
}
<>或者更好的是,避免依赖环境的代码,许多C++编译器有本质或宏,比如或<代码>·*Debug破解> /Cord>,你可以这样使用:

if (!check()) {
  DebugBreak();
}
当您在调试器下运行程序时,您会发现执行在该行中断


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

您的平台是什么?大多数调试器应该能够使用某种条件断点。“它只在可以执行的指令处停止”,这让我想知道您是否可以用一种优化这些指令的方式进行编译。我认为,更大的问题是,为什么if语句体为空?您不能在声明处设置断点,但是,如果同时初始化变量,则通常可以。在
inta=0处设置断点应该没有问题,假设未启用优化进行编译。但由于它都是伪代码,只需在代码中使用断言或在调试器中使用条件断点即可。@JoachimPileborg他不希望if语句体为空。他只想在条件满足时有一个断点。user2381422您应该按照Matzi所述进行断言,不是吗?这里还有一个很好的例子:OP似乎想要调试中断,而不是中止程序。
if (!check()) {
  DebugBreak();
}