Windbg是windows平台上強大的調試器,它相對於其他常見的IDE集成的調試器有幾個重要的優勢,
- Windbg可以做內核態調試
- Windbg可以脫離源代碼進行調試
- Windbg可以用來分析dump文件
- Windbg支持豐富的調試擴展
以下是一些windbg安裝和使用相關的文檔,
- Installing and Configuring WinDbg (Windows Debug Tools)
- Windbg Tutorials
- Debugging Using Windbg (msdn)
- Windbg (wikipedia)
接下來我們會通過一系列的文章介紹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