[Debugging Tool]Windbg调试托管代码

引言

Windbg一直都是Windows平台调试的利器,自己会这个时间也不长,写这个东西也是当总结和学习性的东西。不废话,开工

安装

下载地址: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

一般来说,我们的机器应该是32bit的机器,安装就好.

打开WinDbg就有熟悉的界面了

image

虽然不太好看,实用啊

加载扩展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

image

选择我们的程序进程MyClass.exe

image

好了,现在出来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

image 

!DumpDomain <domain address>

默认显示出.Net下加载的三个程序集 System Domain, Shared Domain, Application Default Domain

image

进去看我们的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

image

!DumpObj 或 !do

!DumpArray

来个示例,找到Browser下的string

!Name2EE MyClass.exe!Browser.Visit

image

!DumpMD 00183080

image

!DumpClass 003512e0

image

!DumpObject 01e325f8

image 

不记得了怎么办

!Help <命令名称>

例如: !Help DumpHeap

 

Have Fun :)

posted on 2008-12-17 20:46  xwang  阅读(1321)  评论(4编辑  收藏  举报

导航