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