gdb偵錯程式可以啟動某些程序,然後對其進行除錯,或者將自己本身關聯到乙個已存在的程序之上。它可以單步執行**,設定斷點然後執行程式,檢查變數的值以及跟蹤呼叫棧等等。
gdb通過乙個系統呼叫「ptrace」
接管乙個程序的執行
。ptrace系統呼叫是乙個功能眾多且相當複雜的工具,能允許乙個程序控制另乙個程序的執行,而且可以監視和滲入到程序內部。
ptrace系統呼叫的原型如下:
#includelong ptrace(
enum __ptrace_request request,
pid_t pid,
void
*addr,
void
*data)
;
第乙個引數是request,可以是預定義的以ptrace_打頭的常量值;
第二個引數指定了程序id;
第三以及第四個引數是位址和指向資料的指標,用來
對記憶體做操作。
request
=ptrace_traceme:
表示這個子程序要求作業系統核心允許它的父程序對其跟蹤。
如果在gdb中run乙個程式,首先gdb會fork乙個子程序,然後該子程序呼叫ptrace系統呼叫,引數就是ptrace_traceme,
通過execl來呼叫我們指定的程式
。作業系統核心會在子程序開始執行execl中指定的程式之前停止該程序,並傳送乙個訊號給父程序
。需要注意的是,
這個選項ptrace_traceme是由子程序呼叫的而不是父程序!
request=
ptrace_attach:
attach到乙個指定的程序,使其成為當前程序跟蹤的子程序,而子程序的行為等同於它進行了一次ptrace_traceme操作。
但是,需要注意的是,雖然當前程序成為被跟蹤程序的父程序,但是子程序使用getppid()的到的仍將是其原始父程序的pid。
當你在gdb中使用attach命令來跟蹤乙個指定程序/執行緒的時候,gdb就自動成為該程序的父程序,而被跟蹤的程序則使用了一次ptrace_traceme,gdb也就順理成章的接管了這個程序。
request=
ptrace_cont:
繼續執行之前停止的子程序。可同時向子程序交付指定的訊號。
這個選項
相當於gdb中的continue命令。當你使用continue命令之後,乙個被gdb停止的程序就能繼續執行下去,如果有訊號,訊號也會被交付給子程序。
GDB除錯原理 ptrace系統呼叫
全部關於gdb的文章索引請點這裡 引子 gdb基本上大家都在用,你有沒有想過它的實現原理是什麼?為什麼它可以控制程式執行 中斷 訪問記憶體甚至直接使程式流程改變?在使用gdb除錯程式時,程式的程序狀態是 t 但又似乎並非接到了sigstop訊號,那麼這個 t 是什麼呢?追根溯源,我們今天來研究一下l...
C 多型原理詳解(GDB除錯分析)
在計算類大小時提及到了類中虛指標及虛函式表的結構,但並沒有相對較為充足的依據,下來借助gdb工具來分析一下c 中虛指標及虛函式表的詳細結構 以下 執行環境均為linux下的64位作業系統 無繼承的單類案例 如下 include using namespace std class a virtual ...
gdb 除錯 vs除錯
一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...