【正文】
gdb會在用戶下次發(fā)出繼續(xù)目標程序運行的命令時,將所有斷點插入目標程序,新設(shè)置的斷點到這個時候才會實際存在于目標程序中。因此,實現(xiàn) finish命令時,只需找到當前函數(shù)的返回地址,并在該處插入一個臨時斷點,然后讓目標程序繼續(xù)運行,直至遇到該斷點而停止。分析其實現(xiàn)機制首先需要理解 step range以及 step_range_start和 step_range_end的概念。一旦發(fā)現(xiàn)某個文件描述符上有輸入事件,就將該事件分發(fā)給相應(yīng)的功能模塊進行處理,該事件處理完畢之后將回到事件循環(huán)繼續(xù)進行 poll操作。 ? gdb因此有機會對信號進行相應(yīng)處理,并根據(jù)信號的屬性決定在繼續(xù)目標程序運行時是否將之前截獲的信號實際交付給目標程序。 ? gdb的主要功能 – 救死扶傷。 ? RSP協(xié)議數(shù)據(jù)的基本格式為:“ $..........xx”。共有兩個外部事件源,一個是標準輸入(用戶輸入的調(diào)試命令),一個是遠程連接( gdbserver上報的異步事件)。對于此類架構(gòu), gdb采用的是用臨時的軟件斷點來模擬單步的方法。 ? nexti命令實現(xiàn)指令級單步,和 next命令類似, nexti命令單步過程中不會進入子函數(shù)調(diào)用。當判定為斷點命中之后,若該斷點為臨時斷點, gdb就會將這個斷點刪除。非隨機信號是指 gdb已經(jīng)預(yù)知其會發(fā)生或者本身就是 gdb導(dǎo)致的信號,也就是說,這些信號是具有明確的調(diào)試含義的,比如遇到斷點指令時的 SIGTRAP。 ? 帶參數(shù)的 until命令讓目標程序繼續(xù)運行,直至達到指定位置為止。8 0 4 8 3 e a : m o v 0 x 8 0 4 9 6 c 4 , % e a x8 0 4 8 3 e f : a d d $ 0 x 1 , % e a x8 0 4 8 3 f 2 : m o v % e a x , 0 x 8 0 4 9 6 c 4 c n t + + 。 gdb指令級單步的實現(xiàn) ( 1) ? 所謂指令級單步就是指 gdb控制目標程序只運行一條指令之后即停止。目標程序運行到這條指令之后就會觸發(fā) SIGTRAP信號, gdb捕獲到這個信號,根據(jù)目標程序當前停止位置查詢 gdb維護的斷點鏈表,若發(fā)現(xiàn)在該地址確實存在斷點,則可判定為斷點命中。 ? ptrace系統(tǒng)調(diào)用的簡要說明 ptrace系統(tǒng)調(diào)用提供了一種方法來讓父進程可以觀察和控制其它進程的執(zhí)行,檢查和改變其核心映像以及寄存器。 ? 輸入 run命令, gdb執(zhí)行下述操作: ? 通過 fork()系統(tǒng)調(diào)用創(chuàng)建一個新進程; ? 在新創(chuàng)建的子進程中執(zhí)行下述操作:ptrace(PTRACE_TRACEME, 0, 0, 0)。 ? 使用同步模式還是異步模式由調(diào)試目標決定,在啟動 gdb之后通過target命令的參數(shù)給出。對于 ppc,則可通過設(shè)置MSR寄存器中的 SE標志來將 cpu置于單步模式。 8 0 4 8 3 5 f : m o v 0 x 8 0 4 9 5 5 4 , % e a x 8 0 4 8 3 6 4 : a d d $ 0 x 1 , % e a x 8 0 4 8 3 6 7 : m o v % e a x , 0 x 8 0 4 9 5 5 4i n t f o o ( i n t m ){ 8 0 4 8 3 2 4 : p u s h % e b p 8 0 4 8 3 2 5 : m o v % e s p , % e b p r e t u r n m + 1 。是否命中斷點的