1.核心存储文件配置:
不知道理解对不对,Linux中的核心存储文件的配置是在/proc/sys/kernel/core_pattern中的,使用
cat /proc/sys/kernel/core_pattern
# 打印出
|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
表示核心转储会直接通过管道传递给后面的程序(apport),而不是生成物理文件。内核会将核心转储数据直接写入 apport 的标准输入(stdin),由 apport 负责后续处理(生成报告、压缩存储等)。
后面接的是参数,参数说明如下:
2.Apport 的工作流程
1.触发崩溃:程序崩溃(如段错误)时,内核将核心转储数据通过管道发送给 apport。
2.生成报告:
- apport 会收集以下信息:
- 核心转储数据(压缩后存储在报告中)
- 程序崩溃时的堆栈跟踪
- 系统日志(如 dmesg 输出)
- 已安装软件包信息
3.存储报告:
报告以 .crash 文件格式存储在 /var/crash/,文件名示例:
_usr_bin_myapp.1000.crash # 路径中的 `/` 替换为 `_`
3.如何获取核心文件?
(1) 从 Apport 报告中提取
# 安装工具
sudo apt install apport-retrace
# 解压报告到临时目录
apport-unpack /var/crash/_usr_bin_myapp.1000.crash /tmp/crash-dir
# 核心文件路径
ls /tmp/crash-dir/CoreDump # 核心文件在此处
(2) 临时禁用 Apport
# 修改 core_pattern 为生成物理文件
echo "core.%e-%p" | sudo tee /proc/sys/kernel/core_pattern
# 设置核心文件大小无限制
ulimit -c unlimited
(3) 永久生效配置
# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.conf# 添加以下内容
kernel.core_pattern = core.%e-%p-%t
kernel.core_uses_pid = 1 # 可选:在文件名末尾附加 PID
应用配置
sudo sysctl -p
4. 调试示例
# 使用 GDB 分析提取的核心文件
gdb /usr/bin/myapp /tmp/crash-dir/CoreDump
# 查看崩溃堆栈
(gdb) bt full
5. 注意事项
-
Apport 默认行为:
Ubuntu 仅在 已安装的软件包崩溃时触发弹窗,自定义程序崩溃可能不会主动提示。 -
权限问题:
/var/crash/ 需要 root 权限访问。 -
磁盘空间:
Apport 报告默认会保留在 /var/crash/,需定期清理:sudo rm /var/crash/*