windbg调试.net程序
1. 解决线上.NET应用程序的如下问题:
- 崩溃
- CPU高
- 程序异常
- 程序Hang死
2. 安装WinDbg:
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;
- }
并活动dump文件

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

《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调试.NET程序示例
WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...
- WinDbg调试托管程序环境问题总结
基本环境搭建及安装 安装 有2个方式可以安装WinDbg. 新版 安装WinDbg Preview 在商店里搜WinDbg直接就可以安装,这里安装的版本是x64版本.x64版本的WinDbg其实是可以 ...
- WinDbg调试.NET程序入门
俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...
- WinDbg 调试.net程序
WinDbg支持以下三种类型的命令: · 常规命令,用来调试进程 · 点命令,用来控制调试器 · 扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...
- Windows调试学习笔记:(二)WinDBG调试.NET程序示例
好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...
- 一步一个坑 - WinDbg调试.NET程序
引言 第一次用WinDbg来排查问题,花了很多时间踩坑,记录一下希望对后面的同学有些帮助. 客户现场软件出现偶发性的界面卡死现象一直找不出原因,就想着让客户用任务管理器生成了一个dump文件发给我,我 ...
- WinDbg调试.NET
WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...
- 转:windbg调试堆
转:http://www.cnblogs.com/dsky/archive/2013/05/15/3079363.html 简评: 代码中采用malloc/free进行堆申请,实际调用的仍然是Heap ...
- WinDBG 调试命令大全
转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html #调试命令窗口 ++++++++++++++++++++++++ ...
随机推荐
- SqlServer 之 查看表空间
一.用到系统视图 sys.sysindexes 该视图定义如下: CREATE VIEW sys.sysindexes AS SELECT id, status = convert(int, end ...
- C# 之 HttpWebRequest类
提供 WebRequest 类的 HTTP 特定的实现. 继承层次结构 System.Object → System.MarshalByRefObject → System.Net.We ...
- 通过pinyin4j将汉字转换为全拼 和 拼音首字母
/** * 汉字转换为拼音 包含多音字,包含生母zh,ch,sh的 */ public void toPinYinAll(){ String initials = "zh,ch,sh&quo ...
- edittext实现显示千分位格式
在edittext中你在输入1123456789过程中自动显示为1,123,456,789这种千分位格式的.那么我们该怎么做呢? 查阅Android edittext api发现它有这样一个方法add ...
- IOS plist轻量级操作
plist,全名PropertyList,即属性列表文件,它是一种用来存储串行化后的对象的文件.这种文件,在ios开发过程中经常被用到.这种属性列表文件的扩展名为.plist,因此通常被叫做plist ...
- 【Android 界面效果31】Android--侧滑菜单应用的实现
侧滑菜单应用现在非常多,而且实现方式也多种多样.通过在网上的多方查找,我找到郭霖少侠的这篇文章:http://blog.csdn.net/guolin_blog/article/details/874 ...
- 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
遇到此问题先需确认几个问题: 1)MS DTC是否设置正确? 2)是否启用了防火墙?是否对DTC做了例外? 3)是否做了hosts映射?是否跨网域通信? 开发分布式事务,碰到一个错误“与基础事务管理器 ...
- codeforces 677C C. Vanya and Label(组合数学+快速幂)
题目链接: C. Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input stan ...
- POJ 3422 Kaka's Matrix Travels K取方格数
题目:给出n*n的方格矩阵,现在从左上方走m次到右下方,问m次能够获得的最大价值和. 分析:最大费用流.拆点进行限制每个格子只取一次,假设点x拆成 x,xx,右边(假设有)y,yy,下方(假设有)z, ...
- 504 Gateway Time-out 和 502 Bad Gateway相关处理
若报:504 Gateway Time-out则与nginx有关 解决方案: #vim nginx.conf 添加以下代码: http{ fastcgi_connect_timeout 300; fa ...