SIGABRT 不会在 MacOS 中生成核心转储

Posted

技术标签:

【中文标题】SIGABRT 不会在 MacOS 中生成核心转储【英文标题】:SIGABRT doesn't generate core dumps in MacOS 【发布时间】:2021-12-09 07:57:31 【问题描述】:

在 macOS 中,我发现 SIGABRT 在某些情况下不会生成核心转储。

例如,我在一个终端运行睡眠:

lianxin.wlx@mbp [01:08:21] [~/test]
-> % sleep 1000

并在另一个终端向它发送 SIGABRT:

lianxin.wlx@mbp [01:08:59] [~]
-> % ps -ef | grep sleep
  502 47679 20388   0  1:08AM ttys001    0:00.01 sleep 1000
lianxin.wlx@mbp [01:09:03] [~]
-> % kill -6 47679

然后睡眠进程被中止,但没有生成核心转储。

lianxin.wlx@mbp [01:08:21] [~/test]
-> % sleep 1000
[1]    47679 abort      sleep 1000
lianxin.wlx@mbp [01:10:35] [~/test]
-> % ls /cores
lianxin.wlx@mbp [01:10:37] [~/test]
-> %

那为什么?我在 Linux 中测试了相同的操作,它确实生成了核心转储。

我确定我已经正确打开了核心转储(ulimit -c unlimited,而/cores 的权限是 777)。我写了一个程序,它会在 SIGSEGV 中崩溃,它确实在 /cores 中生成了一个核心转储。

【问题讨论】:

【参考方案1】:

如果你做一个简单的程序,

main() 
    abort();

如果使用适当的 priv 运行,它将生成核心转储。 另外,如果你做一个:

main() 
    sleep(100);

在后台运行它并杀死 -ABRT ,它将生成核心转储。 但是 /bin/sleep 没有,这有点奇怪。

这是假设您已按照man core 中的方法进行操作。

【讨论】:

我尝试了第二个程序,它不会生成核心转储。第一个会。 它在我的Darwin Kernel Version 16.7.0: Wed Apr 24 20:50:53 PDT 2019; root:xnu-3789.73.49~1/RELEASE_X86_64 (Sierra) 上运行。 我的是 Darwin 20.6.0,MacOS BigSur 11.6 (20G165)。可能和系统版本有关? 您系统上的man core 是否有任何亮点?我有点惊讶我必须以 root 身份运行它才能生成核心文件。

以上是关于SIGABRT 不会在 MacOS 中生成核心转储的主要内容,如果未能解决你的问题,请参考以下文章

macOS Big Sur 中的分段错误后未生成核心转储文件

如何获取已向已退出转储核心的另一个进程发送 SIGABRT 信号的进程的 pid

SIGABRT 和 COREDUMP

如何在 linux 服务器中生成 JFR 和堆转储报告?

创建核心转储时设置退出状态

杀死进程而不创建核心转储?