Coredump 詳解

引言

當程序運行的過程中異常終止或崩潰,操作系統會將程序當時的內存狀態記錄下來,保存在一個文件中(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 導致程序終止
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章