惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
小众软件
小众软件
爱范儿
爱范儿
Y
Y Combinator Blog
博客园 - Franky
美团技术团队
博客园 - 【当耐特】
The Cloudflare Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
IT之家
IT之家
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
WordPress大学
WordPress大学
V
Visual Studio Blog
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队

博客园 - xwang

更好的执行 Better Communication – 你在听吗? 时间管理 or 能量管理 Stress Managment - 压力管理 Understanding WPF Template 调试Rotor: 启动过程 sscli google group launched Understanding Static Constructor, 理解静态构造函数 - xwang 自定义Rotor: 给Rotor添加一个CIL指令 PAL 阅读笔记 Metadata Tables, 元数据表 [Coding For Fun] 您有运行许可证吗? How To: TeamBuild 编译之前的版本 How To: Team Build 自定义版本号 混淆的概念与实践 The Anatomy Of Basic Data Structure, 基本数据结构解析 Understanding GetHashCode, 理解GetHashCode 基本数据结构解析之List 试探讨泛型实现过程
[Debugging Tool]Windbg调试托管代码
xwang · 2008-12-17 · via 博客园 - xwang

引言

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 :)