# Debug Hacks 筆記 資料主要來自 《Debug Hacks除錯駭客:極致除錯的技巧與工具》 [TOC] ## Core dump ### 建立 core file 使用 `ulimit -c` 確認 core dump 啟用與否,回傳值為 core file 大小限制, 0 表示未啟用 `ulimit -c <size>` 可設定 core file 大小限制 (單位為 byte) ,可用 `unlimited` 設為無上限 啟用後發生 `segmentation fault (core dumped)` 時,會在目前的目錄下建立 core file 可設定在特定目錄下產生以及檔名 ### 透過 gdb 除錯 core file 可透過 gdb 除錯 `gdb -c core ./a.out` 可使用 `list` 指令顯示周遭原始碼 (簡寫 `l`) ## 基本用法與流程 ### 1. 透過 `-g` 選項,在編譯時產生 debug 資訊 ### 2. 開啟 gdb 形式 : `$ gdb 執行檔名` ### 3. 設定中斷點 形式 : `break 中斷點位置` 其中 break 可簡寫為 b 中斷點位置形式可為 : 函式名稱、行號、檔名:行號、檔名:函式名稱、+偏移量、-偏移量、\*位址 偏移量是以目前停止位置為起點 若不指定中斷點,會把下一個指令設為中斷點 形式 : `break 中斷點 if 條件` 可以只在符合條件時暫停執行 形式 : `condition 中斷點編號 條件` 可以為中斷點新增條件 形式 : `condition 中斷點編號` 可以刪除中斷點條件 程式執行到中斷點暫停時,可顯示變數值、stack frame、設定中斷點 ### 4. 執行 形式 : `run` 也可透過 `start` 使程式執行到 `main()` 暫停 暫停後繼續執行可使用 `continue` or `c` 繼續執行 `continue 次數` `step 次數` `stepi 次數` `next 次數` `nexti 次數` 可指定略過的中斷點數量 也可使用 `ignore 中斷點編號 次數` 來忽視該中斷點數次 `next` or `n` 逐步執行但不會進入 function `step` or `s` 則會進入 function `finish` 執行到目前函式結束 `until` `until 位址` 執行到目前函式結束或離開目前迴圈 ### 5. 獲取資訊 #### 顯示 stack frame 形式 :`backtrace N` 顯示最初 N 個 frame 形式 :`backtrace -N` 顯示最後 N 個 frame 形式 :`backtrace full N` 額外顯示區域變數 可簡寫為 `bt` #### 顯示 variable 形式 : `print 變數` 若不提供變數名稱則顯示 history 中最後顯示的變數 無法顯示所在 function 外的區域變數,但要注意若之前有使用 `bt` 顯示的變數不在此限 可簡寫為 `p` #### 顯示 register 形式 :`info registers` or `info reg` or `i r` 應該為印出所有 registers 形式 :`p/格式變數` 印出單一變數,可指定顯示格式為各進位數、浮點數、字串等 形式 :`x/<數量><格式><大小> 位置` 如 `x/5xb $pc` 顯示 pc 後 5 個 bytes 用十六進位格式 也可使用 `i` 進行反組譯,此時 `<大小>` 不被使用 形式 :`disassemble <program counter>` or `disassemble <開始位置>, <結束位置>` 為反組譯指令 簡寫`disas` ## 其他常用操作 ### Print history 使用 `print` 顯示的值的時候前方會有 `$number` 標記,這些值會在內部紀錄歷程,可運用在其他算式 `show value` 可顯示最後出現的 10 個值 ### Watchpoint 形式 :`watch 運算式` 運算式發生變化時暫停 形式 :`awatch 運算式` 運算式被讀取、改寫時暫停 形式 :`rwatch 運算式` 運算式被讀取時暫停 運算式可以是單一變數 ### info b `info b` 可顯示當前設置的 breakpoint 與 watchpoint ### 刪除 關閉 Breakpoint 形式 :`delete 編號` 形式 :`clear` `clear 函式名` `clear 行號` `clear 檔名:行號` `clear 檔名:函式名` 刪除 breakpoint 或 watchpoint `disable` `disable 中斷點編號` `disable display 顯示編號` `disable mem 記憶體範圍` 關閉 breakpoint `enable` `enable 中斷點編號` `enable once 中斷點編號` `enable delete 中斷點編號` `enable display 顯示編號` `enable mem 記憶體範圍` 重新啟用 breakpoint ,有的指令可以只啟用一次就關閉或刪除 ### 修改變數值 形式 :`set variable 變數=運算式` ### 建立變數 可以自由定義變數,名稱要以 $ 為開頭,由英數構成 ### 產生 Core file `generate-core-file` 另外可再命令列使用 `gcore pidof emacs` 產生 ### Breakpoint 指令 ``` commands 中斷點編號 指令 ... end ``` 在指定中斷點暫停時,自動執行命令 若設定第一個指令為 `silent` 就不會顯示訊息,可用來設定顯示內容 ### 指令定義 ``` define 指令名稱 指令 ... end ``` 還可用 `document` 設定 `help` 會顯示的說明文件 ``` define 指令名稱 說明內容 end ``` ### Attach 到 process 上 針對已經啟動的程式,使用 `attach pid` 進行附掛 `ps` 指令可查詢 process ID ## Kernel debug 準備 ### Oops