Windbg入门:如何使用Windbg调试得到ArrayList的值

本文涉及的产品
语种识别,语种识别 100万字符
图片翻译,图片翻译 100张
文档翻译,文档翻译 1千页
简介:
在.NET下开发时,最基本的调试方法就是使用Visual Studio的单步调试。但是对于一些特殊情况,特别是涉及到CLR内部的时候使用这种方式就达不到目的了。
如果要查看运行时内存使用情况,IL代码,CLR信息等可以使用以下两种方式:
1、使用VS2005 + sos.dll
2、使用Windbg + sos.dll
第二种方式功能更加强大,下面我就通过实际操作展示一下怎么使用这种方法得到运行时ArrayList内部的值。
有人可能会说:我直接用Visual Studio的单步调试岂不是更快?当然,这个只是一个演示,通过这个演示是为以后的高级调试打下基础

在操作之前,先熟悉一下基本知识:
A、使用VS2005 + sos.dll调试
1、需要在项目->属性->调试-〉 启用非托管代码调试
2、打开调试-〉窗口-〉即时
3、在即时窗口中输入  !load sos  加载调试模块
4、输入其它调试语句

B、使用Windbg + sos.dll
1、去微软的网站下载最新的Windbg
2、打开Windbg在File-〉Symbol File Path ...窗口中输入  srv*c:\symbols*http://msdl.microsoft.com/download/symbols 
3、运行需要调试的程序,然后在Windbg中File-〉Attach to Process中选择刚才运行的程序
4、在出现的Command窗口中就可以输入调试语句
5、常用调试语句:
 lm //查看加载了哪些模块
 .load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll  //加载调试模块
 ld TestClass //加载调试符号
 !name2ee TestClass.exe TestClass.Program.test  //显示test方法相关的地址
 !dumpmt -md 00976d48         //得到类的成员函数详细信息
 !dumpil 00973028    // 显示这个方法被编译器编译之后的IL代码
 !dumpheap -stat  //该命令显示程序中所有对象的统计信息,显示的大小是对象本身的大小,不包括对象里面值的大小
 !dumpheap -mt 790fcb30  //该命令显示MethodTable 790fcb30的详细信息
 !gcroot 012919b8  //来显示一个实例的所属关系
 !dumpobj(do) 012a3904 //显示一个对象的具体内容,看对象里面有什么,值是什么
 !ObjSize 012a1ba4 //对象实际在内存中的大小
 !eeheap -gc   //查看托管堆的情况(包括大小)
 !DumpArray   //查看数组信息

 下面就来看看具体的调试步骤:
1、我们的测试代码

namespace  TestClass
{
    
class Program
    
{
        [STAThread]
        
static void Main(string[] args)
        
{
            ArrayList list 
= new ArrayList();
            list.Add(
"aaaa");
            list.Add(
"bbbb");
            Console.ReadLine();
        }

    }

}
很简单,就是一个ArrayList

运行这个程序(开始执行,不调试),然后进入Windbg,Attach到这个进程

2、查看所有堆栈信息
0:004> !dumpheap -stat
      MT    Count    TotalSize Class Name
7910062c        1           12 System.Security.Permissions.SecurityPermission
7918e284        1           16 System.IO.TextReader+SyncTextReader
79102d10        1           20 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
79102cb4        1           20 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
79101d30        1           20 System.Text.InternalEncoderBestFitFallback
79100a7c        1           20 Microsoft.Win32.SafeHandles.SafeFileHandle
79105cd4        1           24 System.Collections.ArrayList
......
7912ad90       11         9036 System.Object[]
790fcb30     2083       131492 System.String
Total 2202 objects

除了我们的ArrayList外,还有很多其它的系统信息,先不用管它

3、查看我们的ArrayList的信息
0:004> !dumpheap -mt 79105cd4
 Address       MT     Size
012a1b88 79105cd4       24     
total 1 objects
Statistics:
      MT    Count    TotalSize Class Name
79105cd4        1           24 System.Collections.ArrayList
Total 1 objects


4、查看对应地址内部实际的值
0:004> !do 012a1b88
Name: System.Collections.ArrayList
MethodTable: 79105cd4
EEClass: 79105c28
Size: 24(0x18) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
7912ad90  40008df        4      System.Object[]  0 instance 012a1bb0 _items
791018e0  40008e0        c         System.Int32  1 instance        2 _size
791018e0  40008e1       10         System.Int32  1 instance        2 _version
790fc35c  40008e2        8        System.Object  0 instance 00000000 _syncRoot
7912ad90  40008e3      1c0      System.Object[]  0   shared   static emptyArray
    >> Domain:Value  00149c58:012a1ba0 <<
可以看到ArrayList的大小为2,具体的值保存在地址012a1bb0中,是一个System.Object[]类型的数组

5、查看数组信息
0:004> !DumpArray 012a1bb0
Name: System.Object[]
MethodTable: 7912ad90
EEClass: 7912b304
Size: 32(0x20) bytes
Array: Rank 1, Number of elements 4, Type CLASS
Element Methodtable: 790fc35c
[0] 012a1b50
[1] 012a1b6c
[2] null
[3] null

6、查看数组内对象的值
0:004> !do 012a1b50
Name: System.String
MethodTable: 790fcb30
EEClass: 790fca90
Size: 26(0x1a) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: aaaa
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
791018e0  4000096        4         System.Int32  1 instance        5 m_arrayLength
791018e0  4000097        8         System.Int32  1 instance        4 m_stringLength
790fe534  4000098        c          System.Char  1 instance       61 m_firstChar
790fcb30  4000099       10        System.String  0   shared   static Empty
    >> Domain:Value  00149c58:790d81bc <<
7912b1d8  400009a       14        System.Char[]  0   shared   static WhitespaceChars
    >> Domain:Value  00149c58:012a16f0 <<

这样我们就通过Windbg得到了ArrayList运行时的值了




    本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2007/12/29/1020229.html,如需转载请自行联系原作者

相关文章
|
消息中间件
RabbitMQ中的消息优先级是如何实现的?
RabbitMQ中的消息优先级是如何实现的?
815 0
浅析Qt Designer设置界面背景-运用PyCharm中把pyrcc5将.qrc转换为.py存在的一些问题
浅析Qt Designer设置界面背景-运用PyCharm中把pyrcc5将.qrc转换为.py存在的一些问题
浅析Qt Designer设置界面背景-运用PyCharm中把pyrcc5将.qrc转换为.py存在的一些问题
|
负载均衡 网络协议 应用服务中间件
高可用 - 04 Keepalived编译安装
高可用 - 04 Keepalived编译安装
627 0
高可用 - 04 Keepalived编译安装
|
缓存 安全 应用服务中间件
Nginx的反向代理功能有哪些应用场景呢
【8月更文挑战第22天】Nginx的反向代理功能有哪些应用场景呢
761 0
|
消息中间件 网络协议 安全
C# 一分钟浅谈:WebSocket 协议应用
【10月更文挑战第6天】在过去的一年中,我参与了一个基于 WebSocket 的实时通信系统项目,该项目不仅提升了工作效率,还改善了用户体验。本文将分享在 C# 中应用 WebSocket 协议的经验和心得,包括基础概念、C# 实现示例、常见问题及解决方案等内容,希望能为广大开发者提供参考。
881 0
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
169096 12
|
Web App开发 网络安全 Windows
Chrome版本太旧,无法访问此网站www.google.com 的响应时间过长
Chrome版本太旧,无法访问此网站www.google.com 的响应时间过长
881 1
|
JSON 关系型数据库 MySQL
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
541 1
|
安全 程序员 编译器
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(一)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
1084 1
|
Java Android开发 开发者
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
3420 0
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析