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

Linux 下 C/C++ 程序調試:段錯誤定位方法總結

     編輯:關於C++

段錯誤成因

訪問非法內存:空指針解引用、數組越界、釋放後使用、棧溢出等。CPU 檢測到保護異常發送 SIGSEGV 信號,默認處理為終止進程並生成 core 文件。

四種調試方法

1. GDB 直接調試

gcc -g -rdynamic test.c
gdb ./a.out
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0x08048524 in dummy_function () at test.c:4
4           *ptr = 0x00;

直接定位到出錯行。

2. Core 文件分析

ulimit -c unlimited  # 允許生成 core
./a.out  # 觸發段錯誤,生成 core
gdb ./a.out core
#0  0x08048524 in dummy_function () at test.c:4

適用於事後分析、生產環境。

3. 信號處理器中啟動 GDB

void dump(int signo) {
    char cmd[1024];
    snprintf(cmd, sizeof(cmd), "gdb %s %d", program_name, getpid());
    system(cmd);
    exit(0);
}
signal(SIGSEGV, dump);

程序崩潰自動彈出 GDB 交互調試。

4. backtrace + objdump 手動分析

void dump(int signo) {
    void *array[10];
    size_t size = backtrace(array, 10);
    char **strings = backtrace_symbols(array, size);
    for (size_t i = 0; i < size; i++) printf("%s\n", strings[i]);
    free(strings);
    exit(0);
}

輸出調用棧地址,再用 objdump -d a.out 反彙編定位函數。無需 GDB 環境也能用。

補充技巧

  • 編譯加 -rdynamic 導出動態符號,backtrace_symbols 才能顯示函數名。
  • addr2line -e a.out 0x08048524 直接將地址轉為文件行號。
  • 長期運行程序可定期記錄棧追蹤排查死循環/性能瓶頸。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved