程式異常終止(段錯誤、浮點例外、非法指令)時,作業系統可生成 **core dump**(核心轉儲)檔案,記錄進程記憶體映像、寄存器、棧幀。結合 **GDB** 與 **編譯器 `-g` 符號表**,能精準定位崩潰行號。本文實戰演示完整流程。
// core_demo.c
#include
int core_dump() {
for (int i = 5; i >= 0; i--) {
printf("(%d, %d)\n", i, 100 / i); // i=0 除零 → SIGFPE
}
return 0;
}
int main() { core_dump(); return 0; }
$ gcc -g core_demo.c -o core_demo // 必須加 -g 產生調試符號
$ ulimit -c unlimited // 允許生成 core 檔案(預設可能為 0)
$ ./core_demo
(5, 20)
(4, 25)
(3, 33)
(2, 50)
(1, 100)
Floating point exception (core dumped) // 生成 core 檔案
$ gdb ./core_demo core
GNU gdb (GDB) ...
Core was generated by `./core_demo'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0 0x0000000000401126 in core_dump () at core_demo.c:7
7 printf("(%d, %d)\n", i, 100 / i);
(gdb) bt // 顯示呼叫堆疊
#0 0x0000000000401126 in core_dump () at core_demo.c:7
#1 0x0000000000401145 in main () at core_demo.c:14
(gdb) print i // 檢查變數值
$1 = 0
(gdb) quit
| 步驟 | 命令/操作 | 說明 |
|---|---|---|
| 1. 編譯加符號 | gcc -g -O0 | -O0 關閉優化,保留變數與行號對應;-g 嵌入 DWARF 符號 |
| 2. 啟用 core dump | ulimit -c unlimited | 永久生效寫入 /etc/security/limits.conf;系統級 /proc/sys/kernel/core_pattern |
| 3. 載入 core | gdb ./exe core | core 檔名可能為 core.pid 或 core |
| 4. 定位崩潰 | bt, frame N, print var | 查看呼叫堆疊、切換幀、印變數 |
| 5. 檢查記憶體 | x/20xw $rsp, info registers | 進階:檢查棧內容、寄存器 |
ulimit -c 0(預設關閉)。setuid、capabilities 限制)。/proc/sys/kernel/core_pattern 導向管道程式(如 |/usr/lib/systemd/systemd-coredump),core 不落盤而是交給收集器。-g:Release 版也保留符號表(strip 部署前再剝離)。core_pattern 導向集中存儲/分析平台。gdb -batch -ex "bt" -ex "quit" ./exe core > backtrace.txt。gcc -fsanitize=address -g 運行時直接報告錯誤位置,無需 core dump。Core Dump + GDB 是 C/C++ 線上崩潰定位的「核彈級」工具。掌握 -g、ulimit -c、gdb bt 三板斧,配合 ASan 預防,讓段錯誤、除零、野指針無處遁形。