zoukankan      html  css  js  c++  java
  • 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




  • 相关阅读:
    sublime text 4 vim 插件配置
    ssh-keygen 的使用
    distribution transaction solution
    bilibili 大数据 视频下载 you-get
    Deepin 20.2.1 安装 MS SQL 2019 容器版本
    【转】使用Linux下Docker部署MSSQL并加载主机目录下的数据库
    【转】You Can Now Use OneDrive in Linux Natively Thanks to Insync
    dotnet 诊断工具安装命令
    Linux 使用 xrandr 设置屏幕分辨率
    【转】CentOS 7.9 2009 ISO 官方原版镜像下载
  • 原文地址:https://www.cnblogs.com/zhy-1992/p/9516588.html
Copyright © 2011-2022 走看看