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中执行这段代码:

  1. public Form1(){
  2. InitializeComponent();
  3. AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
  4. }
  5. private void UnhandledExceptionProc(object obj){
  6. try {
  7. throw new Exception("1st chance");
  8. } catch (Exception) {
  9. MessageBox.Show("after 1st");
  10. }
  11. int d = 0;
  12. int n = 1 / d;
  13. }

并活动dump文件


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

异常如此重要,所以操作系统提供了对应的调试功能,可以使用调试器来检视异常。异常发生后,操作系统在调用用户态程序的异常处理函数前,会检查当前用户态程序是否有调试器加载。如果有,那么操作系统会首先把异常信息发送给调试器,让调试器有观察异常的第一次机会,所以也叫做first chance exception,调试器处理完毕后,操作系统才让用户态程序来处理。
如果用户态程序处理了这个异常,就没调试器什么事了。否则,程序在unhandled exception崩溃前,操作系统会给调试器第二次观察异常的机会,所以也叫做second chance exception。

《Windows用户态程序高效排错》

分析以下代码:可以看出DummyObject 会占用很多内存,甚至导致内存溢出

  1. private void MemeryLeakProc(object obj)
  2. {
  3. while (true) {
  4. for (int i = 0; i < 100 * 1024; i++) {
  5. DummyObject o = new DummyObject();
  6. list.Add(o);
  7. }
  8. Thread.Sleep(1000);
  9. }
  10. }

windbg命令:!dumpheap –stat 统计堆栈内存

线程Hang住的常见原因

-线程池或工作线程集中在某个耗时的工作当中,或者被其他线程锁住

核心问题,找到被hang住的线程

!threads

~*e!clrstack

!synblk

  1. lock (syncRoot) {
  2. int tp;
  3. int io;
  4. //ThreadPool.GetMaxThreads(out tp, out io);
  5. for (int i = 0; i < 100; i++) {
  6. Thread hangThread = new Thread(HangProc);
  7. hangThread.Start();
  8. }
  9. MessageBox.Show("Press to release lock");
  10. }
  1. private void HangProc(object obj)
  2. {
  3. lock (syncRoot) {
  4. n = 0;
  5. }
  6. }

CPU高

-如果与业务量没有提升,有线程在长时间的处理

核心问题,找到占用CPU的线程

!runaway

~*e!clrstack

线程死锁出现的情况:

两个锁A,B,

一个线程已经拿到锁A,申请锁B,

另一个线程已经拿到锁B,申请锁A

核心问题:找到锁定的线程

!threads

!syncblk

~*e!clrstack

•两条指令可以解决大部分的问题
•!dumpheap –stat
•~*e!clrstack

windbg调试.net程序的更多相关文章

  1. WinDBG调试.NET程序示例

    WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...

  2. WinDbg调试托管程序环境问题总结

    基本环境搭建及安装 安装 有2个方式可以安装WinDbg. 新版 安装WinDbg Preview 在商店里搜WinDbg直接就可以安装,这里安装的版本是x64版本.x64版本的WinDbg其实是可以 ...

  3. WinDbg调试.NET程序入门

    俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...

  4. WinDbg 调试.net程序

    WinDbg支持以下三种类型的命令: ·        常规命令,用来调试进程 ·        点命令,用来控制调试器 ·        扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...

  5. Windows调试学习笔记:(二)WinDBG调试.NET程序示例

    好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...

  6. 一步一个坑 - WinDbg调试.NET程序

    引言 第一次用WinDbg来排查问题,花了很多时间踩坑,记录一下希望对后面的同学有些帮助. 客户现场软件出现偶发性的界面卡死现象一直找不出原因,就想着让客户用任务管理器生成了一个dump文件发给我,我 ...

  7. WinDbg调试.NET

    WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...

  8. 转:windbg调试堆

    转:http://www.cnblogs.com/dsky/archive/2013/05/15/3079363.html 简评: 代码中采用malloc/free进行堆申请,实际调用的仍然是Heap ...

  9. WinDBG 调试命令大全

    转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html  #调试命令窗口 ++++++++++++++++++++++++ ...

随机推荐

  1. iOS缓存框架-PINCache解读

    文/Amin706(简书作者)原文链接:http://www.jianshu.com/p/4df5aad0cbd4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在项目中总是需要缓存一 ...

  2. Socket 使用笔记与注意事项(一)

    SocketAsyncEventArgs 1.该参数可以重复使用. 2.SocketAsyncEventArgs 的事件执行触发之后可以使用. 3.SocketAsyncEventArgs 的事件还在 ...

  3. NODE编程(四)--构建Node Web程序2

    四.提供静态文件服务 1.创建一个静态文件服务器 __dirname ,取值是该文件所在咋目录路径.分散在不同目录中的文件可以有不同的值. /** * 最进本的ReadStream静态文件服务器 */ ...

  4. 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库

    Retrofit官网:http://square.github.io/retrofit/ Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit ...

  5. 典型的字符串处理代码(page50)

    Page50: public class TypicalString{//典型的字符串处理代码 public static boolean isPlalindrom(String s){//判断字符串 ...

  6. [转]WPF 获取程序启动路径

    本文转自:http://hi.baidu.com/lilipangtou/item/f1b7488e3c92c4d05e0ec1ab 在Windows Form程序中,获取自身的启动目录是非常容易的, ...

  7. IO输入输出 2

    编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt pa ...

  8. 十二、Android UI开发专题(转)

    http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=18736&page=1#pid89255Android UI开发专题(一) 之界面设计 近期很 ...

  9. 正确理解SQL Server的许可证(转)

    今天在论坛上看到有人讨论如果使用SQL Server作为SEPM的后台数据库,需要多少个CAL的问题:   If I do have to use SQL Server what type of li ...

  10. Part 94 Difference between Monitor and lock in C#