问题
在做嵌入式linux开发的时候,有时候为了快速定位应用崩溃的问题, 采用printf的方式可能比较慢, 这时候我们如果采用coredump文件分析则会快一些, 但是一般情况下linux下coredump选项是默认关闭的, 因此如何打开并且设置coredump对应的输出文件格式就是我们本篇文章的重点.
方法
设置生成的coredump大小
通过使用 ulimit -c
指令查询当前设置, 通过 ulimit -c [unlimited] | {size}
设置coredump, 如果值为0, 则关闭生成coredump文件, 其余都为生成的文件的最大大小;
$ ulimit -c
0
$ ulimit -c 1024 //coredump文件不能超过1024kb
这样设置为临时修改, 如果想要永久修改, 可以使用 ulimit -c unlimited >> /etc/profile
这样重启设置就会依旧保持;
或者
$ sudo vi /etc/security/limits.conf
在文件末尾追加
* soft core unlimited
* soft hard unlimited
设置生成的coredump命名
内核目录proc/sys/kernel/core_pattern
可以设置格式化的 core 文件保存位置或文件名 ,比如原来文件内容是 core-%e
修改为
echo "/corefile/core-%e-%p-%t" > core_pattern
, 则产生的 core 文件会存放到 /corefile
目录下,产生的文件名为 core-命令名-pid-时间戳
其中参数含义如下:
%p - insert pid into filename 添加 pid
%u - insert current uid into filename 添加当前 uid
%g - insert current gid into filename 添加当前 gid
%s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
/proc/sys/kernel/core_uses_pid
可以控制产生的 core 文件的文件名中是否添加 pid 作为扩展 ,如果添加则文件内容为 1 ,否则为 0;
想要保持该设置需要进行如下设置:
$ sudo vi /etc/sysctl.conf
kernel.core_pattern=/var/crash/%E.%p.%t.%s
$ sudo sysctl -p
调试coredump文件
gdb <executable> <core-file> or gdb <executable> -c <core-file>
参考文章
- linux下生成core dump文件调试方法及设置 包含调试的部分;
- 在 Linux 生成 core dump 文件 相应的设置方法;
- Linux基础:Coredump文件位置的设定方法 保存生成core文件名和位置的不同设置方法;
- How do I analyze a program’s core dump file with GDB when it has command-line parameters? 调试gdb文件;
- core dump 分析与实践