【问题标题】:How to debug such memory corruption?如何调试这种内存损坏?
【发布时间】:2015-12-26 19:51:38
【问题描述】:
int main () {
       allocating_resource();
       call_other_libs();
       ...
       release_resource();
       return 0;
}

程序运行后,main返回。

在它访问returne 0之后,堆栈指针指向main()中的错误地址,然后可执行文件崩溃了。

程序收到信号SIGSEGV,分段错误。

GI __libc_free(mem=0x3f21a843) at malloc.c:2020

我猜有一些非法的内存访问,但代码库太 大检查。查看和分析所有代码是不现实的。

由于代码库很大,禁用某些代码也是不可接受的。

对于核心转储,我无法使用任何提示,因为它在主堆栈处崩溃并且在执行 return 子句之后。

我知道如何使用gdb,但是项目太大了,似乎很难找到根本原因。

valgrind --tool=memcheck 似乎没有帮助。

如何解决这样的问题?

【问题讨论】:

  • 你传递了一个无效的指针,我想。使用调试符号编译并使用调试器(例如 UNIX 上的 gdb)并中断对 free 的调用。
  • 没有可能的魔法;如果代码很大,那么寻找错误是一项艰巨的任务。首先跟踪导致崩溃的释放,然后尝试从该位置回溯...
  • 查看我的更新答案。还有一种称为 valgrind 的工具可以检测与内存相关的问题。这适用于您的问题与内存相关的情况。
  • 答案再次更新。
  • MemProf 怎么样?我已经添加了答案。我知道这可能会对您有所帮助,因为它按功能提供功能,还可以检测已分配和未引用的内存。

标签: c++ c debugging crash


【解决方案1】:

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

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

【讨论】:

  • 日志没有帮助,因为程序在主返回后崩溃了。
【解决方案2】:

由于我们在这里没有某种代码访问权限,所以我不得不假设当 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 应该能够提供答案。

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多