基本概念:
gdb是做什麼的、怎麼用,就不再重述了,這裡主要從大方向講述下gdb的原理。gdb主要功能的實現基於系統函式ptrace,通過man手冊可以了解到,ptrace可以讓父程序觀察和控制其子程序的檢查、執行。
函式的原型:
// man 2 ptrace
#include long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
/*ptrace_traceme
表示本程序將被其父程序跟蹤,交付給這個程序的所有訊號(除sigkill之外),都將使其停止,父程序將通過wait()獲知這一情況。
ptrace_attach
attach到乙個指定的程序,使其成為當前程序跟蹤的子程序,子程序的行為等同於它進行了一次ptrace_traceme操作。
ptrace_cont
繼續執行之前停止的子程序。可同時向子程序交付指定的訊號。
*/
gdb除錯程式:
1.假設存在程序a.out
2.執行a.out產生了core檔案
3.使用gdb進行除錯:gdb a.out core
4.gdb除錯core檔案時:通過fork函式建立乙個子程序,在子程序中執行ptrace(ptrace_traceme, 0, 0, 0)函式,然後通過execv()函式呼叫a.out
這裡可以看到用gdb除錯時,會有gdb程序和產生core的子程序:
GDB的基本工作原理
原位址 還是面某m的時候,面試官問我 用過gdb麼?答 用過,調了兩年bug了 那好,給我解釋下gdb是怎麼工作的?或者說跟核心什麼地方有關係?是阿,gdb憑什麼可以除錯乙個程式?憑什麼能夠接管乙個程式的執行?我以前也想過這樣的問題,但是後來居然忘記去檢視了。我想到了我們的二進位制翻譯器,想到了in...
gdb工作原理(一)
include long ptrace enum ptrace request request,pid t pid,void addr,void data 說明 ptrace系統呼叫提供了一種方法來讓父程序可以觀察和控制其它程序的執行,檢查和改變其核心映像以及暫存器。主要用來實現斷點除錯和系統呼叫跟...
gdb工作的基本原理
gdb組成部分 gdb由三個部分組成 1 使用者介面user inte ce,除支援傳統的cli介面還支援mi介面 ddd等工具使用 2 符號處理層symbol handling,當gdb debugme後gdb會讀取檔案的符號資訊,之後的原 變數 函式 型別的顯示都由該部分進行 everythin...