• Windbg学习笔记


    下载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:WindowsSysWOW64 askmgr.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 clr1026sos.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




  • 相关阅读:
    4.2 面向对象分析(二) CRC方法标识概念类
    4.1 面向对象分析(二) 标识概念类和对象
    3.4 面向对象分析(一)面向对象设计(初步)
    3.3 面向对象分析(一)分析模型法
    3.2 面向对象分析(一)名词法
    3.1 面向对象分析与设计概览
    2.7 UML状态图
    2.6 通信图
    2.5 UML顺序图
    2.4 UML类图
  • 原文地址:https://www.cnblogs.com/zhy-1992/p/9516588.html
Copyright © 2020-2023  润新知