windbg入門之旅:(1)常見的windbg命令

來源:互聯網
上載者:User

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的值。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.