【问题标题】:Forcing program to create coredump on freebsd强制程序在 freebsd 上创建 coredump
【发布时间】:2013-05-12 17:10:00
【问题描述】:

在我的项目中,我添加了一个新模块,现在我的进程被信号 11 终止。 我想跟踪和了解问题,但 freebsd 没有生成 coredump 文件。 我将 sysctl 设置为:

sysctl -a | grep core
kern.corefile: /usr/core
kern.nodump_coredump: 1
kern.coredump: 1
kern.sugid_coredump: 1
debug.elf64_legacy_coredump: 1
debug.elf32_legacy_coredump: 1

我也设置了 ulimit -c unlimited

我从我的代码中删除了所有关于信号的代码,例如“sigaction(SIGTERM, &signal, &signal_old);” 为了不阻止内核生成核心转储。

为什么我仍然看不到任何核心转储?我错过了什么?

还有什么方法可以强制在 freebsd 上运行的程序创建与 linux 中的 do_coredump() 等效的 coredump?

【问题讨论】:

  • 通常要强制进行核心转储,您会调用 raise(signum),其中 signum 是一个信号,该信号会产生带有核心转储(中止、seg 等)的退出。

标签: c operating-system freebsd coredump


【解决方案1】:

如果我没记错的话,kern.corefile 是生成的核心文件的完整名称,而不是应该放置它的目录。它还需要可由运行该进程的用户写入。 /usr/core 看起来像一个目录和/或一个只能由 root 写入的位置。

kern.nodump_coredump: 1 看起来也很可疑。我不记得我使用的最后一个版本的 FreeBSD 中存在 sysctl,但它看起来像是为了禁用核心转储。尝试将其设置为 0。

【讨论】:

  • 事实证明 kern.nodump_coredump: 1 是正确的。无论如何,唯一的事情是“%N”谢谢
【解决方案2】:

问题出在:

kern.corefile: /usr/core

以下内容应该会有所帮助:

sysctl -w kern.corefile = "%N.core"

【讨论】:

  • 我为此工作了 2 个小时,感谢您的建议。但是现在有一个问题,核心是在“tmp”文件夹中创建的。我的程序在 VM 上运行,我给的磁盘空间太小。 tmp 分区太小了,我想在 usr 下创建核心。你也有这方面的魔法吗?
  • 当然,尝试类似 sysctl -w kern.corefile = "/usr/core/%N.core" - 指定一个存在且可写的目录
猜你喜欢
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
相关资源
最近更新 更多