初次使用Windbg检查C#程序内存
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#程序内存的更多相关文章
- windbg分析net程序内存泄漏问题
1 问题简介 有客户反馈,打了最新补丁后,服务器的内存暴涨,一直降不下来,程序非常卡.在客户的服务器上抓了一个dump文件,开始分析. 分析问题的思路: 1.找到是那些资源占用了大量内存? ...
- valgrind--CPP程序内存泄露检查工具
内存泄漏是c++程序常见的问题了,特别是服务类程序,当系统模块过多或者逻辑复杂后,很难通过代码看出内存泄漏. valgrind是一个开源的,检测c++程序内存泄漏有效工具,编译时加上-g选项可以定位到 ...
- C/C++应用程序内存泄漏检查统计方案
一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...
- C++程序内存泄漏检测方法
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...
- Unix下C程序内存泄露检测工具:valgrind的安装使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
- Net Memory Profiler 分析.Net程序内存泄露
Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...
- WinDBG调试.NET程序示例
WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...
- iOS应用程序内存查看工具
我要找的是一个可以检查应用程序中哪一个数组存贮的什么内容的工具. 网上搜到的工具名称是Allocations Instrument,后来一试发现不是我想要的.这还是一个后期调试阶段的内存检查工具. h ...
- 使用WinDBG调试查看C#内存转储文件
有时候我们想查看一个正在运行的程序内存中的数据,可以在任务管理器将内存状态保存为转储文件,并使用WinDBG验证,这里我们来试试: 0.安装WinDBG 1.首先写个代码用来测试 一个class pu ...
随机推荐
- java数字转IP 一行
System.out.println(InetAddress.getByName(String.valueOf(12345)).getHostAddress());
- matlab中特殊符号如希腊字符
使用legend 'Best' 图标标识放在图框内不与图冲突的最佳位置'BestOutside' 图标标识放在图框外使用最小空间的最佳位置 legend('sin','cos','location', ...
- 2018上C语言程序设计(初级)作业- 第2次作业
一.预习作业 在课前或者课后观看浙江大学程序设计入门-C语言课程中第2周.第3周的判断部分和第4周的判断部分. 二.PTA作业 完成第7周.第8周和第9周和第10周共8次pta作业,将PTA作业中部分 ...
- JavaScript语言里判断一个整数,属于哪个范围:大于0;小于0;等于0
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 关于grub修复引导系统
这周末遇到停电,机房的一台数据服务器启动不了,开机硬件自检以后,就停留在一个黑屏状态左上角有光标闪烁,却一直进入不了系统. 还好手里有centos6.5的系统盘,进入修复选项,具体进入修复请参照这里 ...
- JS拖拽div(移动)
<!doctype html><html><head> <meta charset="utf-8"> <title>JS ...
- 利用树莓派来安装opencv从而来调动摄像头工作(没有坑,超超自己试过)
超超最近参加了学校里一位特别厉害的老师讲的课(两天,我就从一个小白然后了解了树莓派以及Arduino这些我之前都没有了解过的东西,由于结课的需要,我们需要自己设计一个创意以及完成作品)所以才有了这篇文 ...
- javaWeb-Servlet工作原理
1.客户发出请求—>Web 服务器转发到Web容器Tomcat: 2.Tomcat主线程对转发来用户的请求做出响应创建两个对象:HttpServletRequest和HttpServletRes ...
- 自学java_Struts2框架
一.Struts2基础 1.Struts2是有Apache在Struts1和Webwork的基础上研发出的新一代MVC框架. 2.Struts2开发环境的搭建: 打开https://struts.ap ...
- HTC Vive设备拥有陀螺仪。
//设置设备陀螺仪的开启/关闭状态,使用陀螺仪功能必须设置为 true Input.gyro.enabled = true; //获取设备重力加速度向量 Vector3 deviceGravity = ...