gdb 除錯教學

本篇 ShengYu 介紹 gdb 除錯教學,全名為 GNU Debugger,是 GNU 軟體系統中的標準偵錯器 Debugger,在使用 Debugger 時可以單步執行、執行到中斷點、查看變數內容、印出呼叫堆疊等等功能,是程式設計師的常用工具,以下將會介紹編譯完 C/C++ 程式後怎麼使用 gdb 來替 C/C++ 程式偵錯。

以下 gdb 除錯教學的內容大概分為這幾部分,

  • gcc/g++ 編譯 C/C++ 程式
  • gdb 進行除錯

那我們開始吧!

gcc/g++ 編譯 C/C++ 程式

我的桌機環境為 Ubuntu 16.04,以下為一個簡單的 C/C++ 程式,使用 g++ main.cpp -g -o a.out 進行編譯,編譯成功後會產生 a.out 執行檔,-g 表示帶有除錯資訊,

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// g++ main.cpp -g -o a.out
#include <iostream>
#include <string>

int main() {
std::string s = "hello world";

int sum = 0;
for (int i = 0; i < 5; i++) {
sum += i;
}

std::cout << s << "\n";
std::cout << "sum=" << sum << "\n";
std::cout << "end\n";

return 0;
}

程式輸出如下,

1
2
3
hello world
sum=10
end

gdb 進行除錯

接著使用 gdb 指令對 a.out 進行除錯,執行 gdb ./a.out 指令進入 gdb 交互介面,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ gdb ./a.out 
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
(gdb)

輸入 b main.cpp:14 插入中斷點在 main.cpp 的 14 行,

1
2
3
(gdb) b main.cpp:14
Breakpoint 1 at 0x400c09: file main.cpp, line 14.
(gdb)

輸入 info b 印出目前設定的中斷點,

1
2
3
4
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400c09 in main() at main.cpp:14
(gdb)

按下 r 開始執行,

1
2
3
4
5
6
7
(gdb) r
Starting program: /home/shengyu/a.out
hello world

Breakpoint 1, main () at main.cpp:14
14 std::cout << "sum=" << sum << "\n";
(gdb)

再次輸入 info b 印出目前設定的中斷點,可以看到中斷點被觸發幾次,

1
2
3
4
5
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400c09 in main() at main.cpp:14
breakpoint already hit 1 time
(gdb)

接著按 c 繼續執行直到程式結束,

1
2
3
4
5
6
(gdb) c
Continuing.
sum=10
end
[Inferior 1 (process 14925) exited normally]
(gdb)

以下為 gdb 常用的指令,
r:run 開始執行
c:continue 繼續執行
b main.cpp:14:設定中斷點
info b:印出目前設定的中斷點
bt:backtrace 印出程式呼叫的堆疊
q:quit 離開

以上就是 gdb 除錯教學介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
C語言工具使用,GDB個人學習筆記 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
https://ithelp.ithome.com.tw/articles/10257294

相關主題
gdbserver 遠端除錯教學
LLDB 除錯教學