[英]How to debug such memory corruption?
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似乎没有帮助。
如何解决这样的问题?
您可以使用GDB。 该stackoverflow链接包含有关如何使用GDB进行调试的详细信息。 如果您使用Google,则可以在GDB上获得许多此类有用的链接。
如果您确定与内存相关的问题,也可以使用valgrind 。
还有一个名为MemProf的内存分析器。 它为每个功能分配了内存,还可以检测问题。 有关详细信息,请参见链接。
还有一些特定于c ++的内存分析工具,例如:
mempro和MTuner 。 您可以免费使用试用版。
由于我们这里没有某种代码访问权限,因此我不得不假设当main的作用域被破坏时,以某种神奇的方式调用了free(也许使用了智能指针?也许还有一些复杂的宏定义...可以真的不知道)。 我将尝试通过以下方式重新创建问题:
int main ()
{
{
allocating_resource();
call_other_libs();
...
release_resource();
}
return 0;
}
要么
int main()
{
mainhelper();
return 0;
}
其中mainhelper将包含主要代码。
希望在执行这些步骤之后,该问题将继续存在,并且不会因您的建议而完全损坏日志,因为该程序将终止。
另外,尝试使用优化标志(更像是禁用它)并添加-ggdb3
调试标志(此处为gcc)。 也许它将以某种奇怪的方式帮助您。
有关此问题的其他一些帖子(如果您尚未签出):
它们都说明更多相同点: valgrind
应该能够给出答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.