调试堆栈值损坏的好方法

lau*_*auw 5 c++ linux debugging gcc stack-corruption

什么是调试堆栈值损坏的好方法。在我的程序中,有时在返回对文件描述符进行关闭的方法后,此指针的地址会更改。我调试了几个小时的程序,但找不到问题。

找出改变此指针地址的有效方法是什么?当我在此指针上手动添加监视时,不会发生错误。当我尽可能减少代码时,仍然会发生错误。我尝试了Valgrind,但未发现任何早期堆栈损坏。

我设法检测到何时发生错误,我以64位模式编译了代码。此地址从0xxxxxxx更改为0x1000000xxxxxxx。我在发生错误的方法中检查了这个地址,发现了地址更改的时间(有关此信息,请参见第一个段落)。

还有其他方法可以找出造成此问题的原因吗?

Ali*_*Ali 6

您可能想尝试一下address-sanitizer。它在 gcc 4.8 中可用:

AddressSanitizer 是一种快速内存错误检测器,已添加并可通过-fsanitize=address. 内存访问指令将用于检测堆、堆栈和全局缓冲区溢出以及释放后使用错误。要获得更好的堆栈跟踪,请使用 -fno-omit-frame-pointer. AddressSanitizer 在 IA-32/x86-64/x32/PowerPC/PowerPC64 GNU/Linux 和 x86-64 Darwin 上可用。

在GCC(但显然不是铛),你需要指定-fsanitize=address在这两个编译器标志和链接标志,如在这个相关的答案。

  • 再想一想,您可能想要完全禁用优化(`-O0`)并添加`-ggdb3` 和`-fno-omit-frame-pointer`(我知道您添加了后者)。希望这可以帮助。 (2认同)