下载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
!synblk

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学习笔记的更多相关文章

  1. KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)

    目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...

  2. ETHREAD APC 《寒江独钓》内核学习笔记(4)

    继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...

  3. EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)

    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  6. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  7. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  8. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  9. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

随机推荐

  1. [Swift]LeetCode857. 雇佣 K 名工人的最低成本 | Minimum Cost to Hire K Workers

    There are N workers.  The i-th worker has a quality[i] and a minimum wage expectation wage[i]. Now w ...

  2. [Swift]LeetCode1016. 子串能表示从 1 到 N 数字的二进制串 | Binary String With Substrings Representing 1 To N

    Given a binary string S (a string consisting only of '0' and '1's) and a positive integer N, return ...

  3. Mac下安装配置Python2和Python3并相互切换使用

    mac os 以前没有使用过,这次使用了一把,的确还是比较不顺手的,估计从今以后,就要把平台逐渐切换到mac了.今后好的文章,专门会开一个macos专栏,专门记录macos的使用过程中的心得,体会,以 ...

  4. 洛谷P1036选数(素数+组合数)

    题目链接:https://www.luogu.org/problemnew/show/P1036 主要考两个知识点:判断一个数是否为素数.从n个数中选出m个数的组合 判断一个数是否为素数: 素数一定是 ...

  5. java算法(1)---余弦相似度计算字符串相似率

    余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...

  6. java设计模式(1)---总则

    设计模式总则 一.概述 1.什么是设计模式 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 解释下: 分类编目:就是说可以找到一些特征去划分这些设计模式,从而进行分类. ...

  7. 『没有上司的舞会 树形DP』

    树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...

  8. java基础(十一 )-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  9. docker-compose部署mysql无法访问

    docker-compose部署mysql无法访问 这个问题困扰了我很久,当使用docker-compose部署mysql之后,进行容器后,使用mysql -u root -p 是可以访问的,而使用s ...

  10. LeetCode专题-Python实现之第7题:Reverse Integer

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...