debugging堆栈值损坏的好方法

什么是debugging堆栈值损坏的好方法。 在我的一个程序中,有时候这个指针的地址会在一个方法返回之后被改变,在文件描述符上closures。 我debugging了几个小时的程序,但我找不到问题。

找出什么改变了这个指针的地址是一个好方法? 当我手动添加一个手表在这个指针上的错误不会发生。 当我尽可能剥离我的代码时,错误仍然发生。 我试过Valgrind,但没有发现任何早期的堆栈损坏。

我设法检测到错误发生时,我编译的代码在64位模式。 这个地址从0xxxxxxx更改为0x1000000xxxxxxx。 我在发生错误的方法中检查这个地址,发现地址改变时(见第一个paragraaf)。

有没有其他的方法来找出这个问题的原因?

你可能想给地址消毒剂 。 它在gcc 4.8中可用 :

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