.NET 调试入门(二) dump 出程序数据
前言
有时候我们需要看程序中运行情况怎么,如:某对象字段的具体值是多少等问题,我们就可以用调试工具找到答案。我们还是沿用前面的程序。原代码在文章低部。
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 出程序数据的更多相关文章
- 开发需求:每个表dump出部分数据
mysqldump 每张数据表统一导出的N个记录数 需求: 在开发过程中,需要将生产的数据导出到本地开发环境,希望可以每个表都导出部分数据.由于生产数据表都是上千万或亿级别,直接从服务器导出数据会影响 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置
原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...
- Netty入门二:开发第一个Netty应用程序
Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43 CSDN博客 原文 http://blog.csdn.net/suifeng3051/article/ ...
- VS中用C#开发应用程序的调试入门、技巧和实例(转载)
入门篇 假设你是有着.Net平台的程序员,并且使用Visual Studio 做为开发工具. 断点:最简单的一种,设置一个断点,程序执行到那一句就自动中断进入调试状态.设置断点,在你觉得有问题的代码行 ...
- Entity Framework 程序设计入门二 对数据进行CRUD操作和查询
前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...
- echart图表控件配置入门(二)常用图表数据动态绑定
上一节 <echart图表控件配置入门(一)>介绍了echarts图表控件的入门配置,使开发人员可以快速搭建出一个静态的图表.但是在实际开发过程这还是不够的,不可能所有的图表控件都是静态数 ...
- DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表
原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...
- Delphi应用程序的调试(二)使用断点
Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...
- 【转】段错误调试神器 - Core Dump详解
from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...
随机推荐
- DES_3DES_AES_IDES_RSA密码算法比较
对称加密算法(也叫共享密钥) 类型 定义:发送接收使用相同的对称密钥 密钥 长度 分组长度 循环次数 安全性 DES 数据加密标准,速度较快,适用于加密大量数据的场合: 56 64 16 依赖密钥受穷 ...
- 超薄二维Mo2C晶体
记者今天从中国科学院金属研究所获悉,该所沈阳材料科学国家(联合)实验室先进炭材料研究部任文才研究组在大尺寸高质量二维过渡族金属碳化物晶体的制备与物性研究方面取得了重要突破.相关成果日前在<自然— ...
- Python sum() 函数
Python sum() 函数 Python 内置函数 描述 sum() 方法对系列进行求和计算. 语法 以下是 sum() 方法的语法: sum(iterable[, start]) 参数 ite ...
- DFT
离散傅里叶变换(Discrete Fourier Transform,缩写为DFT),是傅里叶变换在时域和频域上都呈离散的形式, 将信号的时域采样变换为其DTFT的频域采样.在形式上,变换两端(时域和 ...
- [leetcode]636. Exclusive Time of Functions函数独占时间
Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...
- Django模型之Meta详解
Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类 abstract 这个属性是定义当前的模型是不是一个抽象类.所谓抽象类是不会对应数据 ...
- spring mvc , spring data jpa 知识点
<mvc:view-controller path="/login" view-name="login.jsp"/> <!-- 会直接跳到/W ...
- spring 注解 注入属性 和 注解完成bean定义
1. 使用 @Autowired 和 @Resource 注解来注入属性 2. 使用 @Component.@Repository.@Service.@Controller 注解,就将该类定义为一个B ...
- 创建一个子进程---vfork
子.父进程共享数据段与堆栈段 函数原型:pid_t vfork(void) 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1. 注意: vfork创建的进程是按先子进程后父进程的顺序执行的 ...
- 移动文件读/写指针----lseek
头文件:#include<sys/types.h>.#include<unistd.h> 函数原型:off_t lseek(int fildes,off_t offset,in ...