---
# System prepended metadata

title: gdb
tags: [Debugging, C]

---

# gdb

### References
+ 🔗 [**GDB 除錯技巧**](https://hackmd.io/@hsuedw/gdb_skils)
+ 🔗 [**C語言工具使用，GDB個人學習筆記**](https://ithelp.ithome.com.tw/articles/10257294)

|🔮 <span class="important">IMPORTANT</span>|
|:---|
|如果要使用 GDB 對 C 程式進行 debug，<br>需要在編譯時添加 `-g` 參數：`gcc main.c -g -o main`，<br>debug：`gdb ./main`|

|🚨 <span class="caution">CAUTION</span> : Windows 64-bits|
|:---|
|堆疊：由<mark>位址高至低</mark>放入元素或集合|
|集合：由<mark>位址低到高</mark>放入元素 (集合指的是陣列、結構)|
|元素：由<mark>位址高至低</mark>放入位元組 (小端序)|
|打印位址：該元素或集合的<mark>最低位址</mark>|


|📗 <span class="tip">TIP</span>|
|:---|
|在 Windows 平台要下指令 `set editing off` 才能使用 backspace 鍵。|

|📗 <span class="tip">TIP</span>|
|:---|
|按下 Enter 鍵表示執行上個指令。|

### Options

+ `-q`：安靜
+ `--args`：command line args
+ `-tui`：TUI (Text User Interface)
  > 也就是那些在 CLI 上，但長得像 GUI 的介面 (由文字構成)

### Commands
| Command | Shorthand   | Description |
|--------------|------|-----------------------------|
| `help`       | `h`  | 顯示指令簡短說明。<br>(例：`help breakpoint`)|
| `file`       |      | 執行 gdb 期間載入 debug 檔。等同於一開始在 CMD 的 `gdb filename`。|
| `run`        | `r`  | 執行程式，或從頭再執行程式。<br>(📗 TIP : 可將 command line args 傳給程式)|
| `kill`       |      | 中止程式的執行。|
| `backtrace`  | `bt` | 顯示程式呼叫的堆疊 (stack)。顯示出所有上層 frame 資訊。|
| `print`      | `p`  | 印出變數內容。<br>(例：`print i` 印出變數 `i` 的內容)|
| `list`       | `l`  | 印出程式碼，若編譯時未加上 `-g` 參數，該指令將無作用。|
| `whatis`     |      | 印出變數的型態。<br>(例：`whatis i` 印出變數 `i` 的型態)|
| `examine`    | `x`  | 記憶體視圖。自起點位址由<mark>低至高</mark>查看視圖。<br>(例：`x/12bx &i`<br>`12bx`: 視圖範圍 12 Bytes、以 16 進位表示<br>`&i`: 起點位址，此處提供變數 i 的位址) |
| `break`      | `b`  | 設定 breakpoint。<br>(<mark>執行會停在 breakpoint 的前一行</mark>)<br>(<mark>接著印的行號表示接下來要執行的那行</mark>)<br>(可單檔案，如：`b 6`；可跨檔案，如：`b hello.c:6`)|
| `continue`   | `c`  | 繼續執行，與 `breakpoint` 搭配使用。|
| `condition`  |      | 條件中斷，與 `breakpoint` 搭配使用。詳見[此文][condition]。 |
| `frame`      |      | 顯示當前 frame 資訊，包括執行的行數、函數名稱及傳入的參數。|
| `next`       | `n`  | 單步執行，不進入函數內部。|
| `step`       | `s`  | 單步執行，若遇到函數會進入函數內部。|
| `up`         |      | 移到上一層 frame 並顯示其資訊。`up 2` 移到上兩層 frame。|
| `down`       |      | 移到下一層 frame 並顯示其資訊。|
| `info`       | `i`  | 顯示特定資訊。<br>(例：`info break` 顯示 breakpoint，`info line` 查看程式停在哪一行)|
| `display`    |      | 追蹤變數 (<mark>每次中斷時</mark>印出變數內容)。|
| `watch`      |      | 追蹤變數 (<mark>內容有變時</mark>時印出變數內容)。|
| `disable`    |      | 暫時關閉某個 breakpoint 或 `display` 功能。|
| `enable`     |      | 啟用被 `disable` 暫時關閉的功能。|
| `clear`      |      | 刪除某個 breakpoint。|
| `attach`     |      | 載入已執行中的程式以進行除錯，PID 可由 `ps` 指令取得。|
| `detach`     |      | 釋放已 attach 的程式。|
| `shell`      |      | 執行 Shell 指令。<br>(📗 TIP : 也就是說你可以藉由這個指令清空 terminal，如：`shell clear`)|
| `quit`       |      | 離開 GDB，或按 `Ctrl+C`。|
| `set`        |      | 設定變數。<br />(例如：`set $ptr = &list[2]`，變數一如既往，能進行運算或 dereference) |


[condition]: https://cgi.cse.unsw.edu.au/~learn/debugging/modules/gdb_conditional_breakpoints/