# GDB介紹
{%hackmd BJrTq20hE %}
最簡單方便的除錯工具不外乎是列印指令 (e.g., printf),但是設想下以下的情況:
某個迴圈可能在第一百萬零七十三次才出錯,這當中印出來的 debug 資料可能多到令人頭昏。因此我們需要一個工具,讓我們可以一邊執行你的程式, 一邊視需要將它停下來觀察當中某些變數的變化。如果發現問題不在此處,還可以叫它繼續執行。執行到一半,還可以手動修改變數的值,看看如果這個問題解決了,下個又在何處,一口氣解決好幾個問題。這些就是 debugger 的工作。
GDB 一種命令列模式的 debugger。若以下列語言撰寫程式 C, objective C, C++, Fortran, Pascal, Ada, ... 等等,而且採用的編譯器是來自 gnu,那麼就可以拿 GDB 來除錯。
## 使用方法 (以 c 程式舉例)
首先在編譯程式時,需要加上 -g 參數,以便編譯器將除錯資訊加入到程式裡:
```shell
$ gcc -Wall -g -o test test.c
```
接著在輸入下列命令,即可進入 GDB:
```shell
$ gdb ./test
```
下列一些常用的命令:
- run / r : 執行該程式
- list / l : 列出程式碼
- break / b LOC: 設定中斷點,LOC 可以是行數、指令記憶體位置
```shell
(gdb) break 5
```
- continue / c : 繼續執行,通常與 break 搭配使用
- next / n : 單步執行,但**不會**進入 function 中
- step / s : 單步執行,但**會**進入 function 中
- print / p VAR: 印出 VAR 變數當前的值
```shell
(gdb) print a
```
也可以直接賦予一個值給 VAR
```shell
(gdb) print a = 100
```
- display VAR: 每一個單步執行都顯示 VAR 的值
- info : 顯示特定的資訊,像是 info break 顯示已設定了哪些中斷點
```shell
(gdb) info break
```
- disable / enable (break / display NUM) : 關閉、開啟編號 NUM 的 display 或 break。若未加任何資訊,則關閉所有的 break 以及 display
```shell
(gdb) disable break 1
```
- delete : 刪除編號 NUM 的 display 或 break
- ptype : 顯示表達式的類型
- attach PID : 載入已執行中的程式以進行除錯,其中的 PID 可由 ps 指令取得
- detach PID : 釋放已 attach 的程式
- quit / q : 結束 GDB
### x 命令檢查記憶體
根據 (gdb) help x
> Examine memory: x/FMT ADDRESS.
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char), s(string) and z(hex, zero padded on the left).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed according to the format.
簡單來說,此命令會根據要求的格式、數量,輸出在記憶體位置 ADDRESS 的內容。
例如: 假設 `i` 內容為 `10`
```shell
(gdb) x/4xb &i
0x7fffffffdf7c: 0x0a 0x00 0x00 0x00
```
值得注意的是輸出的結果會受 cpu 採用哪種位元組順序 (big-endian 還是 little-endian) 影響。此例為 little-endian。
## 參考資料
- [Debugging with GDB (入門篇)](http://www.study-area.org/goldencat/debug.htm)
- [Introduction to gdb](https://www.slideshare.net/owenhsu/introduction-to-gdb-3790833)