欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
調試器是個(gè)大騙子!



我叫GDB,是一個(gè)調試器,程序員通過(guò)我可以調試他們編寫(xiě)的軟件,分析其中的bug。

作為一個(gè)調試器,調試分析是我的看家本領(lǐng),像是給目標進(jìn)程設置斷點(diǎn),或者讓它單步執行,又或是查看進(jìn)程中的變量、內存數據、CPU的寄存等等操作,我都手到擒來(lái)。

你只要輸入對應的命令,我就能幫助你調試你的程序。

我之所以有這些本事,都得歸功于一個(gè)強大的系統函數,它的名字叫ptrace。

long ptrace(
 enum __ptrace_request request,
 pid_t pid,
 void *addr,
 void *data
 )
;

不管是開(kāi)始調試進(jìn)程,還是下斷點(diǎn)、讀寫(xiě)進(jìn)程數據、讀寫(xiě)寄存器,我都是通過(guò)這個(gè)函數來(lái)進(jìn)行,要是沒(méi)了它,我可就廢了。

它的第一個(gè)參數是一個(gè)枚舉型的變量,表示要執行的操作,我支持的調試命令很多都是靠它來(lái)實(shí)現的:

你可以通過(guò)我來(lái)啟動(dòng)一個(gè)新的進(jìn)程調試,我會(huì )使用fork創(chuàng )建出一個(gè)新的子進(jìn)程,然后在子進(jìn)程中通過(guò)execv來(lái)執行你指定的程序。

不過(guò)在執行你的程序之前,我會(huì )在子進(jìn)程中調用ptrace函數,然后指定第一個(gè)參數為PTRACE_TRACEME,這樣一來(lái),我就能監控子進(jìn)程中發(fā)生的事情了,也才能對你指定的程序進(jìn)行調試。

你也可以讓我attach到一個(gè)已經(jīng)運行的進(jìn)程分析,這樣的話(huà),我直接調用ptrace函數,并且指定第一個(gè)參數為PTRACE_ATTACH就可以了,然后我就會(huì )變成那個(gè)進(jìn)程的父進(jìn)程。

具體要選擇哪種方式來(lái)調試,這就看你的需要了。不過(guò)不管哪種方式,最終我都會(huì )“接管”被調試的進(jìn)程,它里面發(fā)生的各種信號事件我都能得到通知,方便我對它進(jìn)行調試操作。

軟件斷點(diǎn)

作為一個(gè)調試器,最常用的功能就是給程序下斷點(diǎn)了。

你可以通過(guò)break命令告訴我,你要在程序的哪個(gè)位置添加斷點(diǎn)。

當我收到你的命令之后,我會(huì )偷偷把被調試進(jìn)程中那個(gè)位置的指令修改為一個(gè)0xCC,這是一條特殊指令的CPU機器碼——int 3,是x86架構CPU專(zhuān)門(mén)用來(lái)支持調試的指令。

我的這個(gè)修改是偷偷進(jìn)行的,你如果通過(guò)我來(lái)查看被調試進(jìn)程的內存數據,或者在反匯編窗口查看那里的指令,會(huì )發(fā)現跟之前一樣,這其實(shí)是我使的障眼法,讓你看起來(lái)還是原來(lái)的數據,實(shí)際上已經(jīng)被我修改過(guò)了,你要是不信,你可以另外寫(xiě)個(gè)程序來(lái)查看那里的數據內容,看看我說(shuō)的是不是真的。

一旦被調試的進(jìn)程運行到那個(gè)位置,CPU執行這條特殊的指令時(shí),會(huì )陷入內核態(tài),然后取出中斷描述符表IDT中的3號表項中的處理函數來(lái)執行。

IDT中的內容,操作系統一啟動(dòng)早就安排好了,所以系統內核會(huì )拿到CPU的執行權,隨后內核會(huì )發(fā)送一個(gè)SIGTRAP信號給到被調試的進(jìn)程。

而因為我的存在,這個(gè)信號會(huì )被我截獲,我收到以后會(huì )檢查一下是不是程序員之前下的斷點(diǎn),如果是的話(huà),就會(huì )顯示斷點(diǎn)觸發(fā)了,然后等待程序員的下一步指示。

在沒(méi)有下一步指示之前,被調試的進(jìn)程都不會(huì )進(jìn)入就緒隊列被調度執行。

直到你使用continue命令告訴我繼續,我再偷偷把替換成int 3的指令恢復,然后我再次調用ptrace函數告訴操作系統讓它繼續運行。

這就是我給程序下斷點(diǎn)的秘密。

不知道你有沒(méi)有發(fā)現一個(gè)問(wèn)題,當我把替換的指令恢復后讓它繼續運行,以后就再也不會(huì )中斷在這里了,可程序員并沒(méi)有撤銷(xiāo)這個(gè)斷點(diǎn),而是希望每次執行到這里都能中斷,這可怎么辦呢?

我有一個(gè)非常巧妙的辦法,就是讓它單步執行,只執行一條指令,然后又會(huì )中斷到我這里,但這時(shí)候我并不會(huì )通知程序員,而僅僅是把剛才恢復的斷點(diǎn)又給打上(替換指令),然后就繼續運行。這一切都發(fā)生的神不知鬼不覺(jué),程序員根本察覺(jué)不到。

單步調試

說(shuō)到單步執行,應該算是程序員調試程序的時(shí)候除了下斷點(diǎn)之外最常見(jiàn)的操作了,每一次只讓被調試的進(jìn)程運行一條指令,這樣方便跟蹤排查問(wèn)題。

你可能很好奇我是如何讓它單步執行的呢?

單步執行的實(shí)現可比下斷點(diǎn)簡(jiǎn)單多了,我不用去修改被調試進(jìn)程內存中的指令,只需要調用ptrace函數,傳遞一個(gè)PTRACE_SINGLESTEP參數就行了,操作系統會(huì )自動(dòng)把它設置為單步執行的模式。

我也很好奇操作系統是怎么辦到的,就去打聽(tīng)了一下。

原來(lái)x86架構CPU有一個(gè)標志寄存器,名叫eflags,它里面不止包含了程序運行的一些狀態(tài),還有一些工作模式的設定。

其中就有一個(gè)TF標記,用來(lái)告訴CPU進(jìn)入單步執行模式,只要把這個(gè)標記為設置為1,CPU每執行一條指令,就會(huì )觸發(fā)一次調試異常,調試異常的向量號是1,所以觸發(fā)的時(shí)候,都會(huì )取出IDT中的1號表項中的處理函數來(lái)執行。

接下來(lái)的事情就跟命中斷點(diǎn)差不多了,我會(huì )截獲到內核發(fā)給被調試進(jìn)程的SIGTRAP信號,然后等待程序員的下一步指令。

如果你繼續進(jìn)行單步調試,那我便繼續重復這個(gè)過(guò)程。

如果你有程序的源代碼,你還可以進(jìn)行源碼級別的單步調試,不過(guò)這里的單步就指的是源代碼中的一行了。

這種情況下要稍微麻煩一點(diǎn),我還要分析出每一行代碼對應的指令有哪些,然后用上面說(shuō)的單步執行指令的方法,一條條指令快速掠過(guò),直到這一行代碼對應的指令都執行完成。

內存斷點(diǎn)

有的時(shí)候,直接給程序中代碼的位置下斷點(diǎn)并不能包治百病。比如程序員發(fā)現某個(gè)內存地址的內容老是莫名其妙被修改,想知道到底是哪個(gè)函數干的,這時(shí)候連地址都沒(méi)有,根本沒(méi)法下斷點(diǎn)。

單步執行也不行,那么多條指令,得執行到猴年馬月去才能找到?

不用擔心,我可以幫你解決這個(gè)煩惱。

你可以通過(guò)watch命令告訴我,讓我監視被調試進(jìn)程中某個(gè)內存地址的數據變化,一旦發(fā)現被修改,我都會(huì )把它給停下來(lái)報告給你。

猜猜我是如何做到的呢?

我可以用單步執行的方式,每執行一步,就檢查一下內容有沒(méi)有沒(méi)修改,一旦發(fā)現就停下來(lái)通知你們程序員。

不過(guò)這種方式實(shí)在是太麻煩了,會(huì )嚴重拖垮被調試進(jìn)程的性能。

好在x86架構的CPU提供了硬件斷點(diǎn)的能力,幫我解決了大問(wèn)題。

在x86架構CPU的內部?jì)戎昧艘唤M調試寄存器,從DR0到DR7,總共8個(gè)。通過(guò)在DR0-DR3中設置要監控的內存地址,然后在DR7中設置要監控的模式,是讀還是寫(xiě),剩下的交給CPU就好了。

CPU執行的時(shí)候,一旦發(fā)現有符合調試寄存器中設置的情況發(fā)生時(shí),就會(huì )產(chǎn)生調試異常,然后取出IDT中的1號表項中的處理函數來(lái)執行,接下來(lái)的事情就跟單步調試產(chǎn)生的異常差不多了。

CPU內部依靠硬件電路來(lái)完成監控,可比我們軟件一條一條的檢查快多了!

現在,你不止可以使用watch命令來(lái)監控內存被修改,還可以使用rwatch、awatch命令來(lái)告訴我去監控內存被讀或者被寫(xiě)。

我叫GDB,是你調試程序的好伙伴,現在你該知道我是如何工作的了吧!

【完】


這里是編程技術(shù)宇宙,一個(gè)專(zhuān)注用故事分享硬核又有趣計算機知識的公眾號~

覺(jué)得不錯的話(huà),歡迎一鍵三連哦~

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
【轉】調試器是怎樣工作的: Part 2 – 斷點(diǎn)
調試器工作原理之二
解密子
GDB基本操作和應用
探索 Gdb7.0 的新特性反向調試 (reverse debug)
Linux內核調試機制源代碼分析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久