在以下情况下开始调试数字代码的一般策略是什么:
-g
编译的代码(暗示-O0
)与调试器一起运行,不再产生NaN和Inf?在这种情况下,我正在使用Portland Group C ++编译器pgCC,并使用了优化选项
-w -fast -O3 -Mipa=fast -Mfprelaxed -Minline=levels:10
然后只是
-w -g
用于调试版本。但我确信g++
也可能出现类似的情况。
编辑:添加打印语句不是一个非常诱人的选项,因为代码不是由我编写的,它是几千行,并且我不知道缩小搜索范围; NaN可能来自任何地方。
答案 0 :(得分:3)
我会尝试查看是否可以启用浮点异常like done here,然后查看是否存在某些信令nan引发的异常。编译器中可能有一些编译器标志用于启用这些异常。
除此之外我还会进行手动二分查找。也就是说,编写一个转储所有变量的函数。然后将程序分成两半,而不是通过代码行,而是通过实际运行的程序,并将其隔离。换句话说,卷起袖子进去。
编辑:这可能不适用于您的情况,因为我给你的链接非常具体。但也许它会给你一些线索。或者您可以在免费的MS编译器上尝试代码?
答案 1 :(得分:2)
Portland Group编译器为指令提供了一些选项 - Mfprelaxed
;我会尝试逐一设置这些,看看哪些有所作为。您可能只想从编译中删除此指令。
答案 2 :(得分:2)
我想指出,在g ++的情况下,-g标志不会抑制优化(也就是说,它并不意味着-O0)。包含调试信息的优化可执行文件更难调试,但肯定可以这样做。