• 【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)


    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

    image

    配置好了以后,就可以使用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 查看系统运行时间
    !peb 查看完整的进程启动的命令行参数,加载的DLL及环境变量等
    !dml_proc 查看进程Id及进程全路径名称
    lmvm clr 查看当前dump文件对应的framework版本
    .cls 清屏
    q 退出当前调试
    !analyze -v 详细显示当前异常信息
    ~0s 切换到指定线程(中间的数字表示线程号)
    !clrstack 查看线程的调用堆栈,仅提供托管代码的堆栈跟踪  参数 -p  显示托管方法的参数值
    !printexception 或 !pe 显示当前活动线程上的最后一个异常
    !dumpstackobjects 或 !dso 显示在当前堆栈的边界内找到的所有托管对象
    !dumpobj <address>或者 !do 显示对象信息,指定任何有效的对象地址,就能查看该对象的内容
    !dumparray <address>或者!da 显示数组信息
    !gcroot -nostacks <address>    显示对象内存引用;-nostacks 选项将搜索限制为垃圾回收器句柄和 Freachable对象
    !dumpheap –stat 查看堆中的所有对象信息,包括类型信息,个数,大小等
    !dumpheap -mt <MT Adress>   [-min ] 查看指定类型的对象及大小,可以指定最小、大值
    !eeheap -gc | -loader 查看托管对象和程序结构在内存中占用情况
    !address -summary 查看进程的内存分布情况,包括非托管内存
    !ip2md  查看Method、Class及Module信息
    !saveModule 从dump导出module到指定的磁盘目录
    .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指定完整路径。
    4. sos扩展命令的完整列表:https://msdn.microsoft.com/en-us/library/bb190764(v=vs.110).aspx

    抓取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
    5. 仅显示所有异常
      procdump -e 1 -f "" w3wp.exe
    6. 抓取崩溃前的异常
      procdump -t -e 1 -f Exception -n 10 w3wp.exe

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

    image

    image

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

    补充:抓取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

  • 相关阅读:
    vue04-动画、组件
    vue02—— 动画、组件、组件之间的数据通信
    webpack使用
    Promise
    css 尾巴
    js尾巴
    Python字符串格式转换
    CentOS 6.5下Redmine的安装配置
    gem Errno::ECONNRESET: Connection reset by peer
    MySQL几个重要的目录
  • 原文地址:https://www.cnblogs.com/zhaoguan_wang/p/4571531.html
Copyright © 2020-2023  润新知