使用 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 指针。所以我们去解决它。