Home >> Blog >> GDB the GNU Project debugger 介紹
GDB the GNU Project debugger 介紹
GDB 代表 GNU Project Debugger,它是一個強大的 C 調試工具(以及 C++ 等其他語言)。它可以幫助您在 C 程式執行時查看它們,還可以讓您查看程式crash時究竟發生了什麼. GDB 對可執行文件進行操作,這些可執行文件是編譯過程產生的二進制文件,GDB適合SEO分析程式開發人員來使用。
出於demo目的,以下範例在具有以下規格的 Linux 機器上執行。

讓我們邊做邊學:-
1. 轉到您的 Linux 命令提示符並鍵入“gdb”。

Gdb 打開提示讓您知道它已準備好執行命令。要退出 gdb,請鍵入 quit 或 q。

2. 下面是一個使用 C99 編譯時顯示未定義行為的程式。

注意:如果具有自動存儲持續時間的對象未顯式初始化,則其值是不確定的,其中不確定值是未指定的值或陷阱表示。
3. 現在編譯程式碼。(此處為 test.c)。
g 標誌意味著您可以在堆棧幀中看到變量和函數的正確名稱,獲取行號並在您進入可執行文件時查看源程式碼。
-std=C99 標誌意味著使用標準 C99 來編譯程式碼。
-o 標誌將構建輸出寫入輸出文件。

4. 使用生成的可執行文件運行 gdb。

對於上面的例子,這裡有一些有用的命令來開始使用 gdb:-
run 或 r –> 從頭到尾執行程式。
break 或 b –> 在特定行上設置斷點。
禁用 -> 禁用斷點。
enable –> 啟用禁用的斷點。
next 或 n -> 執行下一行程式碼,但不要深入研究函數。
步驟 –> 轉到下一條指令,深入了解該功能。
list 或 l –> 顯示程式碼。
print 或 p -> 用於顯示存儲的值。
quit 或 q -> 退出 gdb。
clear –> 清除所有斷點。
continue -> 繼續正常執行。
5.現在,在 gdb 提示符下鍵入“l”以顯示程式碼。

6. 讓我們引入一個斷點,比如第 5 行。

如果你想在不同的行放置斷點,你可以輸入“b line_number ”。默認“list or l”只顯示前10行。
7.為了查看斷點,輸入“info b”。

8. 完成上述操作後,假設您改變了主意並想恢復原狀。
鍵入“禁用 b”。

如藍色圓圈所示,Enb 變為 n 表示禁用。
9.重新啟用最近禁用的斷點。鍵入“啟用 b”。

10. 輸入“run or r”運行程式碼。如果你沒有設置任何斷點,運行命令將簡單地執行整個程式。

11. 要查看變量的值,請鍵入“print variable_name or p variable_name ”。

上面顯示了執行時存儲在 x 處的值。
12. 要更改 gdb 中變量的值並使用更改後的值繼續執行,請鍵入“set variable_name ”。
13. 下面的截圖顯示了變量的值,從中我們可以理解為什麼我們得到一個垃圾值作為輸出。在每次執行./test 時,我們都會收到不同的輸出。
練習:在第一次運行時嘗試在 gdb 中使用 set x = 0 並查看 c 的輸出。

GDB 提供了更多調試和理解程式碼的方法,例如檢查堆棧、內存、操作程式等。希望上面的範例可以幫助您開始使用 gdb。