1. 下载windbg并安装。

我下载的是 Windbg 6.12。注意,windbg分32位和64位,由分析环境的位数决定。我这里安装的是32位的。安装过程很简单,一路next就可以。

2. 准备被调试的程序。

新建一个C#控制台程序,使用如下代码。编译~

    class Program
{
static void Main(string[] args)
{
TestClass tref = new TestClass();
Console.ReadKey();
}
} public class TestClass
{
public int A = ;
public byte B = ;
public int C = ;
public byte D = ;
public byte E = ;
public byte F = ;
public int G = ;
}

3. 到bin/debug目录下,运行创建的程序

4. 打开Windbg。

初次使用,需要加载符号文件。选择菜单: File - Symbol File Path,输入:

srv*d:\SymbolsLocal*http://msdl.microsoft.com/download/symbols

5. 附件到进程

选择 File - Attach to a process,然后在弹出的窗口中选择我们正在运行的控制台程序

6. 加载 sos 工具

如下图。然后输入 .chain,用于确认sos.dll确实被加载。

7. 获得主线程上的引用

输入命令:  ~0s

8. 输出主线程上的线程栈信息

输入命令  !clsstack -l 。可以看到,main方法有一个局部变量,地址是 0x020c2350

9. 输出局部变量的信息

!dumpobj /d 0x020c2350 。如下图

打印出来的内容:

Name:类名

MethodTable:方法表地址

Size:占用内存空间多少字节

红色框里,是该对象所有字段的详细信息表格,包含每个字段的MT(方法表地址)、Offset(相对偏移量)、类型、VT(=1:值类型,=0:引用类型)、Attr(静态的还是实例的)、字段值、字段名称

注意,在offset中,可以看到每个字段在内存的分布,如下图。

这么分布是为了字段对齐。即,CLR为了节省空间,各个字段在内存中,并不是按代码定义的顺序进行分布的,而是把byte字段合到一起,让它们共同占用4个字节。int每个变量占4个字节。就形成了上图的分布。

10. 查看内存情况

选择菜单 View - Memory,在Virtual中输入刚才变量地址,可以验证上面所说的情况

初次使用Windbg检查C#程序内存的更多相关文章

  1. windbg分析net程序内存泄漏问题

    1       问题简介 有客户反馈,打了最新补丁后,服务器的内存暴涨,一直降不下来,程序非常卡.在客户的服务器上抓了一个dump文件,开始分析. 分析问题的思路: 1.找到是那些资源占用了大量内存? ...

  2. valgrind--CPP程序内存泄露检查工具

    内存泄漏是c++程序常见的问题了,特别是服务类程序,当系统模块过多或者逻辑复杂后,很难通过代码看出内存泄漏. valgrind是一个开源的,检测c++程序内存泄漏有效工具,编译时加上-g选项可以定位到 ...

  3. C/C++应用程序内存泄漏检查统计方案

    一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...

  4. C++程序内存泄漏检测方法

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...

  5. Unix下C程序内存泄露检测工具:valgrind的安装使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  6. Net Memory Profiler 分析.Net程序内存泄露

    Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...

  7. WinDBG调试.NET程序示例

    WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...

  8. iOS应用程序内存查看工具

    我要找的是一个可以检查应用程序中哪一个数组存贮的什么内容的工具. 网上搜到的工具名称是Allocations Instrument,后来一试发现不是我想要的.这还是一个后期调试阶段的内存检查工具. h ...

  9. 使用WinDBG调试查看C#内存转储文件

    有时候我们想查看一个正在运行的程序内存中的数据,可以在任务管理器将内存状态保存为转储文件,并使用WinDBG验证,这里我们来试试: 0.安装WinDBG 1.首先写个代码用来测试 一个class pu ...

随机推荐

  1. WPF-在Grid中编程添加控件

    摘要: 在Grid中编程添加控件,布局控件的位置用到的代码是: gridLayout.Children.Add(textblock); Grid.SetRow(textblock, ); Grid.S ...

  2. 元组tuple 可迭代对象

    1. 字符串.元组和列表相互转化 s = 'abcdef' li = ['a','b','c','d'] tu = (1,2,4,9) v = tuple(s) print('v = ',v) w = ...

  3. c++中的两种getline用法

    参考 https://blog.csdn.net/Big_laoshu/article/details/79345351

  4. ubuntu 16.04 编译安装 amule (开启GUI)

    安装依赖 $ -dev libgeoip-dev zlib1g-dev libupnp-dev libboost-all-dev libwxbase3.-dev libwxgtk3.-dev buil ...

  5. 聊聊pytorch中的DataLoader

    实际上pytorch在定义dataloader的时候是需要传入很多参数的,比如,number_workers, pin_memory, 以及shuffle, dataset等,其中sampler参数算 ...

  6. Spark的mlib中的稠密向量和稀疏向量

    spark mlib中2种局部向量:denseVector(稠密向量)和sparseVector(稀疏向量) denseVector向量的生成方法:Vector.dense() sparseVecto ...

  7. Visual C++ 6.0中if..else..的简单用法和基本格式

    # include <stdio.h> int main (void) { float score; printf("请输入您的考试成绩:"); scanf(" ...

  8. java的基础语法(标识符 修饰符 关键字)

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  9. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  10. 1px和backgroudImage

    https://blog.csdn.net/leadn/article/details/78560786 .setTopLine(@c: #C7C7C7) { & { position: re ...