如何调试此类内存损坏?

时间:2015-12-26 19:51:38

标签: c++ c debugging crash

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似乎无济于事。

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您可以使用GDB。 这个stackoverflow link详细介绍了如何使用GDB进行调试。如果你谷歌,你可以在GDB上获得许多这样有用的链接。
如果您确定与记忆相关的问题,也可以使用valgrind

还有一个名为MemProf的内存分析器。它为每个功能分配了内存,也可以检测问题。有关详细信息,请参阅链接 还有用于内存分析的c ++特定工具,如:
memproMTuner。您可以免费使用试用版。

答案 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应该能够提供答案。