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

使用Windbg调试.Net应用程序 [转]的更多相关文章

  1. 【转】WinDbg调试器:启动程序时自动连接调试器方法

    当我们调试服务进程或子进程时,无法直接用调试加载进程的方式启动,此时需要在启动程序时自动连接调试器方法: 第一步:注册表展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft ...

  2. 使用WinDbg调试入门(用户模式)

    windbg是一个内核模式和用户模式调试器,包含在Windows调试工具中.在这里,提供个实践练习,帮助我们开始使用windbg作为用户模式调试器. 用WinDbg调试记事本 1.导航到安装目录,然后 ...

  3. WinDbg调试.NET程序入门

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

  4. WinDbg 调试.net程序

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

  5. 使用Windbg和SoS扩展调试分析.NET程序

    在博客堂的不是我舍不得 - High CPU in GC(都是+=惹的祸,为啥不用StringBuilder呢?). 不是我舍不得 - .NET里面的Out Of Memory 看到很多人在问如何分析 ...

  6. 调试技巧 —— 如何利用windbg + dump + map分析程序异常

    调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传   调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...

  7. WinDBG调试.NET程序示例

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

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

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

  9. 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

    调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...

随机推荐

  1. 充满未来和科幻的界面设计FUI在国内还没有起步在国外早起相当成熟

    所谓FUI可以是幻想界面(Fantasy User Interfaces).科幻界面(Fictional User Interfaces).假界面(Fake User Interfaces).未来主义 ...

  2. [leetcode]Convert Sorted Array to Binary Search Tree @ Python

    原题地址:http://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 题意:将一个排序好的数组转换为一颗二叉 ...

  3. iOS开发-Get请求,Post请求,同步请求和异步请求

    标题中的Get和Post是请求的两种方式,同步和异步属于实现的方法,Get方式有同步和异步两种方法,Post同理也有两种.稍微有点Web知识的,对Get和Post应该不会陌生,常说的请求处理响应,基本 ...

  4. Android GUI之View事件处理(二)

    在上篇文章中,我们分析了View的事件处理过程,当然这里的View是指基本的View.当View接收到Touch事件时,首先会调用dispacheTouchEvent方法,在这个方法中会调用OnTou ...

  5. java oracle thin 和 oci 连接方式实现多数据库的故障切换

    java oracle thin 和 oci 连接方式实现多数据库的故障切换 一.thin方式 该种方式简便易用非经常见. 当中URL为 jdbc:oracle:thin:@(DESCRIPTION= ...

  6. Pinger

    import java.io.IOException;import java.io.InputStreamReader;import java.io.LineNumberReader;import j ...

  7. VM虚拟机启动报错Reason Failed to lock the file怎么办

    VMware启动报错Reason: Failed to lock the file的解决方法 症状:  启动VMware虚拟机的时候出现了Cannot open the disk '*.vmdk' o ...

  8. Android 视频缩放/放大

    1. 原理 不直接改变Codec输出的视频宽高比,而是改变视频播放器窗体的大小. 2. 设置Window 须要将Window设置未能够超出屏幕尺寸 mWindow.setFlags(WindowMan ...

  9. CSRF(跨站请求伪造攻击)漏洞详解

    Cross-Site Request Forgery(CSRF),中文一般译作跨站点 请求伪造.经常入选owasp漏洞列表Top10,在当前web漏洞排行中,与XSS和SQL注入并列前三.与前两者相比 ...

  10. UILabel字体加粗

    titleLabel.font = [UIFontboldSystemFontOfSize:16];