这个函数被埋在一个复杂的嵌套中,所以实际上找到原因可能超出我能提出的任何要求,但我想知道是否有人可能能够提供一些关于我如何进行调试的提示.
这是我遇到问题的代码的要点
这是我遇到问题的代码的要点
//func1.c somestruct* func1(somestruct* mystruct) { printf("func1: %p,%i\n",mystruct,mystruct->foo); return mystruct; } //func2.c somestruct* func1(somestruct* mystruct); void func2() { somestruct *mystruct = malloc(sizeof(somestruct)); mystruct->foo = 10; printf("func2: %p,mystruct->foo); mystruct = func1(mystruct); printf("back in func2: %p\n",mystruct); free(mystruct); }
我叫func2.输出是这样的
func2: 0x7f38a00008c0,10 func1: 0x7f38a00008c0,10 back in func2: 0xffffffffa00008c0 (SEGFAULT trying to free 0xffffffffa00008c0)
实际代码更复杂,“mystruct”在许多其他地方传递也没有问题,函数在不同文件中的事实似乎可能是问题的一部分,是的,它需要返回指针(返回的指针不保证与输入指针相同).
对我来说,它有点(但实际上并没有)被截断为32位,然后在顶部填充ffffffff,这似乎很奇怪.
在32位机器上编译时,它的工作原理完全正常.
我在某处考虑过内存损坏,所以我通过valgrind运行它. Valgrind报告没有错误,实际上导致它成功完成.教科书heisenbug.至少我可以使用GDB.
有没有人知道可能导致这种情况的原因,或者至少我如何开始追查问题?