使用 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 指標。所以我們去解決它。