windbg調試命令8(bp、bu、bm、bl、bc、ba、be、bd)

來源:互聯網
上載者:User
windbg調試命令8(bp、bu、bm、bl、bc、ba、be、bd)

以下以skinhgy為例,windbg附加運行

1.

bp 命令是在某個地址下斷點, 可以 bp 0x7783FEB 也可以
bp MyApp!SomeFunction 。

對於後者,WinDBG 會自動找到MyApp!SomeFunction 對應的地址並設定斷點。 但是使用bp的問題在於:

1)當代碼修改之後,函數地址改變,該斷點仍然保持在相同位置,不一定繼續有效;

 2)WinDBG 不會把bp斷點儲存工作空間中

bp  Address或bp 偽寄存器或bp符號名稱:

0:000> x Simple1Demo!CSimple1DemoApp::InitInstance  
  1. 00640080 Simple1Demo!CSimple1DemoApp::InitInstance (void)  
  2. 0:000> bp 00640080   
  3. 0:000> bl  
  4.  0 e 00640080     0001 (0001)  0:**** Simple1Demo!CSimple1DemoApp::InitInstance  
  5. 0:000> x Kernel32!LoadLibraryW  
  6. 7c80aeeb kernel32!LoadLibraryW = <no type information>  
  7. 0:000> bp Kernel32!LoadLibraryW  
  8. 0:000> bl  
  9.  0 e 00640080     0001 (0001)  0:**** Simple1Demo!CSimple1DemoApp::InitInstance  
  10.  1 e 7c80aeeb     0001 (0001)  0:**** kernel32!LoadLibraryW  
  11. 0:000> bp $exentry  
  12. 0:000> bl  
  13.  0 e 00640080     0001 (0001)  0:**** Simple1Demo!CSimple1DemoApp::InitInstance  
  14.  1 e 7c80aeeb     0001 (0001)  0:**** kernel32!LoadLibraryW  
  15.  2 e 0061c895     0001 (0001)  0:**** Simple1Demo!ILT+14480(_wWinMainCRTStartup)  
上例說明三種用法作用是一樣的,都是bp Address(windbg內部會換成符號檔案對應的地址,或偽寄存器的地址)

bp /1 Address表示該斷點為一次性斷點,有點類似於F4作用於OD,一旦啟用就自動刪除了:

如bp /1 00640080

bp Address Passes表示指定斷點啟用之前要忽略的次數

預設情況下,斷點在第一次執行斷點位置的代碼時被啟用。這種預設情況和把Passes 設定為1是一樣的。要使得斷點在程式至少執行該代碼一次之後才啟用,可以將這個值設定為2或更大。例如,值為2時,使得斷點在第二次執行到該代碼時被啟用。該參數建立一個在每次執行斷點處的代碼時被減少1的計數器。要查看Passes 計數器的初始值和當前值,使用bl
(Breakpoint List)
Passes 僅當程式響應g (Go)命令並執行通過斷點時才減少。單步或跟蹤(tracing)通過它是不會減少的。當Passes
到達1時,可以通過清除並重設斷點來重設它。

我們來試試,用bc把以前斷點都刪除,再設定在第三次運行LoadLibraryW時啟用該處斷點

0:000> bc*  
  1. 0:000> bl  
  2. 0:000> bp 7c80aeeb 3  
  3. 0:000> bl  
  4.  0 e 7c80aeeb     0003 (0003)  0:**** kernel32!LoadLibraryW  

我們注意到這個斷點顯示的是0003 (0003) F5運行:

0:000> g  
  1. Breakpoint 0 hit  
  2. eax=00000002 ebx=7ffdc000 ecx=00000000 edx=00a8660c esi=0263f76e edi=0263f6f2  
  3. eip=7c80aeeb esp=0012fd68 ebp=0012fdb0 iopl=0         nv up ei pl nz na po nc  
  4. cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202  
  5. kernel32!LoadLibraryW:  
  6. 7c80aeeb 8bff            mov     edi,edi  
  7. 0:000> bl  
  8.  0 e 7c80aeeb     0001 (0003)  0:**** kernel32!LoadLibraryW  

我們注意到這個斷點現在顯示的是0001 (0003),表示前面忽略了兩次,

bu 命令是針對某個符號下斷點。 比如
bu MyApp!SomeFunction 。 在代碼被修改之後, 該斷點可以隨著函數地址改變而自動更新到最新位置。  而且bu 斷點會儲存在WinDbg工作空間中, 下次啟動 Windbg 的時候該斷點會自動化佈建上去。另外,在模組沒有被載入的時候,bp 斷點會失敗(因為函數地址不存在),而bu 斷點則可以成功。 新版的WinDBG中 bp失敗後會自動被轉成bu

bm 命令也是針對符號下斷點。 但是它支援匹配運算式。 很多時候你下好幾個斷點。 比如,把MyClass 所有的成員函數都下斷點:bu MyApp!MyClass::* , 或者把所有以CreateWindow開頭的函數都下斷點:bu user32!CreateWindow*

這個函數比較有用,比如我想對Draw開頭的函數都下斷點:

0:000> bc*  
  1. 0:000> bl  
  2. 0:000> bm *!draw*  
  3.   1: 00695930 @!"Simple1Demo!DrawState"  
  4.   2: 0175c790 @!"SkinLog!DrawState"  
  5.   3: 019f65d0 @!"SkinScroll!DrawState"  
  6.   4: 10119d10 @!"SkinHgy!DrawState"  
  7. 0:000> bl  
  8.  1 e 00695930     0001 (0001)  0:**** Simple1Demo!DrawState  
  9.  2 e 0175c790     0001 (0001)  0:**** SkinLog!DrawState  
  10.  3 e 019f65d0     0001 (0001)  0:**** SkinScroll!DrawState  
  11.  4 e 10119d10     0001 (0001)  0:**** SkinHgy!DrawState  
 

bl(breakpoint list)命令列出已存在的斷點的資訊

對於每個斷點,該命令顯示以下資訊:

  • 斷點ID。該ID是一個可以在其他命令中引用這個斷點的十進位數字。
  • 斷點狀態。它可以是e (啟用) 或d (禁用)。
  • 如果出現字母"u",說明斷點是未定的。即,該斷點中的符號引用還沒有和任何當前已載入的模組匹配。
  • 斷點位置的虛擬位址或符號運算式。如果啟用了源碼行號載入,bl 命令顯示檔案和行號資訊而不是地址位移。如果該斷點未定,則它的地址會被省略並出現在列表末尾。
  • (僅資料斷點) 資料斷點的類型和大小資訊會顯示出來。類型可以是e (執行)、 r (讀/寫)、w (寫)或 i (輸入/輸出)。類型後面是以位元組為單位的大小。關於這種類型斷點的更多資訊,查看ba (Break on Access)
  • 斷點被啟用前需要忽略的剩餘次數,後面是在圓括弧中的初始次數。(這種斷點的更多資訊,查看bp, bu, bm (Set Breakpoint)中對Passes參數的說明。)
  • 關聯的進程和線程。如果線程是用三個星號("***")表示的,說明這不是一個指定線程的斷點。
  • 符合斷點地址的模組和函數以及位移。如果是未定斷點,這裡會用括弧括起來的斷點地址替代。如果斷點設定在合法地址,但是沒有符號資訊,這個域為空白。
  • 該斷點觸發時要自動執行的命令。這個命令以引號括起來。

bc(breakpoint clear) 命令在系統中移除先前設定的斷點。

使用星號(*)來指定所有斷點

最後介紹下ba斷點

ba 命令就是針對資料下斷點的命令, 該斷點在指定記憶體被訪問時觸發。 命令格式為

ba Access Size [地址]

Access 是訪問的方式, 比如 e (執行), r (讀/寫), w (寫)

Size 是監控訪問的位置的大小,以位元組為單位。 值為 1、2或4,還可以是 8(64位機)。

比如要對記憶體0x0483DFE進行寫操作的時候下斷點,可以用命令 ba w4 0x0483DFE

AccessSize 之間不能加入空格

0:000> bc*  

  1. 0:000> ba r4 00a76748    
  2. 0:000> bl  
  3.  0 e 00a76748 r 4 0001 (0001)  0:**** Simple1Demo!`string'  

be 開啟斷點

bd 關閉斷點

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.