windbg简介

Windbg是在windows平台下,强大的用户态和内核态调试工具。相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比VS更为强大。它的另外一个用途是可以用来分析dump数据。哈哈,这是我们最需要的,可以用来分析并发测试场景或生产环境的性能及稳定性问题。它能够通过dump文件轻松的定位到问题根源,学会使用它,将有效提升我们的问题解决能力和效率。

windbg版本和符合表

  1. 不同版本的程序需要对应版本的抓取工具及windbg版本;
    windbg下载地址,x86位版本下载:【微软官方安装版】 x64位版本下载:【微软官方安装版
  2. 符号表是WinDbg关键的“数据库”,WinDbg必须依赖对应的符合表才能分析出问题原因。配置起来也很简单:File->Symbol File Path  将符号表地址粘贴在输入框中,点击确定即可。
    符号表地址:SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

配置好了以后,就可以使用windbg打开一个dump文件试试看。File->Open Crash Dump (Ctrl + D)

windbg常用命令

命令 说明
.loadby sos clr  加载调试扩展(.NET4.0以下使用mscorwks)
!threadpool or !tp 显示有关托管线程池的信息
~* e!clrstack 显示所有线程的堆栈
~* e!pe 显示发生在所有线程上的最后的异常
!runaway 显示线程耗费的CPU时间
!syncblk 查看程序阻塞
.logopen 记录调试日志
vertarget 查看系统运行时间
.cls 清屏
q 退出当前调试
!analyze -v 详细显示当前异常信息
~0s 切换到指定线程(中间的数字表示线程号)
!clrstack 查看线程的调用堆栈,仅提供托管代码的堆栈跟踪
!printexception 或 !pe 显示当前活动线程上的最后一个异常
!dumpstackobjects 或 !dso 显示在当前堆栈的边界内找到的所有托管对象
!dumpobj <address>或者 !do 显示对象信息,指定任何有效的对象地址,就能查看该对象的内容
!dumparray <address>或者!da 显示数组信息
!gcroot -nostacks <address>    显示对象内存引用;-nostacks 选项将搜索限制为垃圾回收器句柄和 Freachable对象
!dumpheap –stat 查看堆中的所有对象信息,包括类型信息,个数,大小等
!eeheap -gc | -loader 查看托管对象和程序结构在内存中占用情况
.foreach (myobj{!dumpheap -mt 008f4104-short}) {!do ${myobj}} 输出多个对象信息,该命令会对于堆中所有类型为008f4104的对象,依次调用!do命令

注意:

  1. 我们如果调试远程发过来的dump文件,一般需要提供该机器的三个dll文件:sos.dll / clr.dll / mscordacwks.dll,注意32还是64位版本问题;
  2. 注意.NET版本:3.5以下使用 .loadby sos mscorwks ;.NET4.0使用 .loadby sos clr
  3. sos是一个dll,定义了很多针对.net assembly的调试命令,sos.dll针对不同的runtime有不同的版本。如果使用.load命令,需要为sos.dll指定完整路径。

抓取dump文件

所谓的抓取dump,就是对进程的内存创建转储文件。抓取dump有很多方式和工具,我仅介绍自己常使用的,也是非常强大的命令行工具---ProcDump。它不但是绿色免费的、功能强大,而且没有32、64位版本问题,它会根据目标进程的版本自动创建。

下载地址:https://technet.microsoft.com/en-us/sysinternals/dd996900

需要注意两点:

  1. Procdump需要进程已经启动,并且中途不能停止。比如需要抓取IIS的Dump,由于IIS默认会配置在20分钟内没有任何请求的话就会自动结束,因此如果目标程序存在这样的配置,需要暂时将该配置取消。
  2. 在调试问题的时候经常用到的一个命令是!runaway,但是有些时候!runway在ProcDump抓取的dump中提取不出来。解决的方法是将Debug Tools for Windows (windbg)安装目录下的dbghelp.dll拷贝到procdump目录下,然后再运行命令抓取dump。

常用的命令示例(可以使用PID或进程名):

  1. 立刻抓取fulldump
    procdump -ma w3wp.exe
  2. 连续抓取3个dump,时间间隔为2分钟
    procdump -ma -s 120 -n 3 w3wp.exe
  3. 当CPU连续10秒钟超过40%时抓取dump,总计抓取3个dump
    procdump -ma -c 40 -s 10 -n 3 w3wp.exe
  4. 抓取first chance exception,初次发生指定异常时抓取dump
    procdump -ma -e 1 –f SqlException w3wp.exe

我这里都是抓取的fulldump,注意存放dump文件的可用磁盘空间。准备工作做好以后,抓一个dump用windbg看看先

接下来我会以线程阻塞、连接泄露等实例的方式进行展示,待续。。。

补充:抓取Crash dump时,还是需要使用windbg带的命令行---adplus

adplus -crash -pn w3wp.exe -fullonfirst -o d:\dumps
      此命令会通过监视进程w3wp.exe的运行,在当第一次出现异常时记录一次完整的dump

adplus -crash -pn w3wp.exe -o d:\dumps
      该命令也是在w3wp.exe崩溃时记录dump,但这是一个mini dump

【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)的更多相关文章

  1. Adreno Profiler分析任意安卓游戏特效+抓取资源

    听说可以抓去任意游戏特效..保存下,有空研究 AdrenoProfiler 下载地址 Adreno Profiler分析任意安卓游戏特效+抓取资源 教程

  2. 【性能诊断】六、并发场景的性能分析(windbg案例,大量的内部异常造成CPU飙升)

    在做产品的某个核心模块的性能优化时,发现压到100并发时应用服务器的CPU就飙升至90%以上,50并发以后TPS就基本定格在一个数值上.使用性能监视器收集应用服务器的数据,发现每秒的.NET CLR ...

  3. 【性能诊断】九、并发场景的性能分析(windbg案例,Fist Chance Exception/Crash dump)

          经常会碰到这样的场景,自测及单单点的测试时没有任何问题,但在并发环境或生产环境下有时出现没规律的异常.报错等情况.在代码中增加日志是其中一种解决方式:抓取指定异常时的dump,通过wind ...

  4. 【性能诊断】八、并发场景的性能分析(windbg案例,连接泄露)

    此前遇到一个项目反馈系统宕机问题,摘要描述如下: 系统不定期出现卡死现象,在多个模块不同功能上都出现过,未发现与特定功能相关的明显规律: 当系统出现卡死现象时,新的用户无法登陆系统: 跟踪应用服务器, ...

  5. 【性能诊断】七、并发场景的性能分析(windbg案例,线程阻塞)

    简单整理一个测试Demo,抓取dump并验证,步骤如下: Symbol File Path:SRV*C:\Symbols*http://msdl.microsoft.com/download/symb ...

  6. Golang适合高并发场景的原因分析

    http://blog.csdn.NET/ghj1976/article/details/27996095 典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据 ...

  7. 并发-ConcurrentHashMap源码分析

    ConcurrentHashMap 参考: http://www.cnblogs.com/chengxiao/p/6842045.html https://my.oschina.net/hosee/b ...

  8. Ubuntu下用wireshark抓取802.11封包并进行过滤分析

    要用wireshark抓802.11的包 需要在linux下进行. 要在linux下抓802.11的包 需要在linux下安装无线网卡驱动. 所以 在正式抓取之前先把这两样东西搞起来. *没有特殊说明 ...

  9. 【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)

    问题描述: 客户端js连续发起两个异步http请求,请求地址相同,但参数不同:POST http://*.*.*.*/*****/webservice/RESTFulWebService/RESTFu ...

随机推荐

  1. spring 源码

    spring AOP的Advice(通知) Advice(通知)定义在连接点做什么,为切面增强提供织入接口. BeforeAdvice AfterAdvice ThrowsAdvice的设计,体现了A ...

  2. 从UWP到SWIFT-开始

    hi,all 我呢,是一个win10 uwp的开发者,从wp7.wp8.wp8.1.win8.1 到现在的win10,一直在windows阵营,做过一些大家比较熟悉的东西现在也还是在做win10的uw ...

  3. Rails学习笔记一

    安装篇: 下载railsintalls 这里我下载的是rubyinstaller-1.9.3-p448 安装后,安装SQLite3数据库 下载sqlite3.def sqlite3.dll sqlit ...

  4. Qt for Android开发Android应用时的各种错误汇总(此片博文不成熟,请大家略过)

    “Qt for Android真的很脆弱,项目能跑起来靠的是奇迹,跑不起来,各种报错才是正常...” 问题一:Qt for Android编译不过:make (e=2): 系统找不到指定的文件. 之前 ...

  5. 第七周——Linux内核如何装载和启动一个可执行程序

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 part1 实验 ...

  6. git入门及上传项目到github

    Git入门:       如果你完全没有接触过Git,你现在只需要理解通过Git的语法(敲入一些命令)就可以将代码上传到远程的仓库或者下载到本地的仓库(服务器),我们此时应该有两个仓库,就是两个放代码 ...

  7. jquery操作input值总结

    获取选中的值获取一组radio被选中项的值var item = $('input[@name=items][@checked]').val(); 获取select被选中项的文本var item = $ ...

  8. MSP430 IO 使用

    MSP430内部上拉下拉使用注意——IO口测高低电平     MSP430单片机IO口用来检测高低电平时,是不需要外部上拉下拉的,因为其内部有上拉和下拉.在用作高低电平检测时,需要开启上拉或下拉.   ...

  9. 优化 UltraEdit 打开大文件时的性能

    UltraEdit 原本就是被设计成可以打开超大文件的工具,只不过在默认情况下需要进行以下优化设置: 禁止临时文件 禁止显示行号 禁止文件(回车 & 换行符)转换 禁止代码折叠 禁止显示函数列 ...

  10. 玩转github----1

    1.svn和github的区别 svn:集成式:我们在多人开发一个项目的时候我们需要准备一个中央服务器,然后每一个人都要通过这个中央服务器进行代码的一个获取和代码的一个提交,所以说这个所有的版本控制和 ...