日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

gdb這個debug工具,應該無人不知吧。服務器開發(fā)和客戶端開發(fā)人員應該都或多或少的通過這個工具排查問題。但有沒有想過它的實現(xiàn)原理,為什么打斷點能夠在斷點處停止運行?為什么能查看cpu寄存器?等等。我們就帶著這些疑問接著往下看。

知識鋪墊

我們都聽說過系統(tǒng)調(diào)用,這里簡單的解釋下系統(tǒng)調(diào)用的含義。操作系統(tǒng)提供了一種標準的服務來讓程序員實現(xiàn)對底層的硬件和服務的控制,比如申請、釋放內(nèi)存,打開、關閉文件等等,這就叫做系統(tǒng)調(diào)用(system calls)。

系統(tǒng)調(diào)用的過程比較復雜,大致流程是這樣的:將相關參數(shù)放進系統(tǒng)調(diào)用的相關寄存器中,然后調(diào)用軟中斷(0x80),這個中斷作用就是讓一個程序從用戶態(tài)陷入到內(nèi)核態(tài)執(zhí)行,程序?qū)?shù)和系統(tǒng)調(diào)用號交給內(nèi)核,內(nèi)核來執(zhí)行。

看完這個知識鋪墊,估計心里猜測跟系統(tǒng)調(diào)用有關系了。確實不是特別高大上的技術,只是利用了linux提供的非常優(yōu)雅的方式:ptrace系統(tǒng)調(diào)用,用man查看以下這個系統(tǒng)調(diào)用。ptrace可以讓父進程觀察和控制其子進程的檢查、執(zhí)行,改變其寄存器和內(nèi)存的內(nèi)容。主要的作用就是大家常用的打斷點的功能了,還有一個功能是打印系統(tǒng)調(diào)用的軌跡信息。

我們先來看下這個ptrace函數(shù)的原型:

  •  
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid,
 void *addr, void *data);

第一個參數(shù)決定了ptrace的行為與其他參數(shù)的使用方法。可取的值有:

  •  
PTRACE_ME
PTRACE_PEEKTEXT
PTRACE_PEEKDATA
PTRACE_PEEKUSER
PTRACE_POKETEXT
PTRACE_POKEDATA
PTRACE_POKEUSER
PTRACE_GETREGS
PTRACE_GETFPREGS,
PTRACE_SETREGS
PTRACE_SETFPREGS
PTRACE_CONT
PTRACE_SYSCALL,
PTRACE_SINGLESTEP
PTRACE_DETACH

 

下面對常用的幾種模式進行說明。

  1. PTRACE_ME(跟蹤我):這是相對父進程而言的。功能是指示父進程,對其進行跟蹤。trace工具的實現(xiàn)就是用這個模式。
  2. PTRACE_GETREGS:讀取寄存器的值。如果你想在系統(tǒng)調(diào)用或者進程停止前讀取它的寄存器。這就回答了文章開頭的第二個問題。
  3. PTRACE_SINGLESTEP:單步。會使內(nèi)核在子進程的每一條指令執(zhí)行前先將其阻塞,然后控制權(quán)交給父進程。
  4. PTRACE_PEEKDATA:設置斷點。調(diào)試器怎么設置斷點的呢?通常情況下,將當前需要執(zhí)行的指令替換成trap指令,于是就會停在當前位置。被調(diào)試程序恢復運行以后調(diào)試器將原指令放回來就可以了。具體實現(xiàn)過程請接著往下看!

詳細可參考《http://man7.org/linux/man-pages/man2/ptrace.2.html》

gdb三種調(diào)試方式

看完ptrace使用方法,再來看看gdb的三種調(diào)試方式。

  1. attach并調(diào)試一個已經(jīng)運行的進程: 確定需要進行調(diào)試的進程id ;運行gdb,輸入attch pid,如:gdb 12345。gdb將對指定進行執(zhí)行如下操作:ptrace(PTRACE_ATTACH,pid,0,0)
  2. 運行并調(diào)試一個新的進程 :運行gdb,通過命令行參數(shù)或file指定目標調(diào)試程序,如gdb ./test ;輸入run命令,gdb執(zhí)行下述操作: 通過fork()系統(tǒng)調(diào)用創(chuàng)建一個新進程 。在新創(chuàng)建的子進程中調(diào)用ptrace(PTRACE_TRACEME,0,0,0) 。在子進程中通過execv()系統(tǒng)調(diào)用加載用戶指定的可執(zhí)行文件
  3. 遠程調(diào)試目標主機上新創(chuàng)建的進程 :gdb運行在調(diào)試機,gdbserver運行在目標機,通過二者之間定義的數(shù)據(jù)格式進行通信。

 

斷點的實現(xiàn)過程

再回到剛文章開頭的問題,斷點是怎樣實現(xiàn)的呢?我從上面文字中知道gdb調(diào)試的實現(xiàn)都是建立在信號的基礎上的。在使用參數(shù)為PTRACE_TRACEME或PTRACE_ATTACH的ptrace系統(tǒng)調(diào)用建立調(diào)試關系后,交付給目標程序的任何信號首先都會被gdb截獲。

因此gdb可以先行對信號進行相應處理,并根據(jù)信號的屬性決定是否要將信號交付給目標程序。

當用breakpoint 設置一個斷點后,gdb會在=找到該位置對應的具體地址,然后向該地址寫入斷點指令INT3,即0xCC。

目標程序運行到這條指令時,就會觸發(fā)SIGTRAP信號,gdb會首先捕獲到這個信號。然后根據(jù)目標程序當前停止的位置在gdb維護的斷點鏈表中查詢,若存在,則可判定為命中斷點。

分享到:
標簽:gdb
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定