Unix上的分段错误 - 可能的堆栈损坏

时间:2009-02-26 17:02:40

标签: c debugging stack coredump corrupt

我正在查看Unix中运行的进程的核心。 通常我可以自己工作并根据回溯来尝试识别内存问题。 在这种情况下,我不确定如何继续。

首先,回溯只给出3帧,我期待更多。 对于这些帧,所呈现的所有功能参数似乎完全无效。 没有我期望的。

某些指针参数与它们相关联 - 无法访问地址

的内存

这会暗示某种完整的堆栈损坏吗? 我使用libumem运行该过程,并且所有缓冲区都被报告为干净。

umem_status也没有报道。

所以基本上我很难过。 可能的原因是什么? 我应该在代码中查找什么,因为libumem似乎没有报告任何错误。

有关如何调试内容的任何建议?我应该考虑mdb中的任何额外功能吗?

谢谢。

5 个答案:

答案 0 :(得分:4)

堆栈损坏听起来像是一种可能性。有些事要尝试:

  • 打开所有编译器警告!
  • 运行lint!
  • 如果可能,请尝试构建&在OpenBSD上测试您的程序,OpenBSD内置了大量的内存损坏检测。
  • 如果可能,请使用ProPolice,StackGuard等工具
  • 如果您可以轻松地重现此问题,那么值得在调试器中使用。尽可能缩小范围,然后逐步完成。

答案 1 :(得分:3)

您可以查看使用ValgrindElectricFence是否可以提早破解。

答案 2 :(得分:0)

不应该libumem报告与电围栏相同的超限?

在测试环境中无法轻松复制,但在unix / solaris下的商业环境中核心发生但libumem没有显示任何不良,

答案 3 :(得分:0)

你的代码?当这种情况发生在我身上时,我总能找到同样的东西:一个空指针。它崩溃时看起来很可怕,但原因最终很简单。

答案 4 :(得分:0)

我确实遇到了类似的问题。 GDB的回溯没有帮助。 Valgrind来救我。

通过Valgrind运行您的应用程序。识别所有错误,如无效写入。分析这段代码,看看它们是否可以修复。

在我的情况下,我正在尝试无效写入(有时可能写入NULL),这显示其效果不是在该实例,而是在哪里。