zoukankan      html  css  js  c++  java
  • 使用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中执行这段代码:

    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. }  

    Windows任务管理里面获取dump文件,首先找到cpu高的进程,右键菜单里面找到创建转储文件:

    并活动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   显示托管堆的信息
    !runaway   显示线程cpu时间
    •~*e!clrstack   显示调用栈
     
    http://blog.csdn.net/kntao/article/details/7086616
  • 相关阅读:
    SqlServer中插入无时间的日期
    IEnumerable的扩展方法
    JQuery插件之Autocomplete
    Visual Studio2010 即时生成序列图
    SQLSERVER系统表应用之基于Table生成存储过程参数列表
    格式化代码之自动加Region
    SQLSERVER2008使用CTE转换string到Table
    SQLSERVER使用CLR Stored Procedure导出数据到Excel
    SQLSERVER中找出拙劣的约束,索引,外键
    SQLSERVER2008中CTE的Split与CLR的性能比较
  • 原文地址:https://www.cnblogs.com/qiyebao/p/4040463.html
Copyright © 2011-2022 走看看