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