[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   xwang  阅读(1322)  评论(4编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2008年12月 >
30 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10

统计

点击右上角即可分享
微信分享提示