繁体   English   中英

如何调试这种内存损坏?

[英]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 ++的内存分析工具,例如:
memproMTuner 您可以免费使用试用版。

由于我们这里没有某种代码访问权限,因此我不得不假设当main的作用域被破坏时,以某种神奇的方式调用了free(也许使用了智能指针?也许还有一些复杂的宏定义...可以真的不知道)。 我将尝试通过以下方式重新创建问题:

int main () 
{
       {
           allocating_resource();
           call_other_libs();
           ...
           release_resource();
       }
       return 0;
}

要么

  int main()
  {
    mainhelper();
    return 0;
  }

其中mainhelper将包含主要代码。

希望在执行这些步骤之后,该问题将继续存在,并且不会因您的建议而完全损坏日志,因为该程序将终止。

另外,尝试使用优化标志(更像是禁用它)并添加-ggdb3调试标志(此处为gcc)。 也许它将以某种奇怪的方式帮助您。

有关此问题的其他一些帖子(如果您尚未签出):

主返回后的分段错误

程序返回0后收到SIGSEGV错误

它们都说明更多相同点: valgrind应该能够给出答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM