一、
1,、 !address eax
查看對(duì)應(yīng)內(nèi)存頁(yè)的屬性
2,、 vertarget
顯示當(dāng)前進(jìn)程的大致信息
3 !peb
顯示process Environment Block
4、 lmvm
可以查看任意一個(gè)dll的詳細(xì)信息 例如:我們查看cyusb.sys的信息
5.reload /!sym 加載符號(hào)文件
6,、 lmf
列出當(dāng)前進(jìn)程中加載的所有dll文件和對(duì)應(yīng)的路徑
7,、 r
命令顯示和修改寄存器上的值 r命令顯示和修改寄存器上的值
0:018> r eax=0 修改了寄存器,,把eax的值修改為0x0
8、 d
命令顯示esp寄存器指向的內(nèi)存 如下
用dd命令直接指定054efc14地址
注意:第二個(gè)d表示DWORD格式,,此外還有db(byte),du(Unicode),dc(char)等等,。 數(shù)據(jù)查看指令 d{a|b|c|d|D|f|p|q|u|w|W} d{b|c|d|D|f|p|q}分別是顯示: byte&ASCII, double-word&ASCII,double-word,double-precision,float,pointer-sized,quad-word數(shù)據(jù); DA用于顯示ASCII,,DU用于顯示UNICODE,; BYB,BYD,,顯示binary和Byte及binary和DWORD 補(bǔ)充一個(gè)DV,,用于查看本地變量用的
9、 e
命令可以用來(lái)修改內(nèi)存地址 跟d命令一樣,,e命令后面也可以跟類型后綴,,比如ed命 令表示用DWORD的方式修改。下面的命令把054efc14地址上的值修改為11112222,。 0:018>ed 054efc14 11112222 修改后可以用dd命令來(lái)查看內(nèi)存,。 0:018>dd 0543fc14 L4 L4參數(shù)指定內(nèi)存區(qū)間的長(zhǎng)度為4個(gè)DWORD,這樣輸出只有1行,, 而不是8行了,。
10、s
命令用來(lái)搜索內(nèi)存具體見help文檔 11!runaway 可以顯示每一個(gè)線程的cpu消耗 0:018> !runaway 結(jié)果如下: 0:83c 0 days 0:00:00.406 13:bd4 0 days 0:00:00.046 10:ac8 0 days 0:00:00.046 24:4f4 0 days 0:00:00.031 上面輸出的第一列是線程的編號(hào)和線程ID,,后一列對(duì)應(yīng)的是該線程在用戶態(tài)模式中的 總的繁忙時(shí)間,。 在該命令加上f參數(shù),還可以看到內(nèi)核態(tài)的繁忙時(shí)間,,當(dāng)進(jìn)程內(nèi)存占用率比較高的時(shí)候 ,,通過(guò)該命令可以方便的找到對(duì)應(yīng)的繁忙線程。
12,、 ~ 命令是用來(lái)切換目標(biāo)線程
0:018> ~ 可以顯示線程的信息 0:018> ~0s 把當(dāng)前的線程切換到0號(hào)線程,也就是主線程,,切換后提示符會(huì)變?yōu)?:000.
13 ,、~* 命令列出當(dāng)前進(jìn)程中的所有線程的詳細(xì)信息
14、~*kb 命令列出所有線程的堆棧
15,、 k 命令用來(lái)顯示當(dāng)前線程的堆棧,,如下
0:018> k 跟d命令一樣,k后面也可以跟很多后綴,,比如kb kp,,kn,kv,,kl等,,這些后綴控制了顯示的格式和信息,。 棧指令k[b|p|P|v] 這四條指令顯示的內(nèi)容類似,但是每個(gè)指令都有特色,;
KB顯示三個(gè)參數(shù),;
Kp顯示所有的參數(shù),但需要Full Symbols或Private PDBSymbols支持,。KP與Kp相似,,只是KP將參數(shù)換行顯示了;
Kv用于顯示FPO和調(diào)用約定,;
KD,,用于顯示Stack的Dump,在跟蹤棧時(shí)比較有用,。 這些指令區(qū)分大小,。
16 、u 命令把指定地址上的代碼翻譯成匯編輸出
0:018> u 7739d023 USER32!NtUserWaitMessage: 7739d023 b84a120000 mov eax,0x124a 7739d028 ba0003fe7f mov edx,0x7ffe0300 7739d02d ff12 call dword ptr [edx] 7739d02f c3 ret 如果符號(hào)文件加載正確,,可以用uf命令直接反匯編整個(gè)函數(shù),,比如uf USER32! NtUserWaitMessage
17 、x 查找符號(hào)的二進(jìn)制地址如下
0:018> x msvcr!printf 77bd27c2 msvcrt!printf = 上面的命令找到了printf函數(shù)的入口地址在77bd27c2
0:001> x ntdll!GlobalCounter 7c99f72c ntdll!GlobalCounter = 上面的命令表示ntdll!GlobalCounter這個(gè)變量保存的地址是7c99f72c,。
注意:符號(hào)對(duì)應(yīng)的是變量和變量所在的地址,,不是變量的值,上面只是找到GlobalCounter這個(gè)變量的值是7c99f72,,要找到變量的值,,需要用d命令讀取內(nèi)存地址來(lái)獲取。
X命令還支持通配符,,比如x ntdll !*命令列出ntdll模塊中的所有的符號(hào),,以及對(duì)應(yīng)的二進(jìn)制地址。
18,、 dds 打印內(nèi)存地址上的二進(jìn)制值
同時(shí)自動(dòng)搜索二進(jìn)制值對(duì)應(yīng)的符號(hào),。 比如要看看當(dāng)前**中保存了那些函數(shù)地址,就可以檢查ebp指向的內(nèi)存 0:018>dds ebp 0013ed98 0013ee24 0013ed9c 75ecb30f BROWSEUI!BrowserProtectedThreadProc+0x44 0013eda0 00163820 0013eda4 0013ee50 0013eda8 00163820 0013edac 00000000 0013edb0 0013ee10 0013edb4 75ece83a BROWSEUI!__delayLoadHelper2+0x23a 0013edb8 00000005 0013edbc 0013edcc 0013edc0 0013ee50 0013edc4 00163820 0013edc8 00000000 0013edcc 00000024 0013edd0 75f36d2c BROWSEUI!_DELAY_IMPORT_DESCRIPTOR_SHELL32 0013edd4 75f3a184 BROWSEUI!_imp__SHGetInstanceExplorer 0013edd8 75f36e80 BROWSEUI!_sz_SHELL32 0013eddc 00000001 0013ede0 75f3726a BROWSEUI!urlmon_NULL_THUNK_DATA_DLN+0x116 0013ede4 7c8d0000 SHELL32!_imp__RegCloseKey (SHELL32+0x0) 0013ede8 7c925b34 SHELL32!SHGetInstanceExplorer
這里dds命令從ebp指向的內(nèi)存地址0013ed98開始打印,,第一列是內(nèi)存地址的值,,第二列是地址上對(duì)應(yīng)的二進(jìn)制數(shù)據(jù),第三列是二進(jìn)制對(duì)應(yīng)的符號(hào),。上面的命令自動(dòng)找到了75ecb390f對(duì)應(yīng)的符號(hào)是BROWSEUI!BrowserProtectedThreadProc +0x44.
Com interface 和c++ vtable里面的成員函數(shù)都是順序排列的,。所以,dds命令可以方便的找到虛函數(shù)表中的具體的函數(shù)地址,,比如用下面的命令可以找到OpaqueDatinfo類型中虛函數(shù)的實(shí)際函數(shù)地址,。 首先通過(guò)x命令找到OpaqueDataInfo虛函數(shù)地址 0:000> x ole32!OpaqueDataInfo::vftable’ 7768265c ole32!OpaqueDataInfo::`vftable'' = 77682680 ole32!OpaqueDataInfo::`vftable'' = 接下來(lái)dds命令可以打印出虛函數(shù)表中的函數(shù)名字 0:000> dds 7768265c
19 .frame
命令在棧中切換以便檢查局部變量。 要查看局部變量的需要如下: 19,、1 查看線程的callstack
第一列的號(hào)稱為Frame num,,通過(guò).frame命令就可以切換到對(duì)應(yīng)的函數(shù)中檢查局部變量,,比如我們檢查CYUSB+0x916,這個(gè)函數(shù)的frame num是0,,于是,,我們?nèi)缦拢?br>19、2 iframe 切換到指定行號(hào)的函數(shù)中
19,、3 然后調(diào)用 x 顯示當(dāng)前frame的局部變量,比如這個(gè)函數(shù)中有兩個(gè)局部變量pcls和rawptr 0:018> x 0012fced pcls = 0x0039ba80 0012fcd8 rawptr = 0x0039ba80
20,、 dt 格式化顯示資料
Dt 命令格式化顯示變量的資料和結(jié)構(gòu) 0:000> dt pcls Local var @ 0x12fce4 Type MyCls* 0x0039ba80 +0x000 str : 0x00416648 'abcd' +0x004 inobj : inner 上面的命令打印出pcls的類型是MyCls指針,指向的地址是0x0039ba80,,其中的兩個(gè)class成員的偏移分別在+0和+4,,對(duì)應(yīng)的值在第2列顯示。加上-b -r參數(shù)可以顯示inner class和數(shù)組的信息: 0:000> dt pcls -b -r Local var @ 0x12fce4 Type MyCls* 0x0039ba80 +0x000 str : 0x00416648 'abcd' +0x004 inobj : innner +0x000 arr : 'abcd' [00] 97 ''a'' [01] 98 ''b'' [02] 99 ''c'' [03] 100 ''d'' [04] 0 '''' [05] 0 '''' [06] 0 '''' [07] 0 '''' [08] 0 '''' [09] 0 '''' 對(duì)于任意的地址,,也可以手動(dòng)指定符號(hào)類型來(lái)格式化顯示,。比如把0x0039ba80地址上的數(shù)據(jù)用MyCls類型來(lái)顯示: 0:000> dt 0x0039ba80 MyCls +0x000 str : 0x00416648 'abcd' +0x004 inobj : innner
21、 bp 設(shè)定調(diào)試斷點(diǎn)
(1)比如可以這樣寫:0:018>bp notepad!WinMain 在notepade的winmain函數(shù)處下斷點(diǎn),。 斷點(diǎn)的位置可以用符號(hào)來(lái)表示,,如上,也可以直接用地址以及windbg的Pseudo_Register(虛擬寄存器),。
比如,,我們用$exentry表示進(jìn)程的入口,那么可以用bp @$exentry在進(jìn)程的入口設(shè)置斷點(diǎn),。
(2)如果notepade的winmain的入口地址為01006420,,那么斷點(diǎn)也可以這么寫: Bp 01006420 bp mysource.cpp:143` 'j (poi(MyVar)”0x20) ''''; ''g'' ' 意思就是:當(dāng)myvar的值等于0x20時(shí),g命令繼續(xù)執(zhí)行,; (3)下面一個(gè)設(shè)置條件斷點(diǎn) 0:001> bp exceptioninject!foo3 “k; .echo ‘breaks’ ; g” 在exceptioninject!foo3上設(shè)置斷點(diǎn)后,,每次斷下來(lái)后,先用k顯示callstack,,然后用.echo命令輸出簡(jiǎn)單的字符串‘breaks’,,最后g命令繼續(xù)執(zhí)行。 (4)下面看一個(gè)更復(fù)雜的設(shè)置條件斷點(diǎn)的例子: ba w4 execptioninject!i ”j(poi(exceptioninject!i)<0n40) ‘.printf//”exceptioninject!i value is :%d//”,poi(exceptioninject!i); g’ ; ‘.echo stop!’ ” 首先ba w4 exceptioninject!i 表示在修改exceptioninject!i這個(gè)全局變量的時(shí)候,,停下來(lái),; j(judge)命令的作用就是對(duì)后面的表達(dá)式作條件判斷如果為true,執(zhí)行第一個(gè)單引號(hào)里面的命令,,否則執(zhí)行第2個(gè)單引號(hào)里面的命令, 條件表達(dá)式是(poi(exceptioninject!i)<0n40),,在windbg中excepioninject!i符號(hào)表示符號(hào)所在的內(nèi)存地址,,而不是符號(hào)的數(shù)值,相當(dāng)于c語(yǔ)言的&操作符的作用,,poi命令就是取這個(gè)地址上的值,,相當(dāng)于c語(yǔ)言的*操作符,。
所以這個(gè)條件判斷的意思就是判斷exceptioninject!i的值,是否小于十進(jìn)制的40,。如果為真,,就執(zhí)行第一個(gè)單引號(hào),‘.printf//”exceptioninject!i value is :%d//”,poi(exceptioninject!i); g’,,如果為假,,就執(zhí)行第二個(gè)單引號(hào)‘.echo stop!’ 第一個(gè)單引號(hào)里有三個(gè)命令,.printf .echo 和g,。這里的printf和c語(yǔ)言的printf函數(shù)語(yǔ)法一樣,,不過(guò)由于這個(gè)printf命令本身是在ba命令的雙引號(hào)里面,所以需要用//來(lái)轉(zhuǎn)義print中的引號(hào),。第一個(gè)引號(hào)的作用是:打印出當(dāng)前exceptioninject!i的值,,.echo命令換行 g命令繼續(xù)執(zhí)行 第二個(gè)引號(hào)的作用就是顯示stop,由于后面沒(méi)有g(shù)命令,,所以windbg會(huì)停下,。
22、 bm 使用模式匹配設(shè)置斷點(diǎn)
這個(gè)功能需要符號(hào)表的支持,,bm可以通過(guò)模式一次設(shè)置多個(gè)斷點(diǎn),,比如 bm mydriver!FastIO* 可以將所有與FastIO*模式匹配的函數(shù)下設(shè)置斷點(diǎn),比如FastIoRead ,,F(xiàn)astIoWriter等函數(shù)都會(huì)被設(shè)置上斷點(diǎn),。需要注意的是,bm命令需要full or export symbols支持,。
23,、 ba 對(duì)內(nèi)存訪問(wèn)設(shè)置斷點(diǎn) break on access
就是對(duì)于內(nèi)存訪問(wèn)設(shè)置斷點(diǎn),對(duì)于在多核處理或者多核處理器調(diào)試的時(shí)候很有用,,對(duì)于調(diào)試多線程也很有用,,比如說(shuō),我們可以對(duì)一個(gè)全局變量設(shè)置斷點(diǎn),, ba mydriver!gMonitoreedDevices , 如果你認(rèn)為這個(gè)變量的值被莫名的修改了,,相信通過(guò)ba設(shè)置的斷點(diǎn),你可以很快找到是誰(shuí)修改的,。
也可以這樣 ba w4 0x4000000 'kb;g' 當(dāng)0x4000000地址有寫操作時(shí),,進(jìn)入斷點(diǎn) 。w表示類型為寫 4表示長(zhǎng)度為4個(gè)字節(jié)
24 ,、bl 列出所有的斷點(diǎn) break list
25,、 bc 清除斷點(diǎn) break clear
bc [斷點(diǎn)號(hào)]
26、 be 開啟斷點(diǎn) break enable
27、 bd禁用斷點(diǎn) break disable
以上提到的斷點(diǎn)指令通過(guò)和j指令很容易形成條件斷點(diǎn),,比如 bp USER32!GetMessageW 'r $t1=poi(esp+4);r $t2=poi(@$t1+4); j(@$t2 = 0x102 ) ''du @$t1+8 L2;gc'';''gc''' 這個(gè)條件斷點(diǎn),,截取WM_CHAR消息,并將字符(包括中文)顯示出來(lái),。 條件斷點(diǎn)的最簡(jiǎn)形式:bp Address 'j (Condition) ''OptionalCommands''; ''gc'' ' Address是指令的地址,,Condition是一個(gè)條件表達(dá)式,如果@eax=1,,''OptionalCommands''是在斷點(diǎn)被擊中并且表達(dá)式成立時(shí)要執(zhí)行的指令,;gc指定是從一個(gè)條件斷點(diǎn)返回,是不可少的一部分,。
28,、跟蹤指令T,TA,TB,TC,WT,P,PA,PC
T 指令單步執(zhí)行,在源碼調(diào)試狀態(tài)下,,可指源碼的一行,,根據(jù)不同的選項(xiàng)也可以為一行ASM指令; TA 單步跟蹤到指定地址,,如果沒(méi)有參數(shù)將運(yùn)行到斷點(diǎn)處,;
TB 執(zhí)行到分支指令,分支指令包括calls, returns, jumps, counted loops, and while loops,; TC 執(zhí)行到Call指令,; WT Trace and Watch Data,一條強(qiáng)大指令,,對(duì)執(zhí)行流程做Profile,,執(zhí)行一下看看結(jié)果吧; P,,PA,,PC 相信不用多做解釋,大家也都明白了,;
29,、源代碼操作指令.,lsf,,lsc,,ls,l,,lsp
.指令打一個(gè)源文件,,可以打開一個(gè)全路徑的文件,也可以通過(guò)函數(shù)地址來(lái)打開并定位到源文件中函數(shù)的位置,,如. –a myapp!main,,. j://mydriver//mydriver.c lsf指定一個(gè)源文件為當(dāng)前源文件,,使用lsc可顯示當(dāng)前指定的源文件ls可顯示源文件的代碼。Lsf可以使用全路徑,,如果源路徑已經(jīng)設(shè)置,也可以直接指定源文件名稱,。如lsf mydriver.c,,lsf j://mydriver//mydriver.c lsc顯示當(dāng)前源文件 ls顯示當(dāng)前源文件的代碼,如ls 200顯示第200行 l 用于設(shè)置源文件選項(xiàng) lsp 設(shè)置源文件行在調(diào)試時(shí)顯示范圍比如,, 顯示當(dāng)前行的前50,,后50,lsp 100 但通常使用Windbg時(shí),,可以直接用Ctrl+O來(lái)打開并查看源文件
30 ,、查詢符號(hào)
kd> x nt!KeServiceDescriptorTable* 8046e100 nt!KeServiceDescriptorTableShadow = 8046e0c0 nt!KeServiceDescriptorTable = kd> ln 8046e100 (8046e100) nt!KeServiceDescriptorTableShadow | (8046e140) nt!MmSectionExtendResource Exact matches: nt!KeServiceDescriptorTableShadow =
31、!gle 查看LastError值
32,、指定進(jìn)制的形式0x/0n/0t/y 分別表示 16/10/8/2進(jìn)制
0x12345678+0n10 Evaluate expression: 305419906 = 12345682 33,、!sym noice/quiet symbol prompts開關(guān)
34、srcpath 設(shè)置源代碼的路徑
35,、dv查看本地變量
36,、!teb 顯示當(dāng)前線程的執(zhí)行塊(execution block)
37、!peb 顯示當(dāng)前進(jìn)程的執(zhí)行塊(execution block)
38,、ln[Address] 顯示當(dāng)前地址上的對(duì)象類型
39,、!locks 顯示死鎖
40、!handle可以獲取整個(gè)進(jìn)程或者某一個(gè)handle的詳細(xì)信息
首先運(yùn)行以下!handle,,可以看到當(dāng)前進(jìn)程的每個(gè)一個(gè)handle的類型,,以及統(tǒng)計(jì)信息 0:002>!handle Handle 4 Type key Handle c Type keyEvent ……. 然后找到一個(gè)key,查看詳細(xì)信息 0:001>!handle 4 f 就會(huì)列出這個(gè)handle的詳細(xì)信息,。 41!htrace命令檢查操作句柄的歷史記錄 !htrace命令可以打印出指定的handle的最近幾次調(diào)用堆棧 0:001>!htrace 384
42,、!cs列出CriticalSection的詳細(xì)信息
43、!threadpool能看到完成端口,,線城池工作線程和timer回調(diào)占線程池的情況
44,、time 可以看到進(jìn)程跑了多長(zhǎng)時(shí)間
45、 !dso 查看當(dāng)前線程中有哪些對(duì)象,,分析泄露時(shí)用到
46,、dump保存進(jìn)程的dump文件
Dump文件是進(jìn)程的內(nèi)存鏡像,
可當(dāng)在調(diào)試器中打開dump文件時(shí),,使用上面的命令檢查,,看到的結(jié)果跟用調(diào)試檢查進(jìn)程看到的一樣 .dump /ma c://testdump.dmp 這個(gè)命令把當(dāng)前進(jìn)程的鏡像保存為c://testdump.dmp,其中/ms參數(shù)表示dump的文件應(yīng)該包含進(jìn)程的完整信息,。 在windbg中,,通過(guò)file—open---open Crash dump菜單打開dump文件進(jìn)行分析,。打開文件后,運(yùn)行調(diào)試命令看到的信息和狀態(tài)就是dump文件保存時(shí)進(jìn)程的狀態(tài),。通過(guò)dump文件能夠方便的保存發(fā)生問(wèn)題時(shí)進(jìn)程的狀態(tài),,方便事后分析。
47,、
- 0: kd> !idt //查看中斷向量表內(nèi)容
- 0: kd> dt nt!_KINTERRUPT 89c03bb0 //查看對(duì)應(yīng)中斷向量的詳細(xì)內(nèi)容
- 0: kd> !ioapic //顯示I/O APIC(即連接至設(shè)備的中斷控制部件)
- 0: kd> !pic //
- 0: kd> !apic //有關(guān)PIC的配置情況
kd> !idt運(yùn)行后顯示為
- 0: kd> !idt
-
- Dumping IDT:
-
- 37: 806e7864 hal!PicSpuriousService37
- 3d: 806e8e2c hal!HalpApcInterrupt
- 41: 806e8c88 hal!HalpDispatchInterrupt
- 50: 806e793c hal!HalpApicRebootService
- 63: 89ac57e4 USBPORT!USBPORT_InterruptService (KINTERRUPT 89ac57a8)
- USBPORT!USBPORT_InterruptService (KINTERRUPT 8982abb0)
- 73: 89d6767c atapi!IdePortInterrupt (KINTERRUPT 89d67640)
- atapi!IdePortInterrupt (KINTERRUPT 89dc4bb0)
- 83: 89c1471c VIDEOPRT!pVideoPortInterrupt (KINTERRUPT 89c146e0)
- HDAudBus!AzController::Isr (KINTERRUPT 89c16ac8)
- NDIS!ndisMIsr (KINTERRUPT 89847bb0)
- 94: 8976fbec USBPORT!USBPORT_InterruptService (KINTERRUPT 8976fbb0)
- a4: 89770bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89770bb0)
- b1: 89d859e4 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT 89d859a8)
- b4: 89c03bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89c03bb0)
- c1: 806e7ac0 hal!HalpBroadcastCallService
- d1: 806e6e54 hal!HalpClockInterrupt
- e1: 806e8048 hal!HalpIpiHandler
- e3: 806e7dac hal!HalpLocalApicErrorService
- fd: 806e85a8 hal!HalpProfileInterrupt
- fe: 806e8748 hal!HalpPerfInterrupt
- //前部分是使用的中斷類型號(hào),。例如83號(hào)中斷是有三個(gè)硬件復(fù)用。
2.0: kd> dt nt!_KINTERRUPT 89c03bb0,,運(yùn)行后顯示為
- 0: kd> dt nt!_KINTERRUPT 89c03bb0
- +0x000 Type : 0n22
- +0x002 Size : 0n484
- +0x004 InterruptListEntry : _LIST_ENTRY [ 0x89c03bb4 - 0x89c03bb4 ]
- +0x00c ServiceRoutine : 0xb9159e54 unsigned char USBPORT!USBPORT_InterruptService+0
- +0x010 ServiceContext : 0x89c38028 Void
- +0x014 SpinLock : 0
- +0x018 TickCount : 0xffffffff
- +0x01c ActualLock : 0x89c03e14 -> 0
- +0x020 DispatchAddress : 0x805466d0 void nt!KiInterruptDispatch+0
- +0x024 Vector : 0x1b4
- +0x028 Irql : 0xa ''
- +0x029 SynchronizeIrql : 0xa ''
- +0x02a FloatingSave : 0 ''
- +0x02b Connected : 0x1 ''
- +0x02c Number : 0 ''
- +0x02d ShareVector : 0x1 ''
- +0x030 Mode : 0 ( LevelSensitive )
- +0x034 ServiceCount : 0
- +0x038 DispatchCount : 0xffffffff
- +0x03c DispatchCode : [106] 0x56535554
3.0: kd> !ioapic,運(yùn)行后顯示
- 0: kd> !ioapic
- IoApic @ FEC00000 ID:8 (20) Arb:170020
- Inti00.: 52000000`000100ff Vec:FF FixedDel Ph:52000000 edg high m
- Inti01.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti02.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti03.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti04.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti05.: 52c00000`000100ff Vec:FF FixedDel Ph:52C00000 edg high m
- Inti06.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti07.: 02000000`000100ff Vec:FF FixedDel Ph:02000000 edg high m
- Inti08.: 01000000`000008d1 Vec:D1 FixedDel Lg:01000000 edg high
- Inti09.: 03000000`0000d9b1 Vec:B1 LowestDl Lg:03000000-Pend lvl high rirr
- Inti0A.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti0B.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti0C.: 42000000`000100ff Vec:FF FixedDel Ph:42000000 edg high m
- Inti0D.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti0E.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti0F.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti10.: 03000000`0000f983 Vec:83 LowestDl Lg:03000000-Pend lvl low rirr
- Inti11.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti12.: 03000000`0000a994 Vec:94 LowestDl Lg:03000000 lvl low
- Inti13.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti14.: 03000000`0000a973 Vec:73 LowestDl Lg:03000000 lvl low
- Inti15.: 03000000`0000a963 Vec:63 LowestDl Lg:03000000 lvl low
- Inti16.: 03000000`0000a9a4 Vec:A4 LowestDl Lg:03000000 lvl low
- Inti17.: 03000000`0000f9b4 Vec:B4 LowestDl Lg:03000000-Pend lvl low rirr
4.0: kd> !pic ,運(yùn)行后顯示
- 0: kd> !pic
- ----- IRQ Number ----- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
- Physically in service: . . . . . . . . . . . . . . . .
- Physically masked: Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
- Physically requested: Y . . Y . Y . . Y Y Y Y . . . .
5.0: kd> !apic,運(yùn)行后顯示
- 0: kd> !apic
- Apic @ fffe0000 ID:0 (50014) LogDesc:01000000 DestFmt:ffffffff TPR FF
- TimeCnt: 0fdad680clk SpurVec:1f FaultVec:e3 error:40
- Ipi Cmd: 02000000`000008e1 Vec:E1 FixedDel Lg:02000000 edg high
- Timer..: 00000000`000300fd Vec:FD FixedDel Dest=Self edg high m
- Linti0.: 00000000`0001001f Vec:1F FixedDel Dest=Self edg high m
- Linti1.: 00000000`000084ff Vec:FF NMI Dest=Self lvl high
- TMR: 63, 73, 83, 94, A4, B1, B4
- IRR: 41, B1, D1
- ISR: D1
48,、.cls
.cls用于清屏
注意:得在windbg處于命令行模式時(shí)才可用(即按了Ctro+Break)
或者直接使用工具欄:
二、
Windbg斷點(diǎn)命令
1. 設(shè)置斷點(diǎn)命令bu bp bm ba
1) bu bp bm設(shè)置軟件斷點(diǎn)
a). bp設(shè)置地址關(guān)聯(lián)的斷點(diǎn)
b). bu設(shè)置符號(hào)關(guān)聯(lián)的斷點(diǎn)
c). bm支持設(shè)置含通配符的斷點(diǎn),,可以一次創(chuàng)建一個(gè)或多個(gè)bu或bp (bm /d)斷點(diǎn)
bp和bu的主要區(qū)別
a) bp所設(shè)斷點(diǎn)和地址關(guān)聯(lián),,如果模塊把該地址的指令移到其它地方,斷點(diǎn)不會(huì)隨之移動(dòng),,而是依然關(guān)聯(lián)在在原來(lái)的地址上; 而bu所設(shè)斷點(diǎn)是和符號(hào)關(guān)聯(lián),,如果符號(hào)的地址改變了,斷點(diǎn)依然保持和原來(lái)的符號(hào)關(guān)聯(lián),。
b) 如果bp所設(shè)斷點(diǎn)的地址在加載的模塊中被找到,,后來(lái)軟件模塊被卸載,斷點(diǎn)會(huì)被自動(dòng)移除,;而bu所設(shè)斷點(diǎn)則會(huì)一直存在,。
c) bp設(shè)置的斷點(diǎn)不會(huì)被保存windbg的workspace中,bu設(shè)置的斷點(diǎn)會(huì)則會(huì)被保存下來(lái),。
2)ba設(shè)置硬件斷點(diǎn)(數(shù)據(jù)斷點(diǎn))
硬件斷點(diǎn)是指當(dāng)一個(gè)內(nèi)存地址被訪問(wèn)(讀,、寫、執(zhí)行)或IO端口被訪問(wèn)時(shí)觸發(fā)的斷點(diǎn),。
2. 其它命令bl bc bd be .bpcmds
bl 列舉所有斷點(diǎn)和它們的狀態(tài)
bc 刪除對(duì)應(yīng)斷點(diǎn)
bd 禁用對(duì)應(yīng)斷點(diǎn)
be 啟用對(duì)應(yīng)斷點(diǎn)
.bmcmds 列舉所有斷點(diǎn)以及創(chuàng)建它們的命令
3. 軟件斷點(diǎn)和硬件斷點(diǎn)
1) 軟件斷點(diǎn) - 調(diào)試工具控制的斷點(diǎn),。當(dāng)調(diào)試器在某個(gè)地址設(shè)置一個(gè)斷點(diǎn),它會(huì)首先把該地址的內(nèi)容保存,,零時(shí)插入一條中斷指令(如int3 (0xCC)),,當(dāng)程序執(zhí)行到該地址是cpu進(jìn)入調(diào)試狀態(tài),當(dāng)調(diào)試結(jié)束,,程序重新載入該地址原先的指令重新執(zhí)行下去,。
2) 硬件斷點(diǎn) - 又稱為數(shù)據(jù)斷點(diǎn),是處理器控制的斷點(diǎn),,可以用來(lái)監(jiān)控某個(gè)內(nèi)存地址的訪問(wèn)(讀,、寫、執(zhí)行)和IO地址的訪問(wèn)(讀,、寫),。處理器中有相應(yīng)的調(diào)試寄存器,,用來(lái)記錄數(shù)據(jù)斷點(diǎn)的地址,當(dāng)該地址(內(nèi)存地址或IO端口地址)被訪問(wèn)時(shí),,斷點(diǎn)將被觸發(fā),,cpu進(jìn)入調(diào)試狀態(tài)。
3) 軟件斷點(diǎn)和硬件斷點(diǎn)的區(qū)別
a)理論上我們可以設(shè)置無(wú)窮多個(gè)軟件斷點(diǎn),,但設(shè)置軟件斷點(diǎn)會(huì)使程序變慢,,尤其在內(nèi)核態(tài)影響比較大,調(diào)試器大多會(huì)對(duì)斷點(diǎn)數(shù)量加以限制,。例如Windbg在內(nèi)核態(tài)最多支持32個(gè)軟件斷點(diǎn),在用戶態(tài)則支持任意多個(gè),;硬件斷點(diǎn)數(shù)量取決于處理器,,例如X86支持四個(gè)斷點(diǎn)(80386有八個(gè)調(diào)試寄存器-DR0~DR3用于斷點(diǎn),DR4~DR5保留,,DR6~DR7用于控制),。
b)軟件斷點(diǎn)需要修改相應(yīng)代碼,所以它不能調(diào)試時(shí)flash和rom中的代碼,;而硬件則沒(méi)有這個(gè)限制,。
3. 參考資料
1. http://www./linux/dosc1/59/linux-389058.htm
2. http://blog.csdn.net/wingeek/article/details/4025475
3. http:///viewthread.php?tid=69
4. http://msdn.microsoft.com/en-us/library/ff538903%28v=VS.85%29.aspx
5. http://msdn.microsoft.com/en-us/library/ff538165%28v=VS.85%29.aspx
6. http://msdn.microsoft.com/en-us/library/ff553451%28v=VS.85%29.aspx
1. 使用!process 0 0 獲取用戶空間的所有的進(jìn)程的信息
如果有多個(gè)相同進(jìn)程名,!process 0 0 SampleExe.exe
kd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS fe5039e0 SessionId: 0 Cid: 0008 Peb: 00000000 ParentCid: 0000 DirBase: 00030000 ObjectTable: fe529b68 TableSize: 50. Image: System
2.使用.process /i 指定進(jìn)程地址
因?yàn)橐獙?duì)用戶態(tài)代碼下斷點(diǎn),,這里不用/p,,而使用/i
If you want to use the kernel debugger to set breakpoints in user space, use the/i option to switch the target to the correct process context.
3. g繼續(xù),再次發(fā)生int 3中斷后,,進(jìn)程Context就已切換,,使用!process查看確認(rèn)。
4. reload符號(hào)文件,。
5. bu, bp下用戶態(tài)斷點(diǎn),。
|