Windbg学习笔记 - 简书

标签: | 发表时间:2018-12-19 17:19 | 作者:
出处:https://www.jianshu.com

下载 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步骤

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

调试exe文件步骤

  1. Open Executeable..
  2. 执行 sxe ld:clrjit
  3. 执行 g
  4. 执行 .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:
    在command console下面:
    key in: adplus -hang -iis -o c:\ Path_to_Put_Files_in -quiet
    则系统会listen iis。如果iis发生hang,那么会自动收集与iis相关的memory保存至Path_to_Put_Files,然后exit.

  2. dump crash模式下的iis memory:
    在command console下面:
    key in: adplus -crash -iis -o c:\ Path_to_Put_Files_in -quiet
    则当iis crash的时候,系统会自动收集与iis相关的memery并保存至Path_to_Put_Files,然后exit.

!sym noisy
.reload

相关 [windbg 学习 笔记] 推荐:

Windbg学习笔记 - 简书

- -
winsdksetup.exe,双击,选择. Debugging Tools for Windows安装. 64位系统抓64位进程dump,用64位windbg来分析. 64位系统抓32位进程dump,用32位windbg来分析. where sos.dll找到sos.dll路径. 这个错误的原因是用了32位的任务管理器抓的32位的dump文件.

Windbg入门实战讲解

- - FreeBuf.COM | 关注黑客与极客
聚锋实验室:gongmo. windbg作为windows调试的神器. 是查看内核某些结构体,挖掘漏洞,调试系统内核,调试驱动等必不可少的工具. 但是由于windbg命令众多,界面友好程度较差,从而造成新人上手不易,望而却步. 本文抛砖引玉,从基础入手,讲解windbg. 注意:本文省略部分为:1.如何加载系统符号.

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..

OAuth学习笔记

- 宋大妈 - FeedzShare
来自: 标点符 - FeedzShare  . 发布时间:2011年08月29日,  已有 2 人推荐. OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.

Vim学习笔记

- 临池学书 - C++博客-首页原创精华区
最近在学习Vimtutor中的相关内容,Vim的使用博大精深,很多命令一旦不使用就会忘记,下面把其中的没有使用到的相关命令做一个简单的总结,供以后复习使用. 至于常见的保存,插入等等命令,则不予记录,在以后的使用中加深练习即可. To change until the end of a word, type  ce (ce + 修正的单词).

OAuth学习笔记

- jiaosq - 标点符
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据. 每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频).

HTML学习笔记

- - CSDN博客推荐文章
超文本标记语言( 英文:HyperText Markup Language,HTML)是为“ 网页创建和其它可在 网页浏览器中看到的信息”设计的一种 标记语言. HTML被用来结构化信息——例如标题、段落和列表等等  点击打开链接. w3schools  点击打开链接 {语法大全,超赞.

jQuery学习笔记

- - ITeye博客
什么是jQuery,它能为我们做什么. jQuery是一个javascript类库或称之为javascript框架. 无需刷新页面从服务器获取信息. 简化常见的javascript任务. 为什么会如此流行或说得到大量用户群的支持:. 多重操作集于一行(避免使用临时变量或不必要的重复代码). jQuery利用了CSS选择符的能力,在DOM中快捷而轻松地获取元素或元素集合.

JdbcTemplate学习笔记

- - SQL - 编程语言 - ITeye博客
1、使用JdbcTemplate的execute()方法执行SQL语句. 2、如果是UPDATE或INSERT,用update()方法.    JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等. spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现.

Disruptor 学习笔记

- - 开源软件 - ITeye博客
Disruptor 是一个高性能异步处理框架,也可以认为是一个消息框架,它实现了观察者模式. Disruptor 比传统的基于锁的消息框架的优势在于:它是无锁的、CPU友好;它不会清除缓存中的数据,只会覆盖,降低了垃圾回收机制启动的频率. Disruptor 为什么快. 通过内存屏障和原子性的CAS操作替换锁.