软件调试学习笔记(二)—— 调试事件的采集
軟件調(diào)試學(xué)習(xí)筆記(二)—— 調(diào)試事件的采集
- 要點(diǎn)回顧
- 調(diào)試事件的種類
- 調(diào)試事件采集函數(shù)
- 例:分析PspUserThreadStartup
- 例:分析PspExitThread
- 總結(jié)
要點(diǎn)回顧
思考:是否所有的調(diào)試事件都會(huì)被記錄到鏈表中?
答案:調(diào)試事件有不同種類,只有幾個(gè)最關(guān)鍵的種類才會(huì)被記錄到鏈表中,例如被調(diào)試進(jìn)程進(jìn)行文件讀寫、申請內(nèi)存、釋放內(nèi)存等行為時(shí)不會(huì)產(chǎn)生調(diào)試事件。
調(diào)試事件的種類
Windows將調(diào)試事件的種類分為8種:
typedef enum _DBGKM_APINUMBER {DbgKmExceptionApi = 0, //所有異常DbgKmCreateThreadApi = 1, //創(chuàng)建線程DbgKmCreateProcessApi = 2, //創(chuàng)建進(jìn)程DbgKmExitThreadApi = 3, //線程退出DbgKmExitProcessApi = 4, //進(jìn)程退出DbgKmLoadDllApi = 5, //加載DLLDbgKmUnloadDllApi = 6, //卸載DLLDbgKmErrorReportApi = 7, //已廢棄DbgKmMaxApiNumber = 8, //最大值 } DBGKM_APINUMBER;由于DbgKmErrorReportApi已經(jīng)廢棄,因此真正的調(diào)試事件只有7種。
思考:調(diào)試事件由誰生成,又是誰將調(diào)試事件寫入對應(yīng)的鏈表當(dāng)中?
答案:調(diào)試事件采集函數(shù)。
調(diào)試事件采集函數(shù)
描述:
1)調(diào)試器在被調(diào)試進(jìn)程進(jìn)行特定操作的必經(jīng)之路中調(diào)試事件采集函數(shù),必經(jīng)之路分為5條,其中以Dbgk開頭的函數(shù)為調(diào)試事件采集函數(shù),所有調(diào)試事件采集函數(shù)最終都會(huì)調(diào)用DbgkpSendApiMessage將封裝好的調(diào)試事件結(jié)構(gòu)體寫入到鏈表當(dāng)中。
2)DbgkSendApiMessage有兩個(gè)參數(shù),第一個(gè)參數(shù)為調(diào)試事件類型,第二個(gè)參數(shù)為是否掛起其它線程,有時(shí)需要,比如0xCC,有時(shí)不需要,比如模塊加載。
創(chuàng)建進(jìn)程、線程必經(jīng)之路:
PspUserThreadStartup() ↓ DbgkCreateThread() ↓ DbgkpSendApiMessage()退出線程、進(jìn)程必經(jīng)之路:
PspExitThread() ↓ DbgkExitThread()/DbgkExitProcess() ↓ DbgkpSendApiMessage()加載模塊的必經(jīng)之路:
LoadLibrary ↓ CreateMapping ↓ NtMapViewOfSection() ↓ DbgkMapViewOfSection() ↓ DbgkpSendApiMessage()卸載模塊的必經(jīng)之路:
NtUnMapViewOfSection() ↓ DbgkUnMapViewOfSection() ↓ DbgkpSendApiMessage()異常的必經(jīng)之路:
KiDispatchException() ↓ DbgkForwardException() ↓ DbgkpSendApiMessage()例:分析PspUserThreadStartup
例:分析PspExitThread
思考:為什么各個(gè)調(diào)試事件要用不同的函數(shù)去收集?
答案:因?yàn)椴煌{(diào)試事件處理時(shí)所需的信息不同、用于存儲信息的結(jié)構(gòu)體也不同。
總結(jié)
總結(jié)
以上是生活随笔為你收集整理的软件调试学习笔记(二)—— 调试事件的采集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件调试学习笔记(一)—— 调试对象
- 下一篇: 软件调试学习笔记(三)—— 调试事件的处