基礎調試命令 - .dump/.dumpcap/.writemem/!runaway


Windbg是windows平台上強大的調試器,它相對於其他常見的IDE集成的調試器有幾個重要的優勢,

  1. Windbg可以做內核態調試
  2. Windbg可以脫離源代碼進行調試
  3. Windbg可以用來分析dump文件
  4. Windbg支持豐富的調試擴展

以下是一些windbg安裝和使用相關的文檔,

接下來我們會通過一系列的文章介紹windbg常用的調試命令的應用場景和基本用法,本文作為開始主要介紹命令.dump,.dumpcap,.writemem和!runaway的用法。

.dump命令

.dump命令可以幫助我們從一個運行的程序創建一個dump(擴展名.dmp)文件,然后將該文件拿到其他機器上進行分析。這在已經投入使用的生產環境中的程序調試非常有用,因為我們要在保證生產環境中的程序不受調試行為影響。

如果你運行.dump /?可以看到該命令提供了很多選項,一般情況下我們需要有關該被調試進程的所有信息,可以通過以下命令來創建dump文件。

0:000> .dump /ma c:\userdump.dmp

這個命令創建的dump包含了該進程的內存數據,句柄數據,未加載模塊數據,線程時間信息。最終可以將生成的dmp文件轉移到調試機上,該調試機上只要同樣安裝了windbg就可以進行相應的調試分析。

 

.dumpcab命令

多數情況下通過dump調試需要生產環境中運行模塊對應版本的調試數據庫文件(擴展名.pdb),如果涉及到微軟開發的模塊如.ntdll,user32.dll等,可以通過配置微軟的symbol服務器來加載相應的symbol文件,但是如果涉及到的模塊為其他開發方,並且該模塊對應的symbol文件存在於生產環境或者其他環境中,那么我們可以將dump在該環境中通過windbg打開,配置好這些私有的symbol路徑,然后運行.dumpcab命令將dump文件以及symbol文件一起打包,然后再拿到調試機上進行調試。

微軟的symbol服務器路徑配置

SRV*your local symbol folder*http://msdl.microsoft.com/download/symbols 

.dumpcab命令需要在打開dump文件時運行,

0:000> .dumpcab -a fulldump
Creating a cab file can take a VERY VERY long time
.Ctrl-C can only interrupt the command after a file has been added to the cab.
  Adding C:\dump.dmp - added
  Adding c:\fibo.pdb - added
Wrote fulldump

打開該cab文件可以看到里面包含了dump文件以及對應的private symbol

接下來我們就可以在調試機上調試問題了。

.writemem命令 

.writemem命令允許我們將內存或dump中的內容存成文件。這個命令經常用在我們希望通過其他工具來查看dump中加載的文件,比如我們想通過反匯編工具查看某些模塊代碼,或者希望打開內存中加載的文件查看其中的具體內容。

例如以下實例中,通過lm命令列出內存中加載的模塊列表,然后通過.writemem命令將其中的模塊存成文件。

0:000> lm
start    end        module name
010a0000 01124000   fibo     C (private pdb symbols)  
75270000 753a0000 kernel32 (deferred) 754a0000 75546000 KERNELBASE (deferred) 774a0000 775f7000 ntdll (export symbols) ntdll.dll 0:000> ? 01124000-010a0000 Evaluate expression: 540672 = 00084000 0:000> .writemem c:\fibo.exe 010a0000 L 00084000 Writing 84000 bytes........................................................................................................................................................................................................................................................................ 0:000> .writemem c:\fibo.exe 010a0000 (01124000-0x1) Writing 84000 bytes........................................................................................................................................................................................................................................................................

.writemem可以通過以上兩種方式存儲文件,第一種是指定起始地址和長度,第二種是指定其實和終止地址。

!runaway命令

!runaway是一個用來查看各個線程在用戶態和內核態占用cpu時鍾信息的命令,經常應用在查看高CPU使用率問題中,以下是runaway命令的輸出實例,我們可以看到線程2:12a0占用CPU最長時間,當我們遇到高CPU使用率問題的時候,可以通過隔段時間抓取多組dump的方式然后查看各個線程在不同dump中runaway輸出信息,從而找出占用cpu最多的線程。

0:026> !runaway
 User Mode Time
  Thread       Time
   2:12a0      0 days 0:04:26.668
  10:24fc      0 days 0:00:04.711
  15:25b8      0 days 0:00:03.010
   9:888       0 days 0:00:02.870
  14:25b4      0 days 0:00:01.185
   8:1c9c      0 days 0:00:00.639
  11:1350      0 days 0:00:00.624
  13:9d0       0 days 0:00:00.483
   7:2758      0 days 0:00:00.327
   1:27f4      0 days 0:00:00.296
   3:26b0      0 days 0:00:00.109
  21:740       0 days 0:00:00.062
  17:cd0       0 days 0:00:00.031
  24:158       0 days 0:00:00.015
   0:1de0      0 days 0:00:00.015
  26:25c8      0 days 0:00:00.000
  25:2f0       0 days 0:00:00.000
  23:b08       0 days 0:00:00.000
  22:2584      0 days 0:00:00.000
  20:26c0      0 days 0:00:00.000
  19:1a78      0 days 0:00:00.000
  18:1228      0 days 0:00:00.000
  16:1c34      0 days 0:00:00.000
  12:724       0 days 0:00:00.000
   6:17b0      0 days 0:00:00.000
   5:fb8       0 days 0:00:00.000
   4:277c      0 days 0:00:00.000

如果你希望看到內核態對應的cpu使用率,可以加上相應的flag如下,

0:028> !runaway ff
 User Mode Time
  Thread       Time
   2:12a0      0 days 0:04:46.230
  10:24fc      0 days 0:00:04.711
  15:25b8      0 days 0:00:03.088
   9:888       0 days 0:00:03.057
  14:25b4      0 days 0:00:01.248
   8:1c9c      0 days 0:00:00.639
  11:1350      0 days 0:00:00.624
  13:9d0       0 days 0:00:00.483
   7:2758      0 days 0:00:00.343
   1:27f4      0 days 0:00:00.296
   3:26b0      0 days 0:00:00.109
  21:740       0 days 0:00:00.078
  23:158       0 days 0:00:00.062
  17:cd0       0 days 0:00:00.031
  27:274c      0 days 0:00:00.015
   0:1de0      0 days 0:00:00.015
  28:2124      0 days 0:00:00.000
  26:f98       0 days 0:00:00.000
  25:15c       0 days 0:00:00.000
  24:2f0       0 days 0:00:00.000
  22:2584      0 days 0:00:00.000
  20:26c0      0 days 0:00:00.000
  19:1a78      0 days 0:00:00.000
  18:1228      0 days 0:00:00.000
  16:1c34      0 days 0:00:00.000
  12:724       0 days 0:00:00.000
   6:17b0      0 days 0:00:00.000
   5:fb8       0 days 0:00:00.000
   4:277c      0 days 0:00:00.000
 Kernel Mode Time
  Thread       Time
   2:12a0      0 days 0:01:04.615
  15:25b8      0 days 0:00:04.165
  14:25b4      0 days 0:00:01.716
  13:9d0       0 days 0:00:00.390
   8:1c9c      0 days 0:00:00.280
  11:1350      0 days 0:00:00.171
  10:24fc      0 days 0:00:00.156
   7:2758      0 days 0:00:00.156
   3:26b0      0 days 0:00:00.140
  23:158       0 days 0:00:00.046
   9:888       0 days 0:00:00.046
   1:27f4      0 days 0:00:00.046
  21:740       0 days 0:00:00.031
  19:1a78      0 days 0:00:00.031
  24:2f0       0 days 0:00:00.015
  17:cd0       0 days 0:00:00.015
   0:1de0      0 days 0:00:00.015
  28:2124      0 days 0:00:00.000
  27:274c      0 days 0:00:00.000
  26:f98       0 days 0:00:00.000
  25:15c       0 days 0:00:00.000
  22:2584      0 days 0:00:00.000
  20:26c0      0 days 0:00:00.000
  18:1228      0 days 0:00:00.000
  16:1c34      0 days 0:00:00.000
  12:724       0 days 0:00:00.000
   6:17b0      0 days 0:00:00.000
   5:fb8       0 days 0:00:00.000
   4:277c      0 days 0:00:00.000


 

希望以上內容對您有所幫助

Aaron Zhang


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM