Windbg,入门篇

下载https://download.microsoft.com/download/E/1/B/E1B0E6C0-2FA2-4A1B-B322-714A5586BE63/windowssdk/winsdksetup.exe ,双击,选择Debugging Tools for Windows安装。

  • 64位系统抓64位进程dump,用64位windbg来分析。64位系统抓32位进程dump,用32位windbg来分析
  • 用VS命令行执行where sos.dll 找到sos.dll路径
  • SOS does not support the current target architecture
  • 这个错误的原因是用了32位的任务管理器抓的32位的dump文件。
  • 需要用64位的任务管理器抓32位的dump文件(C:\Windows\SysWOW64\taskmgr.exe)
  • lmf指令列出当前进程中加载的所有DLL文件和对应的路径
  • lmvm 查看DLL/EXE文件信息,参数为某个dll文件名称
  • 使用.loadby sos mscorwks 指令用于加载.Net 3.5版本及以下模块
  • 使用.loadby sos clr指令用于加载.Net 4.0版本及以上模块
  • 指定symbol search path 设置符号服务器与符号缓存SRV*D:\symbols*http://msdl.microsoft.com/download/symbols
  • 也可以在命令行执行
  • .symfix d:\symbols
  • lmv mclr查看当前dump所需环境

The version of SOS does not match the version of CLR you are debugging?

根据dump来源系统版本从sos下载路径找到对应版本的mscordacwks.dll、sos.dll下载到本地,并重命名为mscordacwks.dll、sos.dll,在对应版本的Windbg的安装路径下创建目录,比如下载的是4.0.30319.1026这个版本的sos.dll,就在目录下创建clr1026文件夹,并将下载的文件放入该目录,然后执行.load clr1026\sos.dll(注意目录名),即可加载正确版本的sos。

常用命令

!help sos指令帮助

!threads 显示所有线程

!threadpool(!tp) 显示程序池信息

!ProcInfo 显示进程信息

!dumpheap 显示托管堆的信息

!dumpheap -stat 检查当前所有托管类型的统计信息

!dumpheap -type Person –stat 在堆中查找指定类型(person)对象,注意大小写敏感

!clrstack 显示调用栈

!clrstack -p 显示调用栈,同时显示参数

!clrstack 只显示托管代码,而kb只显示非托管代码

!dumpobj(!do) 显示一个对象的内容

!dumparray(!da) 显示数组

!DumpStackObjects(!dso) 当前线程对象分配过程

!syncblk 显示同步块

!runaway 显示线程cpu时间

!gcroot 跟踪对象内存引用

!pe 打印异常

!ObjSize 查看对象大小 ObjSize 用于知道对象地址时,查看该对象的大小。

!GCRoot 是一个非常有用的命令,它能够帮助我们发现某对象上目前还存在的有效引用。这也是为什么GC还不回收这个对象的原因。这个信息可以很好的帮助我们分析那些本应该没有引用,但却一直还存在有效引用的对象,由此发现我们代码中潜在的内存泄漏,同时我们也可以观察到哪些对象是目前没有引用了。

~*k 结合~和k命令,来显示所有线程的callstack

.cls 清屏

kb 显示当前线程的callstack

线程Hang住的常见原因

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

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

!threads

~* e!clrstack

!syncblk

CPU高

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

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

!runaway 找到占用CPU的线程

~*e!clrstack

线程死锁出现的情况:

两个锁A,B,

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

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

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

!threads

!syncblk

~*e!clrstack

调试dump步骤

  • 将dump文件拖入windbg
  • 执行.loadby sos clr或.loadby sos mscorwks加载模块
  • 执行!analyze -v 进行异常分析

调试exe文件步骤

  • Open Executeable..
  • 执行 sxe ld:clrjit
  • 执行 g
  • 执行.loadby sos clr

如何在IIS crash或者hang时候,dump 所有与IIS相关的memory?

当IIS发生crash或者hang之后,如果有必要获取此刻的memory dump。我们必须通过相应的debug tool来获得。相应工具很多。推荐的是windbg。安装之后,在其folder下,有一个adplus.vbs脚本工具。

  1. dump hang模式下的iis memory:
  2. 在command console下面:
  3. key in: adplus -hang -iis -o c:\ Path_to_Put_Files_in -quiet
  4. 则系统会listen iis。如果iis发生hang,那么会自动收集与iis相关的memory保存至Path_to_Put_Files,然后exit.
  5. dump crash模式下的iis memory:
  6. 在command console下面:
  7. key in: adplus -crash -iis -o c:\ Path_to_Put_Files_in -quiet
  8. 则当iis crash的时候,系统会自动收集与iis相关的memery并保存至Path_to_Put_Files,然后exit.

!sym noisy

.reload


分享到:


相關文章: