int main () {
allocating_resource();
call_other_libs();
...
release_resource();
return 0;
}
程序运行后,主程序返回。
在访问returne 0
之后,堆栈指针指向main()中的错误地址,然后可执行文件崩溃。
编程接收信号SIGSEGV,分段故障。
GI __libc_free(mem = 0x3f21a843)在malloc.c:2020
我猜有一些非法的内存访问,但代码库也是如此 很大的检查。审查和分析所有代码是不现实的。
由于代码库较大,禁用某些代码也是不可接受的。
对于核心转储,没有提示我可以使用它,因为它在主堆栈中和在执行return子句之后崩溃了。
我知道如何使用gdb,但项目太大了,似乎很难找到根本原因。
valgrind --tool = memcheck似乎无济于事。
如何解决这个问题?
答案 0 :(得分:2)
您可以使用GDB。
这个stackoverflow link详细介绍了如何使用GDB进行调试。如果你谷歌,你可以在GDB上获得许多这样有用的链接。
如果您确定与记忆相关的问题,也可以使用valgrind。
还有一个名为MemProf的内存分析器。它为每个功能分配了内存,也可以检测问题。有关详细信息,请参阅链接
还有用于内存分析的c ++特定工具,如:
mempro和MTuner。您可以免费使用试用版。
答案 1 :(得分:0)
由于我们没有在这里进行某种代码访问,我将不得不假设在一些神奇的方式中,当main的范围被破坏时可以调用free(也许是使用智能指针?可能是一些复杂的宏定义。 ..真的不能告诉)。我会尝试以下列方式重新创建问题:
int main ()
{
{
allocating_resource();
call_other_libs();
...
release_resource();
}
return 0;
}
或
int main()
{
mainhelper();
return 0;
}
其中mainhelper将包含主代码。
希望在这些步骤之后,问题会持续存在并且日志不会像您建议的那样完全损坏,因为程序正在终止。
另外,尝试使用优化标志(更像是禁用它)并添加-ggdb3
调试标志(假设gcc在这里)。也许它会以某种奇怪的方式帮助你。
关于此事的其他一些帖子,如果你还没有检查过它们:
segmentation fault after main returns
Program receives SIGSEGV error after return 0
他们都说得更多:valgrind
应该能够提供答案。