GDB的基本工作原理

2021-06-19 17:29:29 字數 1790 閱讀 4066

原位址

還是面某m的時候,面試官問我:「用過gdb麼?」 答:「用過,調了兩年bug了」。「那好,給我解釋下gdb是怎麼工作的?或者說跟核心什麼地方有關係?」。

是阿,gdb憑什麼可以除錯乙個程式?憑什麼能夠接管乙個程式的執行?我以前也想過這樣的問題,但是後來居然忘記去檢視了。我想到了我們的二進位制翻譯器,想到了intel的pin,dynamo。這些都是將翻譯後的**放到codecache中去執行,然後接管整個程式的執行。gdb是不是也一樣呢?

如果真是這樣,為什麼我記得用gdb跑乙個程式,這個程式會有乙個單獨的程序?gdb的attach功能又是怎麼實現的?

想了想,我還是沒有答上來。面試就是由這麼乙個又乙個細節的小杯具最後匯集成乙個大杯具。

那麼,gdb到底是憑什麼接管的乙個程序的執行呢?其實,很簡單,通過乙個系統呼叫:ptrace。ptrace系統呼叫的原型如下:

#include

long ptrace(enum __ptrace_request request,  pid_t pid,

void *addr, void *data);

說明:ptrace系統呼叫提供了一種方法來讓父程序可以觀察和控制其它程序的執行,檢查和改變其核心映像以及暫存器。 主要用來實現斷點除錯和系統呼叫跟蹤。(man手冊)

其實,說到這裡,一切原理層面應該都比較明朗了(且先不去管核心中是怎麼實現ptrace的)。gdb就是呼叫這個系統呼叫,然後通過一些引數來控制其他程序的執行的。

下面我們來看ptrace函式中request引數的一些主要選項:

ptrace_traceme: 表示本程序將被其父程序跟蹤,交付給這個程序的所有訊號,即使訊號是忽略處理的(除sigkill之外),都將使其停止,父程序將通過wait()獲知這一情況。

這是什麼意思呢?我們可以結合到gdb上來看。如果在gdb中run乙個程式,首先gdb會fork乙個子程序,然後該子程序呼叫ptrace系統呼叫,引數就是ptrace_traceme,然後呼叫乙個exec執行程式。基本過程是這樣,細節上可能會有出入。需要注意的是,這個選項ptrace_traceme是由子程序呼叫的而不是父程序!

以下選項都是由父程序呼叫:

ptrace_attach:attach到乙個指定的程序,使其成為當前程序跟蹤的子程序,而子程序的行為等同於它進行了一次ptrace_traceme操作。但是,需要注意的是,雖然當前程序成為被跟蹤程序的父程序,但是子程序使用getppid()的到的仍將是其原始父程序的pid。

這下子gdb的attach功能也就明朗了。當你在gdb中使用attach命令來跟蹤乙個指定程序/執行緒的時候,gdb就自動成為改程序的父程序,而被跟蹤的程序則使用了一次ptrace_traceme,gdb也就順理成章的接管了這個程序。

ptrace_cont:繼續執行之前停止的子程序。可同時向子程序交付指定的訊號。

這個選項呢,其實就相當於gdb中的continue命令。當你使用continue命令之後,乙個被gdb停止的程序就能繼續執行下去,如果有訊號,訊號也會被交付給子程序。

除了以上這幾個選項,ptrace還有很多其他選項,可以在linux下閱讀man手冊:man ptrace

需要注意的另一點是,使用gdb除錯過多執行緒/程序的人應該都知道,當子程序遇到乙個訊號的時候,gdb就會截獲這個訊號,並將子程序暫停下來。這是為什麼呢?

實際上,在使用引數為ptrace_traceme或ptrace_attach的ptrace系統呼叫建立除錯關係之後,交付給目標程式的任何訊號(除sigkill之外)都將被gdb先行截獲,或在遠端除錯中被gdbserver截獲並通知gdb。gdb因此有機會對訊號進行相應處理,並根據訊號的屬性決定在繼續目標程式執行時是否將之前截獲的訊號實際交付給目標程式。

gdb工作的基本原理

gdb組成部分 gdb由三個部分組成 1 使用者介面user inte ce,除支援傳統的cli介面還支援mi介面 ddd等工具使用 2 符號處理層symbol handling,當gdb debugme後gdb會讀取檔案的符號資訊,之後的原 變數 函式 型別的顯示都由該部分進行 everythin...

gdb的工作原理

基本概念 gdb是做什麼的 怎麼用,就不再重述了,這裡主要從大方向講述下gdb的原理。gdb主要功能的實現基於系統函式ptrace,通過man手冊可以了解到,ptrace可以讓父程序觀察和控制其子程序的檢查 執行。函式的原型 man 2 ptrace include long ptrace enum...

gdb工作原理(一)

include long ptrace enum ptrace request request,pid t pid,void addr,void data 說明 ptrace系統呼叫提供了一種方法來讓父程序可以觀察和控制其它程序的執行,檢查和改變其核心映像以及暫存器。主要用來實現斷點除錯和系統呼叫跟...