前言

         有时候我们需要看程序中运行情况怎么,如:某对象字段的具体值是多少等问题,我们就可以用调试工具找到答案。我们还是沿用前面的程序。原代码在文章低部。

dump栈上的值

在线程4中输入!ClrStack -a结果说该线程不是托管线程,于是我们用~0s 转到主线程,在输入该命令,他的调用栈相关信息就已经出来了,如下面所示:

在Main方法中有2个变量

此时我们用得!do得到它的值,结果显示说他不是一个类字段,那说明他是一个值类型,我们用dd命令发现在栈上果然有3个值分别是0x64,转成10进制那就是100。

 

dump堆上的对象

如果值类型包含在类中那么他会保存在堆上。要看堆中有那些对象,可以用!dumpheap 命令。然而堆上的对象非常多,我们一般可以在!dumpheap增加一个-type  来查找堆中的指定类型。如下图所示:

通过该命令我们就得到了,ObjTypes的对象的地址:00000000027eab68

当然!dumpheap 还有其它参考具体如下:

!dumpheap:dump堆中的所有对象
!dumpheap -type <类型,包括命名空间> :dump堆中的指定对象
!dumpheap -mt <方法表地址> :dump堆中的指定对象
!dumpheap -min <最小内存大小> :dump堆中大于指定内存的对象
!dumpheap -startAtLowerBound <开始地址> 显示该地址块中有那些对象。
!dumpheap -thinlock:查看堆上所有瘦锁对象
!dumpheap -stat 统计堆中各对象的个数,类型于sql中的group by

然后在调用!do命令,就会得到该实体的具体数据有那些,具体效果如下图所示:

我们可以看到改对象有3个字段,一个是Coordinate的值类型,注:VT=1说明是值类型。另外有二个数组类型分别是int和object数组类型。

 

dump值类型数据

查看值类型数据一般用!dumpvc <方法表地址> <值类型地址>; 导出值类型数据,结果如下:

我们发现ObjTypes中的Coordinate有定义了3个int类型分别是xCord、yCord、zCord 他们各自的值为100

 

dump数组中的数据

dump 数组中的数据,我们用 !da -details <数组地址>,结果如下:

同理,dump 字符串数组也是一样:

!da 也有一些相关参数可以设置,具体如下:

!da(!DumpArray)[-start <数组那个索引开始>] [-length<显示数组多少个元素>] [-details] [-nofields] 数据地址
  [-details] 显示数组的详细信息,包括具体值。
  [-nofields] 只显示内容不会显字符串类型中的各个域

示例代码

代码如下:

using System;
using System.Text; namespace Advanced.NET.Debugging.Chapter3
{
public class ObjTypes
{
public struct Coordinate
{
public int xCord;
public int yCord;
public int zCord; public Coordinate(int x, int y, int z)
{
xCord = x;
yCord = y;
zCord = z;
}
} private Coordinate coordinate; int[] intArray = new int[] { 1, 2, 3, 4, 5 };
string[] strArray = new string[] {"Welcome",
"to",
"Advanced",
".NET",
"Debugging"}; static void Main(string[] args)
{
Coordinate point= new Coordinate(100, 100, 100);
Console.WriteLine("Press any key to continue (AddCoordinate)");
Console.ReadKey();
ObjTypes ob = new ObjTypes();
ob.AddCoordinate(point); Console.WriteLine("Press any key to continue (Arrays)");
Console.ReadKey();
ob.PrintArrays(); Console.WriteLine("Press any key to continue (Generics)");
Console.ReadKey();
Comparer c = new Comparer();
Console.WriteLine("Greater {0}", c.GreaterThan(5, 10)); Console.WriteLine("Press any key to continue (Exception)");
Console.ReadKey();
ob.ThrowException(null);
} public void AddCoordinate(Coordinate coord)
{
coordinate.xCord += coord.xCord;
coordinate.yCord += coord.yCord;
coordinate.zCord += coord.zCord; Console.WriteLine("x:{0}, y:{1}, z:{2}",
coordinate.xCord,
coordinate.yCord,
coordinate.xCord);
} public void PrintArrays()
{
foreach (int i in intArray)
{
Console.WriteLine("Int: {0}", i);
}
foreach (string s in strArray)
{
Console.WriteLine("Str: {0}", s);
}
} public void ThrowException(ObjTypes obj)
{
if (obj == null)
{
throw new System.ArgumentException("Obj cannot be null");
}
}
} public class Comparer where T: IComparable
{
public T GreaterThan(T d, T d2)
{
int ret = d.CompareTo(d2);
if (ret > 0)
return d;
else
return d2;
} public T LessThan(T d, T d2)
{
int ret = d.CompareTo(d2);
if (ret < 0)
return d;
else
return d2;
}
}
}

.NET 调试入门(二) dump 出程序数据的更多相关文章

  1. 开发需求:每个表dump出部分数据

    mysqldump 每张数据表统一导出的N个记录数 需求: 在开发过程中,需要将生产的数据导出到本地开发环境,希望可以每个表都导出部分数据.由于生产数据表都是上千万或亿级别,直接从服务器导出数据会影响 ...

  2. 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置

    原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...

  3. Netty入门二:开发第一个Netty应用程序

    Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43  CSDN博客 原文  http://blog.csdn.net/suifeng3051/article/ ...

  4. VS中用C#开发应用程序的调试入门、技巧和实例(转载)

    入门篇 假设你是有着.Net平台的程序员,并且使用Visual Studio 做为开发工具. 断点:最简单的一种,设置一个断点,程序执行到那一句就自动中断进入调试状态.设置断点,在你觉得有问题的代码行 ...

  5. Entity Framework 程序设计入门二 对数据进行CRUD操作和查询

    前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...

  6. echart图表控件配置入门(二)常用图表数据动态绑定

    上一节 <echart图表控件配置入门(一)>介绍了echarts图表控件的入门配置,使开发人员可以快速搭建出一个静态的图表.但是在实际开发过程这还是不够的,不可能所有的图表控件都是静态数 ...

  7. DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

    原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...

  8. Delphi应用程序的调试(二)使用断点

    Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...

  9. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

随机推荐

  1. SpringBoot中使用Redis

    在SpringBoot中使用Redis,思路如下: 查询时先查Redis缓存,如果缓存中存在信息,就直接从缓存中获取. 如果缓存中没有相关信息,就去数据库中查找,查完顺便将信息存放进缓存里,以便下一次 ...

  2. 微信公众平台开发之基于百度 BAE3.0 的开发环境搭建(采用 Baidu Eclipse)

    3.通过 SVN 检入工程     在 bae 上的应用添加部署成功后,如图 7     点击“点击查看”按钮,会打开一个新页面,页面上会打印 “hello world” ,这是因为我们的应用包含有示 ...

  3. 常用修图工具的一些使用技巧及问题解决方法——ai

    一.ai如何修改画布大小 一. ai如何修改画布大小: 1. 左上角菜单中的文件——文档设置(也可以直接点菜单栏下边的控制栏中的文档设置) 2. 文档设置界面中,点击右上角“编辑画板“ 3. 此时面板 ...

  4. MVC加载部分视图Partial

    加载部分视图的方法:Partial() .RenderPartial() . Action() .RenderAction() . RenderPage() partial 与 RenderParti ...

  5. 清除所有Cookie

    代码 /// <summary> /// 清除所有Cookie /// </summary> public static void RemoveAll() { System.W ...

  6. Castle ActiveRecord学习(四)延迟加载、分页查询、where条件

    一.延迟加载 //用户发布的主题,一对多:Table:外键表:ColumnKey:外键:Lazy:延迟加载:Cascade:级联操作(级联删除) [HasMany(typeof(ThemeInfo), ...

  7. Js下载文件到本地(兼容多浏览器)

    在客户端通过js下载文件,试过几种下载方式,iframe方式仅限于IE浏览器,window.open(url),location.href=url 这两种方式在chrome浏览器还会是直接打开文件而不 ...

  8. Jmeter将HTTP request报文体中的字符串转换为大写

    <awd><client id='${__javaScript("${IndividualID}".toUpperCase())}'><member ...

  9. linux 硬盘分区攻略

    以下的sdX代表硬盘分区(如sda1,sda2,sdb1...等等),如果已有的硬盘分区需要改变大小的话,请参考另一篇文章. /boot:开机用的磁盘空间了,至少78MB,一般给100MB就好了. / ...

  10. Spring+SpringMVC+mybatis+Quartz整合

    Quartz与SpringMVC的整合 简介 Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调 ...