如何从陷阱中获取核心转储:程序[pid] 一般保护事件

How to get core dump from traps: program[pid] general protection event

我正在尝试对 Linux 上本地编译的守护程序进行故障排除,该程序因信号 11 而崩溃,我需要回溯堆栈和变量值来修复错误。

但是由于某些原因 Linux 内核不保存核心转储,而只是记录以下内容(暂时不泄露程序名称):

Apr  8 15:22:54 machinename kernel: [ 5032.337089] traps: program[4121] general protection ip:7ff47cbf9614 sp:7ff45f68abb8 error:0
Apr  8 15:22:54 machinename kernel: [ 5032.337110]  in libc-2.19.so[7ff47cb7d000+1a1000]

我已经尝试确保满足 core(5) 中的条件,但无济于事。

有没有办法让 Linux 内核报告或记录为什么它没有生成核心转储?

还有其他方法可以解决这种情况吗?

请注意,这与关于该主题的其他问题的不同之处在于: 1. 不特定于指定的程序或库及其特性。 2. 寻找对遇到这种有点令人困惑的内核行为的其他开发人员通用的答案。

我最终通过构建一个带有额外代码的自定义内核来解决此问题,以记录写入或不写入核心转储的确切原因(这确实应该是默认行为,但不是)。事实证明,尽管守护进程不是 suid 二进制文件,但应用了记录的标准之一 (suid_dumpable),它只是在守护进程时删除了 root,这从安全角度来看是相反的。

所以我将 suid_dumpable 更改为 1,得到一个核心转储文件并将其与源代码一起复制到机器上,然后努力让 gdb 加载符号(也有很多不清楚的文档) .但最终,我足够接近怀疑原因并在守护程序代码中实施解决方法。

所以给其他人的教训:/proc/sys/fs/suid_dumpable 应用于在非特权用户 id 下将 root 放到 运行 的二进制文件,尽管设置是为了防止 suid 二进制文件转储具有特权的用户可读核心文件在特权帐户下获得的信息。