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/*