1

在以下情况下,开始调试数字代码的一般策略是什么:

  • 使用积极优化标志编译的代码,在输出中产生偶尔的 NaN 和 Inf
  • -g用(这意味着)编译的代码-O0与调试器一起运行,不再产生 NaN 和 Inf 了?

在这种情况下,我使用的是 Portland Group C++ 编译器 pgCC,并使用了优化选项

-w -fast -O3 -Mipa=fast -Mfprelaxed -Minline=levels:10

然后就

-w -g

对于调试版本。但我相信类似的情况也可能发生g++

编辑:添加打印语句不是一个非常诱人的选项,因为代码不是我写的,它有几千行大,我不知道缩小搜索范围;NaN 可能几乎来自任何地方。

4

3 回答 3

3

我会尝试看看你是否可以启用像 done here 这样的浮点异常,然后看看是否有一些信号 nan 引发了异常。您的编译器中可能有一些编译器标志来启用这些异常。

除此之外,我会进行手动二进制搜索。也就是说,编写一个转储所有变量的函数。然后将程序分成两半,不是按代码行,而是按实际运行的内容,并将其隔离。换句话说,卷起袖子进去。

编辑:这可能不适用于您的情况,因为我给您的链接非常特定于 Win32。但也许它会给你一些线索。或者您可以在免费的 MS 编译器上尝试代码?

于 2012-04-13T13:46:51.940 回答
2

Portland Group 编译器提供了一些伴随指令的选项 - Mfprelaxed; 我会尝试一个一个地设置这些,看看哪些会有所作为。您可能只想从编译中完全删除此指令。

于 2012-04-13T14:14:07.737 回答
2

我想指出,在 g++ 的情况下,-g 标志不会抑制优化(也就是说,它并不意味着 -O0)。包含调试信息的优化可执行文件更难调试,但当然可以这样做。

于 2012-04-13T18:25:01.697 回答