---
# System prepended metadata

title: Debug Hacks 筆記

---

# 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
