C/C++崩溃 linux的dump文件不能生成
2022-09-24 本文已影响0人
生活简单些
1. ulimit -a 查看生成dump文件是否开启了
shell键入ulimit -a
查看core文件有没有限制大小,即:如果发现core file size
这一项值为0
,则意味着没有开启。
开启办法:
echo 'ulimit -c unlimited' >> ~/.bashrc
或者直接打开.bashrc添加ulimit -c unlimited
(如果大小为0,说明禁止了core文件的产生,可以通过 ulimit -c unlimited 来解除限制)
2. 查看/proc/sys/kernel/core_pattern
的定义
core dumpe
生成的文件默认为core
, 且它的缺省位置是程序所在目录,可以通过修改/proc/sys/kernel/core_pattern
来指定core文件生成位置了名称。
通过查看core_pattern
文件,发现其确实指定了一个路径,于是我前往那个路径,发现竟然是脚本程序,后来查看说明文件,才知道core_pattern
中如果首先指定了一个 '|'
管道符,则会将生成的core文件传递给后面所跟的脚本去处理。
至此,也就确定了问题的原因,'|'
管道符后面的脚本将我们的core文件给吞了,解决方法自然就是去掉这个脚本,换成自己指定的目录。
但直接去修改core_pattern
文件并没有成功,保存时会提示fsync
错误,只能通过命令修改,如下方法1:
- 方法1(临时生效办法):
sudo bash -c "echo core > /proc/sys/kernel/core_pattern"
- 方法2(永久生效办法):使用
sysctl -w name=value命令
,即:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p
为了更详尽的记录core dump当时的系统状态,可通过以下参数来丰富core文件的命名:
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名