文章目录

  • 系列文章目录
  • 1 确认core文件开关是否开启
  • 2 修改core生成路径和文件格式

前面简单介绍了GDB相关的调试经验,但是在资源有限的嵌入式设备中,很难跑的了GDB ,因此就需要程序异常时候生成的core文件来解析程序的堆栈信息,这时候就需要对linux系统进行一些设置,用于程序异常时候可以生成core文件。

1 确认core文件开关是否开启

我们输入指令ulimit -a

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7735
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7735
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可以看到上面有一行

core file size          (blocks, -c) 0

0表示core文件的大小为0,即没有打开。
因此我们可以使用指令 ulimit -c [kbytes] 来设置生成core文件的最大大小。
也可以使用 ulimit -c unlimited表示不限制core的大小。

注意:如果不限制大小,在嵌入式设备上最好确认core文件的生成路径的空间大小,否则可能生成的core过大,超过flash空间。一般可以将路径设置到SD卡或者NFS挂载到电脑路径下最好。

2 修改core生成路径和文件格式

默认生成的core的名字为core 路径为程序运行的路径。因此我们可以通过修改/proc/sys/kernel/core_pattern中参数来修改生成的路径和文件的格式。

如下:

echo "/tmp/core-%c-%e-%g-%h-%p-%s-%t-%u" > /proc/sys/kernel/core_pattern

代表生成的路径为/tmp目录,格式为core-%e-%p-%t,具体参数含义如下:

指令

说明

%c

文件的大小上限

%e

程序的名字

%g

程序进程组ID

%p

程序的ID

%h

主机名

%s

导致本次coredump的信号

%t

存储时间(UTC时间)

%u

进程用户ID

比如运行前面的示例程序生成的core文件

-rw------- 1 root root 17342464 11月 17 19:25 /tmp/core-18446744073709551615-test_gdb-0-st-22862-11-1605612306-0