我编写了一个if子句,用于检查是否应该破坏程序以进行调试:
if (a < 0) {
a = a;
}
a
不应该变为否定,但我发现它确实存在,并且我想打破调试以查看为什么它会在发生时变为负数,因此我编写了这个if子句。在a = a;
行上我设置了一个断点,如果它进入if子句,它应该停止该程序。问题是线路没有做任何事情(为了不弄乱任何东西是必要的),所以线路被优化掉,断点在if子句之后结束。这个技巧通常有效,但显然编译器这次没有找到它。
语言是C ++,我正在使用qmake
(Qt工具)和mingw
进行编译。
我的问题是,当我在其上设置断点时,如何阻止编译器优化掉代码行?或者是否有其他方法有条件地破解程序进行调试?
答案 0 :(得分:3)
一种可能性是调用I / O功能。在Java中,人们可以写:
if (a < 0) {
System.out.printf("");
}
同样,在C / C ++中,人们可以写:
if (a < 0) {
printf("");
}
即使函数调用实际上是无操作,编译器也不知道,并且不太可能优化调用。
还是有其他方法有条件地破解程序进行调试吗?
许多现代IDE允许用户设置条件断点:Visual Studio,Eclipse。
答案 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
包围,如果代码可能会保留一段时间)插入文字否 - 我知道编译器不会触及。