🗓️ 2025-08-01 🗂️ 环境配置

ubuntu配置coredump文件生成位置

(1) 修改 ulimit

# 查看当前ulimit值。如果是0说明需要修改
ulimit -c

修改方式是:

echo "ulimit -c unlimited 2>/dev/null || true" >> ~/.bashrc

或者修改 /etc/security/limits.conf 文件,在文件末尾追加

(注意:如果你是WSL2用户的话,尝试下面方法无果后,建议还是使用第一种)

*        soft    core    unlimited
*        hard    core    unlimited

(2) 禁用 apport

如果使用的是ubuntu桌面版,很有可能coredump是被apport(就是会弹窗告诉你你的程序崩溃了那个)接管的。

cat /proc/sys/kernel/core_pattern
# 如果是下面的结果,则说明当前是被approt接管状态
|/usr/share/apport/apport %p %s %c %d %P %E

如果想得到coredump文件,则需要禁用它

sudo systemctl disable apport.service

(3) 修改core-pattern

修改/etc/sysctl.conf文件,比如将core文件统一生成到/tmp/coredumps目录,则添加如下内容

(WSL2用户不要放在/tmp目录下,它好像会自动删除这个目录。建议是要么就放在/tmp,要么就换个目录,不要在/tmp创建子目录)

kernel.core_pattern=/tmp/coredumps/core-%e-%t-%p-%E
kernel.core_uses_pid=1

确保目录存在且可写入

sudo mkdir -p /tmp/coredumps && sudo chmod 777 /tmp/coredumps

说明符​​ ​​含义​​ %% 转义字符,表示一个 % 符号本身(如 %% → %)

%p ​​进程 ID(PID)​​(例如 1234)

%P ​​全局 PID​​(包括线程组 ID,通常与 %p 相同)

%i ​​线程 ID(TID)​​(多线程程序的子线程 ID)

%I ​​全局线程 ID​​(内核调度器分配的 ID)

%n ​​进程的友好名称(comm)​​(通常是程序名,最多 16 字符)

%e ​​可执行文件名​​(不含路径,例如 nginx)

%E ​​可执行文件的完整路径​​(例如 /usr/bin/nginx)

%t ​​时间戳​​(Unix 时间戳,秒级,例如 1625097600)

%h ​​主机名​​(uname -n 的输出)

%s ​​触发 coredump 的信号编号​​(例如 11 表示 SIGSEGV)

%c ​​coredump 文件的大小限制​​(受 RLIMIT_CORE 限制,单位:字节)

%u ​​进程的实际用户 ID(UID)​​(例如 1000)

%g ​​进程的实际组 ID(GID)​​(例如 1000)

%d ​​进程的退出码​​(通常为信号编号)

%f ​​进程的页错误地址​​(十六进制,仅对某些信号有效,如 SIGSEGV)

%H ​​容器/命名空间的 ID​​(如果进程在容器中运行)

(4) 测试

kill -11 $$
ll /tmp/coredumps

Comment