訪問非法內存:空指針解引用、數組越界、釋放後使用、棧溢出等。CPU 檢測到保護異常發送 SIGSEGV 信號,默認處理為終止進程並生成 core 文件。
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;
直接定位到出錯行。
ulimit -c unlimited # 允許生成 core
./a.out # 觸發段錯誤,生成 core
gdb ./a.out core
#0 0x08048524 in dummy_function () at test.c:4
適用於事後分析、生產環境。
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 交互調試。
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 直接將地址轉為文件行號。