1. 程式人生 > >gdb工作的基本原理

gdb工作的基本原理

Gdb組成部分
GDB由三個部分組成:
(1)使用者介面user interface,除支援傳統的CLI介面還支援mi介面(ddd等工具使用)
(2)符號處理層symbol handling,當gdb ./debugme後GDB會讀取檔案的符號資訊,之後的原始碼,變數/函式/型別的顯示都由該部分進行(everything you can do without live process)。
(3)目標系統處理層target system handling。包括執行控制,斷點設定,單步執行,堆疊分析等操作都有該部分來進行。
Gdb使用技巧
1)設定斷點的方法包括:函式,行號,if條件斷點express,這些前面都可以跟上檔名。另外還可以設定地址斷點:b *0x8048424.
2)GDB用來分析core檔案,啟動格式:gdb debugme core.xyz
3)開啟core檔案生成的方法是: ulimit -c unlimited
4)在不同函式的呼叫棧上切換及檢視當前資訊:bt/frame XX/up/down/info frame/args/locals
5)除錯一正執行的程序:gdb debugme pid或者gdb debugme + attach pid + detach,類似的應用還有:strace/ltrace/truss
6)如果某個執行緒/程序處於死鎖狀態,還可以通過gcore pid來手動生成core檔案來分析當前執行緒/程序的狀態,然後利用GDB來分析, gcore使用方法:gcore pid,注意被除錯的程序會臨時性停止去生成core檔案
7)檢視函式的反彙編指令:disassemble fun_name
8)彙編指令級別的單步執行:ni/si,顯示當前執行的彙編指令: x/i $pc
9)檢視暫存器的內容:info registers/all-registers
10)檢視某地址開始的內容:x/num 0xYYYYYYY 檢視從0xYYYYYYY開始的num個單元內容;p 輸出陣列內容
11)在函式除錯中途強制返回:return ;
12)向被除錯程式傳送指定訊號:在任意一點ctrl+C進入gdb除錯命令列,然後:signal 1-15

gdb的斷點是基於訊號(signal)實現的
在某個地址增加一個斷點,實際上就是修改那個地址的程式碼,把原來的程式碼替換成INT 3指令,同時讓gdb捕獲這個signal並做相應的處理:包括執行被替換掉的指令,並跳轉回來。
因此,只要斷點不被走到,那麼斷點就不會影響程式的執行效率;因為程式的其他地方都沒改變,該怎麼執行還是怎麼執行。

gdb在遇到斷點之後可以做很多事情
包括:
停下來等使用者處理
自動繼續
自動執行一些gdb指令(用commands命令可以配置斷點的自動執行)
判斷條件是否要停下來(這就是大名鼎鼎的條件斷點)

在走到斷點之後,不管是路過還是停下來,都會影響效能


因為通常到了斷點就會通過INT3停下來。
只是條件斷點有點特別,它分為軟體和硬體兩種。這是因為條件斷點這個需求太普遍了,因此有人就想了一個辦法從硬體支援一部分:在x86平臺,某些條件斷點可以不插入INT 3,而是插入一個其他指令,當程式走到這個地址的時候,並不是直接發出INT 3訊號,而是先去比較一下特定暫存器和某個地址的內容,再決定要不要INT 3。
如果能採用硬體條件斷點,會比軟體條件斷點的效能好很多。搜尋‘硬體斷點寄 存器’會找到更多資訊。
Reference
1. GDB除錯-基礎篇
2. GDB除錯-實現斷點
3. GDB除錯-除錯資訊
4. gdb使用及原理
5.
GDB中斷原理