Optimization 如何防止编译器优化断点?

Optimization 如何防止编译器优化断点?,optimization,breakpoints,Optimization,Breakpoints,我编写了一个if子句,检查是否应该中断程序进行调试: if (a < 0) { a = a; } if(a 我的问题是,当我在代码行上设置断点时,如何防止编译器优化代码行?或者是否有其他方法有条件地中断程序以进行调试?我通常在这里放置一个printf(或cout,或任何适合您使用的语言的方法),以便设置断点,例如 if (a < 0) { printf("a < 0 !\n"); // <<< set breakpoint here } i

我编写了一个if子句,检查是否应该中断程序进行调试:

if (a < 0) {
    a = a;
}
if(a<0){
a=a;
}
a
不应该变为负数,但我发现它会变为负数,我想中断调试,看看如果发生这种情况,它为什么会变为负数,因此我编写了这个if子句。在线
a=a我设置了一个断点,如果程序进入if子句,它应该停止程序。问题是该行不做任何事情(这是为了不弄乱任何事情所必需的),因此该行被优化掉,断点在if子句之后结束。这个技巧通常是有效的,但显然编译器这次不是很了解它

<>语言是C++,我用<代码> Quest(Qt工具)和<代码>明文< /COD>
我的问题是,当我在代码行上设置断点时,如何防止编译器优化代码行?或者是否有其他方法有条件地中断程序以进行调试?

我通常在这里放置一个
printf
(或
cout
,或任何适合您使用的语言的方法),以便设置断点,例如

if (a < 0) {
    printf("a < 0 !\n"); // <<< set breakpoint here
}
if(a<0){

printf(“a<0!\n”);//一种可能是调用I/O函数。在Java中,可以编写:

if (a < 0) {
    System.out.printf("");
}
if (a < 0) {
    printf("");
}
if(a<0){
System.out.printf(“”);
}
类似地,在C/C++中,可以编写:

if (a < 0) {
    System.out.printf("");
}
if (a < 0) {
    printf("");
}
if(a<0){
printf(“”);
}
即使函数调用实际上是一个no-op,编译器也不知道这一点,并且不太可能优化调用

或者是否有其他方式有条件地中断程序以进行调试

许多现代IDE允许设置条件断点:,。

我定义了一个NO_OP()宏,它不做任何事情,也不需要使用它的文件包含任何头文件:

#define  NO_OP()  {float f = 0; if (f != 0) exit(0);}

我不知道编译器是否能够优化这个宏,但是它对MinGW来说是有效的。

< P>如果是C或C++,只需定义<代码> A<代码> >代码>易失性<代码>应该有帮助。

< P>它不是可移植的,但是用MSVC我使用<代码>(被代码< > IFNDEF NDEUGG/<代码>…> C++ > INDEF/<代码>如果代码可能保持在一段时间内)插入一个我知道编译器不会接触的文字NOP。< /P>什么语言?什么编译器?@哈罗德:C++和<代码>明文< /代码>,使用QT工具<代码> Quest(我更新了我的问题)。我现在刚看到你的问题,但我已经解决了问题(请参阅已接受的答案)。谢谢,你的无操作建议给了我一个想法!假设编译器有一天会解决这个问题并进行优化,这是非常安全的。