# 设置及使用coredump文件
# coredump文件介绍
核心转储是一个包含进程意外终止时进程内存内容的文件。核心转储由内核触发以响应程序崩溃。核心转储作为崩溃时程序状态的事后快照非常重要,特别是在故障难以重现的情况下。
# 开启关闭核心转储core dumps
功能
核心转储功能是否开启可以使用命令ulimit
查看
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) 63207
# max locked memory (kbytes, -l) 65536
# 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) 63207
# virtual memory (kbytes, -v) unlimited
# file locks (-x) unlimited
其中,core file size (blocks, -c) 0
说明程序崩溃时不会生成core
文件。
# 开启核心转储生成功能
转储文件的使能是通过命令ulimit
控制的soft limit
。通过如下命令可以临时开启生成转储文件:
ulimit -S -c unlimited
-S
参数表示soft limit
,-c
表示的coredumps
文件的大小限制。
如果想在当前系统设置永久生效,可以在/etc/security/limits.conf
中添加如下配置行:
* soft core unlimited
默认情况下生成的coredumps
文件由apport
程序管理,因此要查找默认生成的coredumps
文件路径,可以先查看apport
程序日志:
cat /var/log/apport.log
# ERROR: apport (pid 306149) Wed Apr 10 00:48:57 2024: executable does not belong to a package, ignoring
# ERROR: apport (pid 306149) Wed Apr 10 00:48:57 2024: writing core dump to core._media_xx_data_code_basic_cplusplus_examples_debug_leak.1000.47fbc564-8f91-46c4-9af5-1d77388becb8.306148.70162237 (limit: -1)
可以看到生成了core._media_xx_data_code_basic_cplusplus_examples_debug_leak.1000.47fbc564-8f91-46c4-9af5-1d77388becb8.306148.70162237
文件,在/var
路径下搜索发现:
sudo find ./ -name core._media_xx_data_code_basic_cplusplus_examples_debug_leak.1000.47fbc564-8f91-46c4-9af5-1d77388becb8.306148.70162237
[sudo] password for xx:
./lib/apport/coredump/core._media_xx_data_code_basic_cplusplus_examples_debug_leak.1000.47fbc564-8f91-46c4-9af5-1d77388becb8.306148.70162237
设置coredumps文件的生成路径,上面是默认生成coredumps
文件的路径,用户可以根据需要自己定制文件的路径:
sudo sysctl -w kernel.core_pattern=/coredumps/core-%e-%s-%u-%g-%p-%t
# will update content in `/proc/sys/kernel/core_pattern`
上面的命令是一次性的,只能控制当前环境中生成的coredumps
文件位置,要想设置系统层面coredumps
文件的生成路径,可以在文件/etc/sysctl.conf
中添加一行如下内容:
kernel.core_pattern="/coredumps/core-%e-%s-%u-%g-%p-%t"
设置core_pattern
时对应的符号含义:
# %e The process or thread's comm value, which typically is the
# same as the executable filename (without path prefix, and
# truncated to a maximum of 15 characters)
# %i TID of thread that triggered core dump, as seen in the PID
# namespace in which the thread resides.
# %p PID of dumped process, as seen in the PID namespace in which
# the process resides.
# %s Number of signal causing dump.
# %% 单个%字符
# %p 所dump进程的进程ID
# %u 所dump进程的实际用户ID
# %g 所dump进程的实际组ID
# %s 导致本次core dump的信号
# %t core dump的时间 (由1970年1月1日计起的秒数)
# %h 主机名
# %e 程序文件名
Attention:这里需要注意的是在设置core_pattern
时,需要确保指定的目录存在。不要设置在挂载的数据硬盘上,否则会导致size
为0``coredump
文件。gdb
使用时会报错:
# core.leak-11-1000-1000-313132-1712684913" is not a core dump: file format not recognized
# 关闭生成转储文件
通过命令控制:
ulimit -S -c 0
持久化修改,在文件/etc/security/limits.conf
中加入如下行:
* soft core 0
* hard core 0
# coredumps文件的使用
使用gdb
调试程序:
gdb test coredumps_file
info signals # 查看导致`coredump`的信号
# 查看core进程的所有线程堆栈
- 查看所有线程正在运行的指令信息
info threads
# Id Target Id Frame
# * 1 LWP 354754 __GI___libc_free (mem=0x4) at malloc.c:3102
- 打开所有线程的堆栈信息
thread apply all bt
- 查看指定线程堆栈信息
thread apply <Id> bt
# release版本发布时的调试方法
bt # back trace information
b main # set break point at main
r # run the program
list # see the file
layout asm
nexti
stepi
# reference
1.https://medium.com/@sourabhedake/core-dumps-how-to-enable-them-73856a437711 (opens new window)
2.https://zhuanlan.zhihu.com/p/46605905 (opens new window)
3.https://stackoverflow.com/questions/13403824/empty-core-dump-file-after-segmentation-fault (opens new window)