3

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

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

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

语言是 C++,我正在使用qmake(Qt 工具)和mingw.

我的问题是,当我在代码行上设置断点时,如何防止编译器优化掉代码行?还是有其他方法可以有条件地中断程序进行调试?

4

5 回答 5

3

一种可能性是调用 I/O 函数。在 Java 中,可以这样写:

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

类似地,在 C/C++ 中,可以这样写:

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

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

还是有其他方法可以有条件地中断程序进行调试?

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

于 2012-05-09T14:34:14.483 回答
2

如果它是 C 或 C++,简单地定义aasvolatile应该会有所帮助。

于 2012-05-09T23:18:35.387 回答
1

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

if (a < 0) {
    printf("a < 0 !\n"); // <<< set breakpoint here
}
于 2012-05-09T14:34:05.870 回答
1

它不是可移植的,但是我使用 MSVC (如果代码可能会保留一段时间,则__asm nop用 ...<code>#endif 包围)插入我知道编译器不会触及的文字空操作。#ifndef NDEBUG

于 2012-05-09T23:21:12.123 回答
0

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

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

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

于 2012-05-09T23:02:13.540 回答