1 .logopen logfile.log
該命令的作用是建立一個windbg的記錄檔,從該檔案建立開始直到.logclose調用,所有debug的過程都會log到logfile.log檔案中。這對於調試過程的回憶和追蹤是有用處的。
2 bp module!functionname(或者記憶體位址)
該命令的作用是建立在指定的地方插入一個斷點。當程式運行到斷點時,會產生中斷等待使用者處理(這個過程叫做中斷命中breakpoint hit)。程式中可以加入多個中斷。當我們在動態偵錯工具的時候,該命令較為常用,但是對於靜態dump檔案不需要。
3 bl
該命令的作用是列出所有斷電資訊。
0:000> bp mydebug!CallFast
0:000> bl
0 e 00401430 0001 (0001) 0:**** mydebug!CallFast
4 ln 某個地址(該地址可以是register的值,module!function等只要是能夠表示記憶體位址的均可)
該命令的作用是列出與該指定地址附近的函數(list nearest function)
ln 00401430
D:\study\mydebug\mydebug.cpp(48)
(00401430) mydebug!CallFast | (004014f0) mydebug!MyFunction
5 dd 記憶體位址 (選擇性參數Lx表示顯示的長度,預設長度為8)
該命令的作用以每4個位元組為一個單元快,顯示從指定記憶體位址開始的內容。預設情況下會顯示連續32塊記憶體位址,即32*4個位元組內的內容。當然,顯示太多沒有意義的記憶體內容只會干擾我們,因此我們也可使指定所要顯示的單元塊的個數,如
dd esp L4 表示顯示從esp指定地址開始的4個單元塊,即連續16個位元組的內容
dd esp
0012fe04 0012feb8 00000000 7ffdd000 cccccccc
0012fe14 cccccccc cccccccc cccccccc cccccccc
0012fe24 cccccccc cccccccc cccccccc cccccccc
0012fe34 cccccccc cccccccc cccccccc cccccccc
0012fe44 cccccccc cccccccc cccccccc 00000000
0012fe54 00000000 00000004 004310d8 0012feb8
0012fe64 00401402 00000006 0012ff18 00000000
0012fe74 7ffdd000 cccccccc cccccccc cccccccc
0:000> dd esp L4
0012fe04 0012feb8 00000000 7ffdd000 cccccccc
這個命令較為常用常用
6 db 記憶體位址 (Lx 預設長度為8)
該命令的作用和dd非常相似,不過db顯示的記憶體單元塊大小為一個Byte,並且和dd顯示的方向正好相反(高-低)。該命令相比dd,其好處是它會在右邊顯示出其相應的ASCII碼,這在查看某個記憶體中的字串時尤為有用。
db 00431124
00431124 52 65 73 75 6c 74 20 6f-66 20 74 68 65 20 64 69 Result of the di
00431134 76 69 73 69 6f 6e 20 6f-66 20 25 64 20 62 79 20 vision of %d by
00431144 25 64 20 69 73 20 3a 25-64 00 00 00 00 00 00 00 %d is :%d.......
00431154 00 00 00 00 69 33 38 36-5c 63 68 6b 65 73 70 2e ....i386\chkesp.
00431164 63 00 00 00 00 00 00 00-54 68 65 20 76 61 6c 75 c.......The valu
00431174 65 20 6f 66 20 45 53 50-20 77 61 73 20 6e 6f 74 e of ESP was not
00431184 20 70 72 6f 70 65 72 6c-79 20 73 61 76 65 64 20 properly saved
00431194 61 63 72 6f 73 73 20 61-20 66 75 6e 63 74 69 6f across a functio
該命令顯示了從記憶體00431124處開始連續16*8的內容,最右邊顯示的是其對應的ASCII碼的值。
7 da 記憶體位址
該命令是顯示指定記憶體位址的字串的值,而不會象dd,db那樣顯示連續8個單元塊的內容,而是遇到結束符即結束,因此在查看指定記憶體中的字串時尤為有用
0:000> da 00431124
00431124 "Result of the division of %d by "
00431144 "%d is :%d"
該命令只顯示了00431124開始的字串的值,然後自動終止。而用db的話效果如上所示。
8 k, kb, kv,kn
k命令的作用是顯示出所有call stack中的內容。kb外加顯示用來傳輸參數的前3個雙位元組(double word)的地址。
kv則在kb基礎上外加顯示其調用規則(calling convention)。
kn:在kb的基礎上最左邊另外顯示call stack frames的frame number,。從而可以通過.frame命令選擇相應的call stack frame進行調試,例如dv可以查看當前call stack frame的傳入參數值和函數體中臨時變數的值。
如下所示:
0:000> k
*** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr
0012fe60 00401402 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
0012feb8 00401393 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
0012ff18 0040130a mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
0012ff80 00401969 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
0012ffc0 77e6f23b mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
0012fff0 00000000 kernel32!BaseProcessStart+0x23
0:000> kb
*** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr Args to Child
0012fe60 00401402 00000006 0012ff18 00000000 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
0012feb8 00401393 004310d8 00000004 00000006 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
0012ff18 0040130a 0043101c 00000004 00000006 mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
0012ff80 00401969 00000001 00440e90 00440dc0 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
0012ffc0 77e6f23b 00000000 00000000 7ffdd000 mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
0012fff0 00000000 00401880 00000000 78746341 kernel32!BaseProcessStart+0x23
0:000> kv
*** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr Args to Child
0012fe60 00401402 00000006 0012ff18 00000000 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
0012feb8 00401393 004310d8 00000004 00000006 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
0012ff18 0040130a 0043101c 00000004 00000006 mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
0012ff80 00401969 00000001 00440e90 00440dc0 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
0012ffc0 77e6f23b 00000000 00000000 7ffdd000 mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
0012fff0 00000000 00401880 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])
kn
# ChildEBP RetAddr
00 0012fe60 00401402 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
01 0012feb8 00401393 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
02 0012ff18 0040130a mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
03 0012ff80 00401969 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
04 0012ffc0 77e6f23b mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
05 0012fff0 00000000 kernel32!BaseProcessStart+0x23
//左邊顯示的即為call stack frame number
運行.frame frameno ,如.frame 0 即可選擇相應的call stack frame,然後 dv即可查看stack中的參數值
9 .sympath + sympath
這個命令應該是第一個進行說明。當我們開始分析某個dump檔案時,須首先載入其symbol(一般尾碼為.pdb,.dbd),這時需要指定其symbol路徑,然後重新倒入。命令如下:
.sympath + c:\mydump\
.reload
如果只要顯示其symbol search 路徑, .sympath即可。
如何給windbg設定自動載入symbols檔案路徑?
我們可以通過添加一個environment variable: _NT_SYMBOL_PATH來設定symbols檔案的path. 這樣當windbg每次啟動之後,在需要載入symbols檔案的時候,會自動根據_NT_SYMBOL_PATH指定的path進行尋找。
例如: _NT_SYMBOL_PATH: SRVV*c:\localsymbols*\\symbolserver\publicsymbol
10 r
該命令的作用是顯示各register的值。