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. vue+koa实现简单的图书小程序(3)

    实现一个今年过了多少天的组件的记录我们使用了原生的微信小程序开发文档里的组件 “Progress” 并不需要自己去写: https://developers.weixin.qq.com/minipro ...

  2. SharePoint 2013 解惑 无法打开文件浏览器

    你有时候会看到这东西谈出来,当你想像管理文件一样,管理SharePoint上资源的时候 意思是说,不能打开文件浏览器,请加入你的站点到信任站点,这个有两个问题,一个是IE设置,一个是WebClient ...

  3. Gnome osc,资源,,,,,因为官网难下

    链接:https://share.weiyun.com/5XPLvJz 密码:pygpci

  4. Js/如何修改easyui修饰的input的val值

    1.关于js对input值的修改介绍:一般js改变input的val值,我一直使用的方法是: $('#id').val('test');这样的方式来进行修改.但是我使 用了class="ea ...

  5. 本地搭建json-server

    1.前言 为了前端项目获取数据,需要在本地搭建json-server,这样保证可以在本地实现增删改查的操作. 2.安装 全局安装: npm -g json-server 3.创建一个json-serv ...

  6. Sqlite 参数化 模糊查询 解决方案

    转自:https://codedefault.com/2018/does-dapper-support-the-like-operator-in-csharp-application 问题描述 如题, ...

  7. javaScript 深拷贝、浅拷贝

    在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...

  8. Python3.7和数据库MySQL 8.0.12 数据库数据驱动mysql-connector安装(四)

    安装mysql-connector驱动 在系统CMD输入命令: pip install mysql-connector 示例: 创建数据库 # 导入驱动 import mysql.connector ...

  9. 上传文件代码报错,java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory

    2018-09-11 11:11:08.235 ERROR 14352 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : ...

  10. 解决Maven web 项目 Cannot detect Web Project version. Please specify version of Web Project through ... 的错误

    创建maven项目的时候,maven文件头报错: Cannot detect Web Project version. Please specify version of Web Project th ...