引言
當程序運行的過程中異常終止或崩潰,操作系統會將程序當時的內存狀態記錄下來,保存在一個文件中(core文件),這種行爲就叫做 Core Dump 或者叫做 ‘核心轉儲’,利用 coredump 可以幫助我們快速定位程序崩潰位置
開啓 coredump
終端輸入命令:ulimit -a 用來顯示對進程的一些限制限制,其中第一行表示了 core 文件最大的大小限制(單位爲 blocks)默認是 0
開啓核心轉儲
終端輸入:ulimit -c unlimited 不對生成的核心轉儲文件進行大小限制也可以指定大小,ulimit -c 查看
gdb 調試 core 文件
準備:
#include <cstdio>
int test1(int a, int b) {
return a+b;
}
void test2() {
char* str = "hello~";
str[0] = '0'; //段錯誤程序終止,生成core文件
}
void test3() {
printf("world~~\n");
}
int main() {
test1(1, 2);
test2();
test3();
return 0;
}
./test 執行文件後 發生段錯誤程序終止,並且生成 core 文件
file core.22187 查看文件信息
gdb ./test core.22187 利用 gdb 進行 coredump 定位,可以看到程序終止是因爲signal 11 並且段錯誤發生在第 15 行,因爲 str[0] = ‘0’
開始調試:在 15 行發生段錯誤,信號 SIGSEGV 導致程序終止