使用Windbg调试.Net应用程序 [转]
Windbg+Procdump解决w3wp.exe CPU过百问题[转]
High CPU Dump收集工具 - ProcDump使用方法[转]
ProcDump v9.0[官方]
windbg查找c#高内存原因[转]
1. 解决线上.NET应用程序的如下问题:
- 崩溃
- CPU高
- 程序异常
- 程序Hang死
2. 安装WinDbg:
http://windowsrunbook.blogspot.com/2015/06/windbg-for-windows-20122012r2.html (Windows 2012)
http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx
3. 配置WinDbg:
运行WinDbg->菜单->File->Symbol File Path->按照下面的方法设置_NT_SYMBOL_PATH变量:
在弹出的框中输入“C:\MyCodesSymbols;
SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols”(按照这样设
置,WinDbg将先从本地文件夹C:\MyCodesSymbols中查找Symbol,如果找不到,则自动从MS的Symbol
Server上下载Symbols)。另一种做法是从这个Symbol下载地址中http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx,下载相应操作系统所需要的完整的Symbol安装包,并进行安装,
4. 利用WinDbg里的adplus来获取dump文件。
Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。
在WinDbg安装目录里可以找到adplus.exe,把他拖入到命令行中,然后用命令
adplus.exe -hang -pn test.exe -o c:\dumps // 抓取当前的dump文件
adplus.exe -crash -pn test.exe -o c:\dumps // 监听应用程序,当crash时,获取dump文件
命令-pn :应用程序名,-p:应用程序pid,-odump文件输出路径
5. 利用WinDbg加载dump文件加载调试器
运行WinDbg->菜单->File->Open Cresh dump 打开dump文件,并加载.net调试器

.loadby sos mscorwks .Net 3.5版本及以下
.loadby sos clr .Net 4.0
如果服务器的.Net版本与本机不匹配需要服务器版本的mscordacwks.dll文件
并设置.sympath = mscordacwks_x86_x86_2.0.50727.3607.dl
6. WinDbg的基本命令
help sos指令帮助
!threads 显示所有线程
!dumpheap 显示托管堆的信息
!clrstack 显示调用栈
!dumpobj 显示一个对象的内容
!dumparray 显示数组
!syncblk 显示同步块
!runaway 显示线程cpu时间
!gcroot 跟踪对象内存引用
!pe 打印异常
7. WinDbg的使用
当我在Form中执行这段代码:
- public Form1(){
- InitializeComponent();
- AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
- }
- private void UnhandledExceptionProc(object obj){
- try {
- throw new Exception("1st chance");
- } catch (Exception) {
- MessageBox.Show("after 1st");
- }
- int d = 0;
- int n = 1 / d;
- }
Windows任务管理里面获取dump文件,首先找到cpu高的进程,右键菜单里面找到创建转储文件:

并活动dump文件

用windbg打开dump文件后输入-pe:可以看到问题的所在。

作系统提供了对应的调试功能,可以使用调试器来检视异常。异常发生后,操作系统在调用用户态程序的异常处理函数前,会检查当前用户态程序是否有调试器加
载。如果有,那么操作系统会首先把异常信息发送给调试器,让调试器有观察异常的第一次机会,所以也叫做first chance
exception,调试器处理完毕后,操作系统才让用户态程序来处理。
《Windows用户态程序高效排错》
分析以下代码:可以看出DummyObject 会占用很多内存,甚至导致内存溢出
- private void MemeryLeakProc(object obj)
- {
- while (true) {
- for (int i = 0; i < 100 * 1024; i++) {
- DummyObject o = new DummyObject();
- list.Add(o);
- }
- Thread.Sleep(1000);
- }
- }
windbg命令:!dumpheap –stat 统计堆栈内存

线程Hang住的常见原因
核心问题,找到被hang住的线程
!threads
~*e!clrstack
!synblk
- lock (syncRoot) {
- int tp;
- int io;
- //ThreadPool.GetMaxThreads(out tp, out io);
- for (int i = 0; i < 100; i++) {
- Thread hangThread = new Thread(HangProc);
- hangThread.Start();
- }
- MessageBox.Show("Press to release lock");
- }
- private void HangProc(object obj)
- {
- lock (syncRoot) {
- n = 0;
- }
- }


CPU高
核心问题,找到占用CPU的线程
!runaway
~*e!clrstack
线程死锁出现的情况:
两个锁A,B,
一个线程已经拿到锁A,申请锁B,
另一个线程已经拿到锁B,申请锁A
核心问题:找到锁定的线程
!threads
!syncblk
~*e!clrstack
使用Windbg调试.Net应用程序 [转]的更多相关文章
- 【转】WinDbg调试器:启动程序时自动连接调试器方法
当我们调试服务进程或子进程时,无法直接用调试加载进程的方式启动,此时需要在启动程序时自动连接调试器方法: 第一步:注册表展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft ...
- 使用WinDbg调试入门(用户模式)
windbg是一个内核模式和用户模式调试器,包含在Windows调试工具中.在这里,提供个实践练习,帮助我们开始使用windbg作为用户模式调试器. 用WinDbg调试记事本 1.导航到安装目录,然后 ...
- WinDbg调试.NET程序入门
俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...
- WinDbg 调试.net程序
WinDbg支持以下三种类型的命令: · 常规命令,用来调试进程 · 点命令,用来控制调试器 · 扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...
- 使用Windbg和SoS扩展调试分析.NET程序
在博客堂的不是我舍不得 - High CPU in GC(都是+=惹的祸,为啥不用StringBuilder呢?). 不是我舍不得 - .NET里面的Out Of Memory 看到很多人在问如何分析 ...
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传 调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...
- WinDBG调试.NET程序示例
WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...
- WinDbg调试托管程序环境问题总结
基本环境搭建及安装 安装 有2个方式可以安装WinDbg. 新版 安装WinDbg Preview 在商店里搜WinDbg直接就可以安装,这里安装的版本是x64版本.x64版本的WinDbg其实是可以 ...
- 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令
调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...
随机推荐
- 运行时类型识别RTTI
1.RTTI的工作原理 例1. 用Class加载对象示例. package RTTI; public class Candy { static{ System.out.println("Lo ...
- nginx 域名绑定 域名, nginx 域名绑定 端口
一.nginx 域名绑定 域名 nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件 ...
- operator++()和operator++(int)的区别
很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用.这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式. 然而有一个 ...
- C++类模板的三种特化
说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多.我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型: 二是特化为引用,指针 ...
- 为Ubuntu 安装Transmission 2.90
Transmission 是 Ubuntu 的默认 BitTorrent 客户端,近期发布了最新的 Transmission 2.90 版本,目前已经可通过 PPA 为 Ubuntu 15.10.Ub ...
- Unity3D中的欧拉角的理解
先贴一个图: 游戏物体的属性视图中调整的角度就是欧拉角啦.. 如果细心,就会发现,单独去调整xyz的时候它并不是按照世界坐标系中的xyz轴来实施旋转的,它表示的是旋转的欧拉角. 什么是欧拉角呢?请看这 ...
- Real-time 3D Reconstruction using Kinect
http://jiakaizhang.com/project/real-time-3d-reconstruction/ Real-time 3D Reconstruction using Kinect ...
- 深入剖析Android音频之AudioTrack
播放声音能够用MediaPlayer和AudioTrack,两者都提供了java API供应用开发人员使用.尽管都能够播放声音.但两者还是有非常大的差别的.当中最大的差别是MediaPlayer能够播 ...
- 基于JDK动态代理实现的接口链式调用(Fluent Interface)工具
什么是链式接口(Fluent Interface) 根据wikipedia上的定义,Fluent interface是一种通过链式调用方法来完成方法的调用,其操作分为终结与中间操作两种.[1] 下面是 ...
- IDA Pro基本简介
IDA Pro基本简介 IDA加载完程序后,3个立即可见的窗口分别为IDA-View,Named,和消息输出窗口(output Window). IDA图形视图会有执行流,Yes箭头默认为绿色,No箭 ...