使用 GDB 進行 Segfault 分析

讓我們使用與上面相同的程式碼。

#include <iostream>

void fail() {
    int *p1;
    int *p2(NULL);
    int *p3 = p1;
    if (p3) {
        std::cout << *p2 << std::endl;
    } 
}

int main() { 
    fail();
}

首先讓我們編譯它

g++ -g -o main main.cpp

讓我們用 gdb 執行它

gdb ./main

現在我們將在 gdb shell 中。輸入 run。

(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/opencog/code-snippets/stackoverflow/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400850 in fail () at debugging_with_gdb.cc:11
11            std::cout << *p2 << std::endl;

我們看到分段錯誤發生在第 11 行。所以在這一行使用的唯一變數是指標 p2。讓我們檢查一下它列印的內容。

(gdb) print p2
$1 = (int *) 0x0 

現在我們看到 p2 被初始化為 0x0,代表 NULL。在這一行,我們知道我們正在嘗試取消引用 NULL 指標。所以我們去解決它。