用Windbg来分析.Net程序的dump
介绍
1. 什么是Windbg
- WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
- WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。
- Dump文件是进程的内存镜像, 可以把程序的执行状态通过调试器保存到dump文件中
2. Windbg可以解决以下问题
◆ 内存高
◆ CPU高
◆ 程序异常
◆ 程序Hang死
3. 使用windbg进行调试分析的两种方式
- 使用windbg调试器attach到需要调试的进程。(会暂停进程的运行)
- 抓取进程的dump文件,使用windbg分析dump
一.准备
1.下载
官网地址:
https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit
选择对应的工具包下载

2.安装
- 下载之后点击安装,可选择安装的工具,我们只选择windbg就可以。安装之后在debuggers文件夹下选择32位或64位程序运行

- 打开windbg之后,需要设置symbol path,可以按快捷键Ctrl+S。把下面的路径粘贴进去保存。系统进行dump解析等操作的时候会自动下载需要的符号表
srvc:\symcachehttp://msdl.microsoft.com/download/symbols;c:\symcache;
3.抓取dump
1. 通过procdump获取
下载地址:https://technet.microsoft.com/en-us/sysinternals/dd996900
下载之后为压缩包,将文件解压。通过dos命令来生成dump文件。下面为一条语句为示例
procdump -ma -c 0 -s 3 -n 2 sqlservr.exe -o E:\dumps\
这条语句的意思为:当sqkservr.exe这个进程运行时间cpu的占用超过0%,时间超过3秒,则在E:\dumps下生成一个dump文件。一直到生成2个为止。下面为命令介绍
- -ma 生成full dump, 即包括进程的所有内存. 默认的dump格式包括线程和句柄信息.
- -c 在CPU使用率到达这个阀值的时候, 生成dump文件.
- -s CPU阀值必须持续多少秒才抓取dump文件.
- -n 在该工具退出之前要抓取多少个dump文件.
- -o dump文件保存目录.
- Sqlservr.exe可替换为进程的ID
下图为运行示例(sqlserver等操作需要cmd以管理员权限打开)
2. 任务管理器抓取
可在任务管理器进程右键进程,点击创建转储文件,系统会自动抓取和保存,保存完成会弹出对话框提示保存路径

二.解析
1.解析dump文件
通过windbg的菜单,File—>Open Crash Dump选择dump文件打开。打开成功界面如下图所示:

2.命令
1.基本命令
- ? 获取命令提示
- D 查看内存信息
- K 观察栈
- ~ 显示和控制线程 ~number s number为线程id 如:~1s为获取1号线程的上下文
- Q 退出
- !runaway 查看线程占用cpu时间,可看出哪个线程占用时间最高(所有线程)
- .dump /ma E:/dumps/myapp.dmp 抓取dump
2.元命令
- .help 获取命令提示
- .cls 清屏
- .ttime 查看线程占用cpu时间,可看出哪个线程占用时间最高(当前线程)
3..扩展命令
- . chain 获取命令集列表。在已经加载的动态链接库中。
- .load/.unload 加载/卸载命令模块
- **!模块名.help **查看某个扩展库中包含的扩展命令
4..Net程序相关命令
基本
- !peb或!dlls 列出进程已经加载的dll
- **!threadpool ** 查看当前CPU状况 线程数等等
- !dumpheap –stat 统计堆信息
- !Threads 所有托管线程 -special Crl创建的线程
- !clrstack 看看这个线程再干嘛 执行那些方法
- !clrstack –p addr addr:具体方法的参数值地址
- !do 地址 查看参数值
- !analyze –v 显示分析的详细信息
- .reload /i /f 强制重新加载pdb
内存调试
- **!eeheap –gc ** 获取gc中内存信息
- !eeheap –loader Loader 堆信息
- !dumpheap –stat 统计GC堆的信息,统计GC堆上存活的对象
- !dumpheap -mt < 查看该地址上的对象
- !gcroot <<对象地址>> 查看对象根
- **!dumpheap -type <<System.String >> ** 查看string类型在堆中的信息
- !helproot -查看gcroot的帮助
在解析.Net程序时首先要加载运行环境framework版本对应的SOS.DLL:
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.DLL
这里只是写一些比较常用的命令,想要详细了解更多命令了以到官网查看
3.高内存占用示例

【读取文件代码】

【在代码执行过程中抓取dump文件打开,并加载sos.dll】


【运行!dumpheap –stat获取最高内存占用的地址】

【!gcroot address获取调用函数】
最终,我们找到了高内存的调用入口!
当然如果gc堆上的占用内存较高的对象是自定义的类,那么就可以直接查看相关的调用函数来分析可能的问题了
用Windbg来分析.Net程序的dump的更多相关文章
- 使用GDB 追踪依赖poco的so程序,core dump文件分析.
前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...
- 使用Windbg调试.Net应用程序 [转]
Windbg+Procdump解决w3wp.exe CPU过百问题[转] High CPU Dump收集工具 - ProcDump使用方法[转] ProcDump v9.0[官方] windbg查找c ...
- WinDbg调试分析 net站点 CPU100%问题
WinDbg调试分析 asp.net站点 CPU100%问题 公司为了节省成本,最近有一批服务器降了配置,CPU从8核降到了2核.本身是小站点,访问量也不高,CPU总是会飙到100%而且可以一直持续几 ...
- 在Eclipse中使用MAT分析Android程序内存使用状况(转)
对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...
- 性能分析之-- JAVA Thread Dump 分析综述
性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...
- Net Memory Profiler 分析.Net程序内存泄露
Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...
- 使用CLR Profiler分析.NET程序
使用CLR Profiler分析.NET程序 就像剥去.NET语法糖衣的工具(Reflector等)很多一样,我们可以用来分析.NET程序性能的工具有很多,如前面一片博文DebugLZQ给大家介绍的v ...
- 老李案例分享:MAT分析应用程序服务出现内存溢出过程
老李案例分享:MAT分析应用程序服务出现内存溢出过程 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...
- windows用户态程序的Dump
熟悉Linux的开发人员都知道,在Linux下开发程序,如果程序崩溃了,可以通过配置Core Dump,来让程序崩溃的瞬间产生一个Dump文件,然后通过dump文件来调试程序为什么崩溃.但是windo ...
随机推荐
- 基于python的web应用开发-添加关注者
社交web允许用户之间相互联系. 例如: 关注者.好友.联系人.联络人或伙伴. 记录两个用户之间的定向联系,在数据库查询中也要使用这种联系. 一.论数据库关系 一对多关系 数据库使用关系建立记录之间的 ...
- XSS注入,js脚本注入后台
曾经一度流行sql注入,由于现在技术的更新,已经看不到这问题了,但是又出来新的安全问题,XSS攻击,他的原理就是在前端提交表单的时候,在input标签当中输入js脚本,通过js脚本注入后台,请看下图. ...
- Android Spinner值不显示,选择列表正常
你在给adapter设置数据时,如果你是静态数据,也就是死数据,那么spinner显示没有问题,但是你如果异步进行网络请求,或者使用Volley请求的时候就要注意,你的adapter设置要在onRes ...
- 60、jQuery其余操作
上篇主要介绍了jQuery,和一些基本用法,这篇主要讲解动画.常用事件.还有一些jQuery的补充内容. 本篇导航: 动画 常用事件 插件 jQuery API 中文文档 一.动画 1.基本 show ...
- Udacity并行计算课程笔记-The GPU Hardware and Parallel Communication Patterns
本小节笔记大纲: 1.Communication patterns gather,scatter,stencil,transpose 2.GPU hardware & Programming ...
- ArcGIS 网络分析[2] 在ArcMap中使用网络数据集进行五大网络分析[最短路径/服务区/最近设施点/OD成本矩阵/车辆分配]
上一章花了大篇幅介绍网络数据集的创建,也简单说了下点线的连通性问题. 那么可以试试刀锋不锋利啦! 网络分析呢,ArcGIS提供了5个基本分析类型: 最短路径求解 服务区(服务覆盖范围) 事故突发地的最 ...
- MQ NameServer模块划分
上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),其中: NameServer做Broker的服务发现,即客户端可以通过NameServer拿到Broker的信息 Broker汇报数据到N ...
- 微信JS-SDK使用步骤(以微信扫一扫为例)
概述: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ...
- 微信扫码支付功能详细教程————Java
前言 首先声明 我并非原创 原创是 http://blog.csdn.net/wangqiuyun/article/details/51241064 我只是在前辈的基础 加以解释说明 还有自己的一些 ...
- Asp.net IIS Express 无法启动 解决办法
http://www.mamicode.com/info-detail-1893424.html 一 .其他项目都可以,就这么一个不行 用记事本或者其他什么文本编辑器,打开项目的.csproj文件,定 ...