久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

windbg 命令詳解

 ZackEdge 2015-02-07

一、

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,、
  1. 0: kd> !idt                           //查看中斷向量表內(nèi)容  
  2. 0: kd> dt nt!_KINTERRUPT 89c03bb0     //查看對(duì)應(yīng)中斷向量的詳細(xì)內(nèi)容  
  3. 0: kd> !ioapic                        //顯示I/O APIC(即連接至設(shè)備的中斷控制部件)  
  4. 0: kd> !pic                           //   
  5. 0: kd> !apic                          //有關(guān)PIC的配置情況  


kd> !idt運(yùn)行后顯示為

  1. 0: kd> !idt  
  2.   
  3. Dumping IDT:  
  4.   
  5. 37: 806e7864 hal!PicSpuriousService37  
  6. 3d: 806e8e2c hal!HalpApcInterrupt  
  7. 41: 806e8c88 hal!HalpDispatchInterrupt  
  8. 50: 806e793c hal!HalpApicRebootService  
  9. 63: 89ac57e4 USBPORT!USBPORT_InterruptService (KINTERRUPT 89ac57a8)  
  10.              USBPORT!USBPORT_InterruptService (KINTERRUPT 8982abb0)  
  11. 73: 89d6767c atapi!IdePortInterrupt (KINTERRUPT 89d67640)  
  12.              atapi!IdePortInterrupt (KINTERRUPT 89dc4bb0)  
  13. 83: 89c1471c VIDEOPRT!pVideoPortInterrupt (KINTERRUPT 89c146e0)  
  14.              HDAudBus!AzController::Isr (KINTERRUPT 89c16ac8)  
  15.              NDIS!ndisMIsr (KINTERRUPT 89847bb0)  
  16. 94: 8976fbec USBPORT!USBPORT_InterruptService (KINTERRUPT 8976fbb0)  
  17. a4: 89770bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89770bb0)  
  18. b1: 89d859e4 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT 89d859a8)  
  19. b4: 89c03bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89c03bb0)  
  20. c1: 806e7ac0 hal!HalpBroadcastCallService  
  21. d1: 806e6e54 hal!HalpClockInterrupt  
  22. e1: 806e8048 hal!HalpIpiHandler  
  23. e3: 806e7dac hal!HalpLocalApicErrorService  
  24. fd: 806e85a8 hal!HalpProfileInterrupt  
  25. fe: 806e8748 hal!HalpPerfInterrupt  
  26. //前部分是使用的中斷類型號(hào),。例如83號(hào)中斷是有三個(gè)硬件復(fù)用。  


 

2.0: kd> dt nt!_KINTERRUPT 89c03bb0,,運(yùn)行后顯示為

  1. 0: kd> dt nt!_KINTERRUPT 89c03bb0  
  2.    +0x000 Type             : 0n22  
  3.    +0x002 Size             : 0n484  
  4.    +0x004 InterruptListEntry : _LIST_ENTRY [ 0x89c03bb4 - 0x89c03bb4 ]  
  5.    +0x00c ServiceRoutine   : 0xb9159e54     unsigned char  USBPORT!USBPORT_InterruptService+0  
  6.    +0x010 ServiceContext   : 0x89c38028 Void  
  7.    +0x014 SpinLock         : 0  
  8.    +0x018 TickCount        : 0xffffffff  
  9.    +0x01c ActualLock       : 0x89c03e14  -> 0  
  10.    +0x020 DispatchAddress  : 0x805466d0     void  nt!KiInterruptDispatch+0  
  11.    +0x024 Vector           : 0x1b4  
  12.    +0x028 Irql             : 0xa ''  
  13.    +0x029 SynchronizeIrql  : 0xa ''  
  14.    +0x02a FloatingSave     : 0 ''  
  15.    +0x02b Connected        : 0x1 ''  
  16.    +0x02c Number           : 0 ''  
  17.    +0x02d ShareVector      : 0x1 ''  
  18.    +0x030 Mode             : 0 ( LevelSensitive )  
  19.    +0x034 ServiceCount     : 0  
  20.    +0x038 DispatchCount    : 0xffffffff  
  21.    +0x03c DispatchCode     : [106] 0x56535554  


 

3.0: kd> !ioapic,運(yùn)行后顯示

  1. 0: kd> !ioapic  
  2. IoApic @ FEC00000  ID:8 (20)  Arb:170020  
  3. Inti00.: 52000000`000100ff  Vec:FF  FixedDel  Ph:52000000      edg high      m  
  4. Inti01.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
  5. Inti02.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  6. Inti03.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  7. Inti04.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  8. Inti05.: 52c00000`000100ff  Vec:FF  FixedDel  Ph:52C00000      edg high      m  
  9. Inti06.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
  10. Inti07.: 02000000`000100ff  Vec:FF  FixedDel  Ph:02000000      edg high      m  
  11. Inti08.: 01000000`000008d1  Vec:D1  FixedDel  Lg:01000000      edg high         
  12. Inti09.: 03000000`0000d9b1  Vec:B1  LowestDl  Lg:03000000-Pend lvl high rirr    
  13. Inti0A.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
  14. Inti0B.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  15. Inti0C.: 42000000`000100ff  Vec:FF  FixedDel  Ph:42000000      edg high      m  
  16. Inti0D.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  17. Inti0E.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  18. Inti0F.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  19. Inti10.: 03000000`0000f983  Vec:83  LowestDl  Lg:03000000-Pend lvl low  rirr    
  20. Inti11.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
  21. Inti12.: 03000000`0000a994  Vec:94  LowestDl  Lg:03000000      lvl low          
  22. Inti13.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
  23. Inti14.: 03000000`0000a973  Vec:73  LowestDl  Lg:03000000      lvl low          
  24. Inti15.: 03000000`0000a963  Vec:63  LowestDl  Lg:03000000      lvl low          
  25. Inti16.: 03000000`0000a9a4  Vec:A4  LowestDl  Lg:03000000      lvl low          
  26. Inti17.: 03000000`0000f9b4  Vec:B4  LowestDl  Lg:03000000-Pend lvl low  rirr    


 

4.0: kd> !pic ,運(yùn)行后顯示

  1. 0: kd> !pic  
  2. ----- IRQ Number ----- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  
  3. Physically in service:  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
  4. Physically masked:      Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  
  5. Physically requested:   Y  .  .  Y  .  Y  .  .  Y  Y  Y  Y  .  .  .  .  


 

5.0: kd> !apic,運(yùn)行后顯示

  1. 0: kd> !apic  
  2. Apic @ fffe0000  ID:0 (50014)  LogDesc:01000000  DestFmt:ffffffff  TPR FF  
  3. TimeCnt: 0fdad680clk  SpurVec:1f  FaultVec:e3  error:40  
  4. Ipi Cmd: 02000000`000008e1  Vec:E1  FixedDel  Lg:02000000      edg high         
  5. Timer..: 00000000`000300fd  Vec:FD  FixedDel    Dest=Self      edg high      m  
  6. Linti0.: 00000000`0001001f  Vec:1F  FixedDel    Dest=Self      edg high      m  
  7. Linti1.: 00000000`000084ff  Vec:FF  NMI         Dest=Self      lvl high         
  8. TMR: 63, 73, 83, 94, A4, B1, B4  
  9. IRR: 41, B1, D1  
  10. 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),。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多