我有一个只在-O2优化中崩溃的应用程序(使用gcc 4.2.4编译)。当我单步执行代码并到达崩溃并尝试检查值的位置时,我在gdb中得到“值优化”。
我在网上看到这意味着该值存储在寄存器中。我想知道我的崩溃是否与某些信息放在寄存器中这一事实有关?有没有办法打印寄存器中的内容以查看它是否已损坏?有没有办法保持优化但不使用寄存器?
谢谢!
答案 0 :(得分:11)
99%的可能是您的代码中的错误,1%可能是编译器代码生成错误。因此,花费相当多的时间在代码中寻找潜在的错误,但要注意你只是可能找到了代码生成错误(在这种情况下,你需要仔细研究编译器生成的代码)看看问题是什么。)
答案 1 :(得分:5)
在gdb中尝试info registers
。
您可以使用-O0禁用优化,但有些东西可疑,我建议您进一步调查并最终发布代码。
答案 2 :(得分:2)
如果您可以在程序流程中检测到错误,您可以自己进行一些打印,如果它与内存泄漏和内存损坏有关,那么valgrind可能是比gdb更好的朋友。
答案 3 :(得分:0)
这不是问题,在更新版本的gcc中进行积极优化更是一个问题。
答案 4 :(得分:0)
要注意的一件事是指针别名,编译器可以在其中做出不符合的假设,例如,传递给函数的指针不指向该函数也使用的全局变量。 但您可以使用编译器选项等来控制它。