# 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/