[Debugging Tool]Windbg调试托管代码
引言
Windbg一直都是Windows平台调试的利器,自己会这个时间也不长,写这个东西也是当总结和学习性的东西。不废话,开工
安装
下载地址: http://www.microsoft.com/whdc/devtools/debugging/default.mspx
一般来说,我们的机器应该是32bit的机器,安装就好.
打开WinDbg就有熟悉的界面了
虽然不太好看,实用啊
加载扩展SOS(Son of Strike)
SOS是.Net Framework中对于WinDbg的调试扩展
默认位于: C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll
好了,随便写个测试程序
1: using System;
2: using System.Collections.Generic;
3:
4: public class MyClass
5: {
6: public static void Main()
7: {
8: Browser b = new Browser();
9: b.Visit();
10:
11: Console.Read();
12: }
13: }
14:
15: public class Browser
16: {
17: private static string HomePage = "http://www.xwang.org";
18:
19: public Browser(){}
20:
21: public Browser(string homepage) : this()
22: {
23: HomePage = homepage;
24: }
25:
26: public void Visit()
27: {
28: Console.WriteLine(HomePage);
29: }
30: }
编译运行, 运行这个程序
而后打开WinDbg
选择我们的程序进程MyClass.exe
好了,现在出来WINDBG界面了, 现在要加载SOS.dll
.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll
我自己比较喜欢把这个sos.dll拷贝到Windbg目录下,这样,我每次只用: .load sos.dll 就好
为了调试.Net程序 还需要加载个mscorwks, 不然有时会报个错. pdb Symbols not found
.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
好了,现在开始我们的Debug 过程了
命令参考
http://msdn.microsoft.com/zh-cn/library/bb190764(vs.80).aspx
挑点常用的
!Name2EE
格式: Name2EE <module name> <type or method name>- 或 -Name2EE <module name>!<type or method name>
我们的程序为 MyClass 而入口点为MyClass.Main
那么命令则为: !Name2EE MyClass.exe!MyClass.Main
!DumpDomain <domain address>
默认显示出.Net下加载的三个程序集 System Domain, Shared Domain, Application Default Domain
进去看我们的Application Default Domain: Domain 1
!DumpDomain 003a4648
显示这个地址下的Domain信息
!DumpHeap [-stat] [-min <size>][-max <size>] [-thinlock] [-mt <MethodTable address>] [-type <partial type name>][start [end]]
!DumpHeap -type Browser
!DumpObj 或 !do
!DumpArray
来个示例,找到Browser下的string
!Name2EE MyClass.exe!Browser.Visit
!DumpMD 00183080
!DumpClass 003512e0
!DumpObject 01e325f8
不记得了怎么办
!Help <命令名称>
例如: !Help DumpHeap
Have Fun :)