Linux Docker环境下进程触发signo 11产生coredump但dmesg无段错误记录的原因
进程生成core dump但dmesg无段错误记录的可能原因
Docker运行时的日志隔离限制
Docker默认限制容器内进程的内核事件上报到宿主机的dmesg缓冲区:- 容器启动时如果配置了
--cap-drop syslog权限,或者使用了非内核默认的日志驱动,容器进程产生的内核事件不会写入宿主机的内核环缓冲区 - 部分容器 runtime(如containerd、cri-o)默认关闭了容器进程致命信号的日志上报能力,避免容器日志污染宿主机dmesg
- 容器启动时如果配置了
内核参数配置导致日志不输出
- 宿主机
kernel.core_pattern配置为用户空间core dump处理程序(例如systemd-coredump、abrt或自定义采集脚本)时,段错误事件会直接交给用户空间程序处理,不会打印到dmesg - 内核参数
kernel.print-fatal-signals值为0时,内核默认不会将用户态进程的致命信号(包括SIGSEGV)事件输出到dmesg
- 宿主机
dmesg环形缓冲区日志被覆盖
dmesg使用固定大小的环形缓冲区存储日志,若宿主机运行时间长、内核输出日志量大,较早产生的段错误日志会被新日志覆盖。可以通过查看/var/log/kern.log(Debian/Ubuntu 系)或/var/log/messages(RHEL/CentOS 系)的历史内核日志进一步验证。进程主动触发SIGSEGV信号
如果进程是通过raise(SIGSEGV)、kill(pid, SIGSEGV)等调用主动发送11号信号,而非因非法内存访问触发内核态段错误,内核不会生成对应的dmesg日志,仅会传递信号触发进程转储core文件。
内容的提问来源于stack exchange,提问作者music90
相关产品推荐
相关产品推荐

