3

我正在查看在 Unix 中运行的进程的核心。通常我可以解决问题并深入回溯以尝试识别内存问题。在这种情况下,我不确定如何进行。

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

一些指针参数与它们相关联 - 无法访问地址处的内存

这是否表明某种完整的堆栈损坏。我用 libumem 运行了这个过程,所有的缓冲区都被报告为干净的。

umem_status 也没有报告任何内容。

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

关于如何进一步调试的任何建议?我应该考虑 mdb 中的任何额外功能吗?

谢谢你。

4

5 回答 5

4

堆栈损坏听起来确实有可能。一些事情要尝试:

  • 尽可能打开所有编译器警告!
  • 运行棉绒!
  • 如果可能的话,尝试在 OpenBSD 上构建和测试你的程序,它内置了很多内存损坏检测。
  • 如果可能,请使用 ProPolice、StackGuard 等工具。
  • 如果您可以轻松地重现此问题,那么值得在调试器中进行尝试。尽可能缩小范围,然后逐步进行。
于 2009-02-26T17:13:32.113 回答
3

您可以查看使用ValgrindElectricFence是否会更早地为您中断。

于 2009-02-26T17:13:09.883 回答
0

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

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

在我的情况下,我正在尝试一个无效的写入(有时可能会写入 NULL),它不是在那个实例上而是在其他地方显示它的效果。

于 2009-02-27T04:01:30.777 回答
0

libumem 不应该报告与电围栏相同的溢出吗?

在测试环境中无法轻松重现,但在 unix/solaris 下的商业环境中,核心发生了,但 libumem 没有显示出任何问题,

于 2009-02-26T17:27:04.110 回答
0

你的代码?当这种情况发生在我身上时,我总是会发现相同的东西:空指针。崩溃时看起来很可怕,但原因最终很简单。

于 2009-02-26T17:32:05.843 回答