WinDBG 要点学习
生活随笔
收集整理的這篇文章主要介紹了
WinDBG 要点学习
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
WinDBG
?用戶可以自由定義調(diào)試事件的處理方式,編寫調(diào)試擴(kuò)展模塊來(lái)定制和補(bǔ)充WinDBG的調(diào)試功能。
?目前版本的WinDBG提供了20多條標(biāo)準(zhǔn)命令,140 多條元命令,大量的擴(kuò)展命令。
?WinDBG使用工作空間來(lái)描述和存儲(chǔ)一個(gè)調(diào)試項(xiàng)目的屬性、參數(shù)、以及調(diào)試器設(shè)置等信息。
?WinDBG支持兩種方法在命令中加入注釋文字,一種是使用*命令,一種使用$$。
?WinDBG支持定義和使用三類別名:用戶命名別名,固定名稱別名,WinDBG自動(dòng)定義的別名。
?在很多命令前可以加上進(jìn)程和線程限定符,用來(lái)指定這些命令所適用的進(jìn)程和線程。
?以下命令顯示0號(hào)線程的寄存器和棧回溯,
~0r;~0k;
?可以把輸入的命令和命令的執(zhí)行結(jié)果記錄到一個(gè)文本文件中,稱為L(zhǎng)og File。
?附加到已經(jīng)運(yùn)行的進(jìn)程的方法有:使用菜單或F6熱鍵;將WinDBG設(shè)置為JIT調(diào)試器;啟動(dòng)WinDBG時(shí)使用-p開關(guān);啟動(dòng)WinDBG時(shí)使用-pn開關(guān);使用.attach命令。
?當(dāng)調(diào)試系統(tǒng)服務(wù)或者被其它程序自動(dòng)啟動(dòng)的程序時(shí),通常需要使用上面介紹的方法來(lái)建立調(diào)試會(huì)話。
?非入侵式調(diào)試,WinDBG與目標(biāo)進(jìn)程沒有真正建立調(diào)試與被調(diào)試的關(guān)系。
WinDBG 雙機(jī)內(nèi)核調(diào)試
?兩臺(tái)系統(tǒng)之間的通信方式,目前WinDBG支持串行口、1394、USB2三種方式。
?內(nèi)核調(diào)試引擎內(nèi)建在Windows系統(tǒng)中,缺省是禁止的。
?如果目標(biāo)系統(tǒng)是Windows Vista,應(yīng)該使用BCDEdit工具來(lái)修改它的啟動(dòng)選項(xiàng)。
?對(duì)于串行口方式,主機(jī)和目標(biāo)系統(tǒng)所使用的COM端口號(hào)可以不同,但波特率應(yīng)該一樣。
?對(duì)于1394方式,主機(jī)和目標(biāo)機(jī)的channel號(hào)一定要一致。
?所謂局部上下文,Local Context,是指局部變量所基于的語(yǔ)境。
?在調(diào)試時(shí),調(diào)試器缺省顯示的是當(dāng)前函數(shù)所對(duì)應(yīng)的局部上下文。
?當(dāng)前函數(shù)和局部變量都是與棧幀密切相關(guān)的,所以WinDBG調(diào)試器通常使用棧幀號(hào)來(lái)代表局部上下文。
?使用不帶任何參數(shù)的.frame命令可觀察當(dāng)前的局部上下文。
?使用dv命令可以顯示當(dāng)前函數(shù)的參數(shù)和局部變量。
?;厮莸幕驹砗筒襟E
?根據(jù)程序的當(dāng)前執(zhí)行位置,得到程序指針寄存器的值,然后查找符號(hào)得到當(dāng)前所在的函數(shù)。
?尋找當(dāng)前函數(shù)的棧幀基準(zhǔn)地址;EBP是棧幀的基準(zhǔn)地址,ESP是棧的當(dāng)前棧頂?shù)刂贰?
?得到的EBP值便是?;厮輬?bào)告中的ChildEBP值,將其記錄在當(dāng)前行的第一列。
?尋找當(dāng)前函數(shù)的返回地址,這個(gè)信息通常被保存在EBP+4位置。
?典型的函數(shù)返回地址在0x400000到0x80000000間。
?尋找父函數(shù)的棧幀基地址;繼續(xù)尋找父函數(shù)的父函數(shù);直到ChildEBP值等于0,表示已經(jīng)到達(dá)當(dāng)前線程的最后一幀。
?命令e用來(lái)修改指定內(nèi)置地址或者區(qū)域的內(nèi)容。
?在任一用戶態(tài)調(diào)試會(huì)話中執(zhí)行dt ntdll!*List*可以看到很多鏈表類型。
?Windows中主要使用兩種鏈表,一種是雙向鏈表,每個(gè)節(jié)點(diǎn)是一個(gè)LIST_ENTRY結(jié)構(gòu)。
?另一種是單向鏈表,每個(gè)節(jié)點(diǎn)是SINGLE_LIST_ENTRY結(jié)構(gòu)。
?Windows系統(tǒng)內(nèi)所有進(jìn)程的EPROCESS結(jié)構(gòu)是通過ActiveProcessLinks字段相互鏈接的。
?全局變量PsInitialSystemProcess記錄了初始的系統(tǒng)進(jìn)程的EPROCESS結(jié)構(gòu)的地址。
?使用如下的dt命令來(lái)遍歷所有進(jìn)程,
dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni poi(PsInitialSystemProcess)
?可使用WinDBG的.call元命令來(lái)從調(diào)試器中調(diào)用被調(diào)試程序中的函數(shù)。
?模仿C/C++語(yǔ)言中的流程控制關(guān)鍵字,WinDBG定義了一系列元命令和擴(kuò)展來(lái)實(shí)現(xiàn)流程控制,統(tǒng)稱為流程控制符號(hào)。
?WinDBG命令程序中可以使用如下幾種變量:自動(dòng)的偽寄存器;用戶賦值的偽寄存器;用戶定義的別名;自動(dòng)別名;固定名稱的別名。
?控制線程執(zhí)行,第一種方法是通過增加線程的掛起計(jì)數(shù)來(lái)禁止線程被恢復(fù)運(yùn)行。
?輸入如下命令可以增加1號(hào)線程的掛起計(jì)數(shù),
~1 n
?控制線程執(zhí)行的第二種方法是使用~f和~u命令,前者凍結(jié)一個(gè)線程,后者解凍。
?Windows操作系統(tǒng)的進(jìn)程加載器加入了特別的調(diào)試支持:在完成最基本的用戶態(tài)初始后,系統(tǒng)的進(jìn)程初始化函數(shù)就會(huì)主動(dòng)執(zhí)行斷點(diǎn)指令,觸發(fā)斷點(diǎn),讓調(diào)試目標(biāo)中斷到調(diào)試器中。這個(gè)斷點(diǎn)稱為初始斷點(diǎn)。
?NTDLL的LdrpInitializeProcess函數(shù)調(diào)用了DbgBreakPoint,后者包含了斷點(diǎn)指令。
?初始線程真正在新進(jìn)程環(huán)境下執(zhí)行是從內(nèi)核態(tài)的KiThreadStartup開始的。
?KiThreadStartup 將線程的IRQL(中斷級(jí)別)降到APC級(jí)別后調(diào)用PspUserThreadStartup來(lái)為線程在用戶態(tài)執(zhí)行做準(zhǔn)備。
?用戶可以自由定義調(diào)試事件的處理方式,編寫調(diào)試擴(kuò)展模塊來(lái)定制和補(bǔ)充WinDBG的調(diào)試功能。
?目前版本的WinDBG提供了20多條標(biāo)準(zhǔn)命令,140 多條元命令,大量的擴(kuò)展命令。
?WinDBG使用工作空間來(lái)描述和存儲(chǔ)一個(gè)調(diào)試項(xiàng)目的屬性、參數(shù)、以及調(diào)試器設(shè)置等信息。
?WinDBG支持兩種方法在命令中加入注釋文字,一種是使用*命令,一種使用$$。
?WinDBG支持定義和使用三類別名:用戶命名別名,固定名稱別名,WinDBG自動(dòng)定義的別名。
?在很多命令前可以加上進(jìn)程和線程限定符,用來(lái)指定這些命令所適用的進(jìn)程和線程。
?以下命令顯示0號(hào)線程的寄存器和棧回溯,
~0r;~0k;
?可以把輸入的命令和命令的執(zhí)行結(jié)果記錄到一個(gè)文本文件中,稱為L(zhǎng)og File。
?附加到已經(jīng)運(yùn)行的進(jìn)程的方法有:使用菜單或F6熱鍵;將WinDBG設(shè)置為JIT調(diào)試器;啟動(dòng)WinDBG時(shí)使用-p開關(guān);啟動(dòng)WinDBG時(shí)使用-pn開關(guān);使用.attach命令。
?當(dāng)調(diào)試系統(tǒng)服務(wù)或者被其它程序自動(dòng)啟動(dòng)的程序時(shí),通常需要使用上面介紹的方法來(lái)建立調(diào)試會(huì)話。
?非入侵式調(diào)試,WinDBG與目標(biāo)進(jìn)程沒有真正建立調(diào)試與被調(diào)試的關(guān)系。
WinDBG 雙機(jī)內(nèi)核調(diào)試
?兩臺(tái)系統(tǒng)之間的通信方式,目前WinDBG支持串行口、1394、USB2三種方式。
?內(nèi)核調(diào)試引擎內(nèi)建在Windows系統(tǒng)中,缺省是禁止的。
?如果目標(biāo)系統(tǒng)是Windows Vista,應(yīng)該使用BCDEdit工具來(lái)修改它的啟動(dòng)選項(xiàng)。
?對(duì)于串行口方式,主機(jī)和目標(biāo)系統(tǒng)所使用的COM端口號(hào)可以不同,但波特率應(yīng)該一樣。
?對(duì)于1394方式,主機(jī)和目標(biāo)機(jī)的channel號(hào)一定要一致。
?所謂局部上下文,Local Context,是指局部變量所基于的語(yǔ)境。
?在調(diào)試時(shí),調(diào)試器缺省顯示的是當(dāng)前函數(shù)所對(duì)應(yīng)的局部上下文。
?當(dāng)前函數(shù)和局部變量都是與棧幀密切相關(guān)的,所以WinDBG調(diào)試器通常使用棧幀號(hào)來(lái)代表局部上下文。
?使用不帶任何參數(shù)的.frame命令可觀察當(dāng)前的局部上下文。
?使用dv命令可以顯示當(dāng)前函數(shù)的參數(shù)和局部變量。
?;厮莸幕驹砗筒襟E
?根據(jù)程序的當(dāng)前執(zhí)行位置,得到程序指針寄存器的值,然后查找符號(hào)得到當(dāng)前所在的函數(shù)。
?尋找當(dāng)前函數(shù)的棧幀基準(zhǔn)地址;EBP是棧幀的基準(zhǔn)地址,ESP是棧的當(dāng)前棧頂?shù)刂贰?
?得到的EBP值便是?;厮輬?bào)告中的ChildEBP值,將其記錄在當(dāng)前行的第一列。
?尋找當(dāng)前函數(shù)的返回地址,這個(gè)信息通常被保存在EBP+4位置。
?典型的函數(shù)返回地址在0x400000到0x80000000間。
?尋找父函數(shù)的棧幀基地址;繼續(xù)尋找父函數(shù)的父函數(shù);直到ChildEBP值等于0,表示已經(jīng)到達(dá)當(dāng)前線程的最后一幀。
?命令e用來(lái)修改指定內(nèi)置地址或者區(qū)域的內(nèi)容。
?在任一用戶態(tài)調(diào)試會(huì)話中執(zhí)行dt ntdll!*List*可以看到很多鏈表類型。
?Windows中主要使用兩種鏈表,一種是雙向鏈表,每個(gè)節(jié)點(diǎn)是一個(gè)LIST_ENTRY結(jié)構(gòu)。
?另一種是單向鏈表,每個(gè)節(jié)點(diǎn)是SINGLE_LIST_ENTRY結(jié)構(gòu)。
?Windows系統(tǒng)內(nèi)所有進(jìn)程的EPROCESS結(jié)構(gòu)是通過ActiveProcessLinks字段相互鏈接的。
?全局變量PsInitialSystemProcess記錄了初始的系統(tǒng)進(jìn)程的EPROCESS結(jié)構(gòu)的地址。
?使用如下的dt命令來(lái)遍歷所有進(jìn)程,
dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni poi(PsInitialSystemProcess)
?可使用WinDBG的.call元命令來(lái)從調(diào)試器中調(diào)用被調(diào)試程序中的函數(shù)。
?模仿C/C++語(yǔ)言中的流程控制關(guān)鍵字,WinDBG定義了一系列元命令和擴(kuò)展來(lái)實(shí)現(xiàn)流程控制,統(tǒng)稱為流程控制符號(hào)。
?WinDBG命令程序中可以使用如下幾種變量:自動(dòng)的偽寄存器;用戶賦值的偽寄存器;用戶定義的別名;自動(dòng)別名;固定名稱的別名。
?控制線程執(zhí)行,第一種方法是通過增加線程的掛起計(jì)數(shù)來(lái)禁止線程被恢復(fù)運(yùn)行。
?輸入如下命令可以增加1號(hào)線程的掛起計(jì)數(shù),
~1 n
?控制線程執(zhí)行的第二種方法是使用~f和~u命令,前者凍結(jié)一個(gè)線程,后者解凍。
?Windows操作系統(tǒng)的進(jìn)程加載器加入了特別的調(diào)試支持:在完成最基本的用戶態(tài)初始后,系統(tǒng)的進(jìn)程初始化函數(shù)就會(huì)主動(dòng)執(zhí)行斷點(diǎn)指令,觸發(fā)斷點(diǎn),讓調(diào)試目標(biāo)中斷到調(diào)試器中。這個(gè)斷點(diǎn)稱為初始斷點(diǎn)。
?NTDLL的LdrpInitializeProcess函數(shù)調(diào)用了DbgBreakPoint,后者包含了斷點(diǎn)指令。
?初始線程真正在新進(jìn)程環(huán)境下執(zhí)行是從內(nèi)核態(tài)的KiThreadStartup開始的。
?KiThreadStartup 將線程的IRQL(中斷級(jí)別)降到APC級(jí)別后調(diào)用PspUserThreadStartup來(lái)為線程在用戶態(tài)執(zhí)行做準(zhǔn)備。
總結(jié)
以上是生活随笔為你收集整理的WinDBG 要点学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反汇编要点学习
- 下一篇: ArcGIS Server 学习