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

时间:2012-05-09 14:31:34

标签: optimization breakpoints

我编写了一个if子句,用于检查是否应该破坏程序以进行调试:

if (a < 0) {
    a = a;
}

a不应该变为否定,但我发现它确实存在,并且我想打破调试以查看为什么它会在发生时变为负数,因此我编写了这个if子句。在a = a;行上我设置了一个断点,如果它进入if子句,它应该停止该程序。问题是线路没有做任何事情(为了不弄乱任何东西是必要的),所以线路被优化掉,断点在if子句之后结束。这个技巧通常有效,但显然编译器这次没有找到它。

语言是C ++,我正在使用qmake(Qt工具)和mingw进行编译。

我的问题是,当我在其上设置断点时,如何阻止编译器优化掉代码行?或者是否有其他方法有条件地破解程序进行调试?

5 个答案:

答案 0 :(得分:3)

一种可能性是调用I / O功能。在Java中,人们可以写:

if (a < 0) {
    System.out.printf("");
}

同样,在C / C ++中,人们可以写:

if (a < 0) {
    printf("");
}

即使函数调用实际上是无操作,编译器也不知道,并且不太可能优化调用。

  

还是有其他方法有条件地破解程序进行调试吗?

许多现代IDE允许用户设置条件断点Visual StudioEclipse

答案 1 :(得分:1)

我通常会在这里放置一个printf(或cout,或任何适合您所用语言的内容),这样我就可以设置一个断点,例如

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

答案 2 :(得分:1)

如果是C或C ++,只需将a定义为volatile即可。

答案 3 :(得分:0)

我定义了一个NO_OP()宏,该宏不执行任何操作,并且不需要使用它的文件包含任何头文件:

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

我不知道编译器是否能够优化此宏,但它适用于MinGW。

答案 4 :(得分:0)

它不可移植,但使用MSVC我使用__asm nop#ifndef NDEBUG ... #endif包围,如果代码可能会保留一段时间)插入文字否 - 我知道编译器不会触及。