首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言 Core Dump 實戰:從崩潰到定位的 GDB 分析全流程

     編輯:關於C

前言

程式異常終止(段錯誤、浮點例外、非法指令)時,作業系統可生成 **core dump**(核心轉儲)檔案,記錄進程記憶體映像、寄存器、棧幀。結合 **GDB** 與 **編譯器 `-g` 符號表**,能精準定位崩潰行號。本文實戰演示完整流程。

一、觸發 Core Dump 範例


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


$ 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 dumpulimit -c unlimited永久生效寫入 /etc/security/limits.conf;系統級 /proc/sys/kernel/core_pattern
3. 載入 coregdb ./exe corecore 檔名可能為 core.pid 或 core
4. 定位崩潰bt, frame N, print var查看呼叫堆疊、切換幀、印變數
5. 檢查記憶體x/20xw $rsp, info registers進階:檢查棧內容、寄存器

五、為什麼有時沒有 Core 檔案?

  • ulimit -c 0(預設關閉)。
  • 進程權限不足(setuid、capabilities 限制)。
  • /proc/sys/kernel/core_pattern 導向管道程式(如 |/usr/lib/systemd/systemd-coredump),core 不落盤而是交給收集器。
  • 磁碟空間不足、目錄不可寫。

六、生產環境最佳實踐

  1. 構建系統強制 -g:Release 版也保留符號表(strip 部署前再剝離)。
  2. 統一 core 收集:配置 core_pattern 導向集中存儲/分析平台。
  3. 自動化分析腳本:gdb -batch -ex "bt" -ex "quit" ./exe core > backtrace.txt。
  4. 結合 AddressSanitizer (ASan):gcc -fsanitize=address -g 運行時直接報告錯誤位置,無需 core dump。

七、總結

Core Dump + GDB 是 C/C++ 線上崩潰定位的「核彈級」工具。掌握 -g、ulimit -c、gdb bt 三板斧,配合 ASan 預防,讓段錯誤、除零、野指針無處遁形。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved