首页 > 其他分享 >Windbg常用命令及分析套路

Windbg常用命令及分析套路

时间:2023-09-25 11:57:11浏览次数:58  
标签:调用 Windbg 查看 套路 对象 线程 常用命令 GC dumpheap

自己也在使用windbg分析问题,但是属于刚入门所以转发下大神的总结:https://www.cnblogs.com/fj365/p/13295453.html

常用
!threadpool 查看线程池CPU使用量

!threads 查看所有托管线程情况

!clrstack 某个线程托管代码的调用栈情况

~*e!clrstack 所有线程托管代码的调用栈情况

!runaway 查看线程占用CPU时间

~ s 切换到指定线程(number为具体哪个线程的ID)

!dumpstackobjects(!dso) 本线程调用栈所有对象实例

!dumpdomain 显示所有域里的程序集,或者根据参数获取指定域。

!savemodule 根据具体程序集地址,把当前程序集的代码生成到指定文件

!PrintException(!pe) 显示在当前线程上引发的最后一个异常错误信息

!VerifyHeap 检查垃圾回收器堆中是否有损坏迹象,并显示找到任何错误

!SyncBlk –all 显示所有SyncBlock 结构情况

查看对象
基本
!DumpObj <对象地址> 查看对象

!DumpArray <对象地址> 查看数组

!sosex.mdt <对象地址> 查看对象

!sosex.mdt -e <对象地址> 查看数组

!netext.wdo <对象地址> 查看对象

限定大小
!dumpheap -min -max 查看大小在size1~size2的对象

!dumpheap -min 查看大于size字节的对象

限定类型
!dumpheap -mt -min -max

查看MethodTable结构的对象

!dumpheap –type

查看类型名字子串匹配指定字符串的对象

限定地址范围
!dumpheap start [end] 查看指定地址范围的对象

查看内存
!eeheap -gc 查看GC堆,查看GC堆上的内存占用是多大

!eeheap –loader 查看Loader堆

!dumpheap –stat GC堆上的统计,看GC堆上存活的对象是那些

!dumpheap -mt 查看该地址上的对象

!dumpheap –type 通过 type 参数查看内存中指定类型的对象

!gcroot <对象地址> 得到这个对象的引用"根"

!objsize <对象地址> 查看对象占用多大的内存(不一定准)

!name2ee TestClass.exeTestClass.Program.test //显示test方法相关的地址

!dumpmt -md 00976d48 //得到类的成员函数详细信息

!dumpmt 找到相关MethodTable处的有关信息

!dumpmd 根据MethodDesc找到相关模块信息,比如MethodTable.

!dumpdomain 显示所有域里的程序集,或者根据参数获取指定域。

!dumpil 00973028 显示这个方法被编译器编译之后的IL代码

!dumpmodule 1ee30010 查看某个模块的详细信息

检查GC的终结队列及线程
!FinalizeQueue 显示为终结(finalization)而登记的所有对象。

                  重点看“Ready for finalization XX objexts”

!ThreadPool 显示托管线程池的有关信息。

如果“CPU utilization 81%”表示当前很可能在执行GC回收,此时Work Request in Queue会增长(因为CPU超过80%不会创建新线程)。

!Threads 显示进程中所有的托管线程。

关注Exception列,标记为“(Finalizer)”的表示这条为终结器线程、标记有“(GC)”的表示这条线程上在执行GC操作、

查看线程调用
查看调用堆栈,然后进一步查看相关调用方法的参数,推断调用逻辑;

~<线程>e!clrstack 查线程调用堆栈

~*e!clrstack 查所有线程调用堆栈

~<线程>e!clrstack –a 查线程调用堆栈(含参数对象地址)

~<线程>e!dso 查线程上所有对象–>根据类型找到要查看对象的地址

!do <对象地址> 查看对象信息

!sosex.mdt–e <对象地址> 查看对象信息(数组)

查看异常
PrintException [-nested][]

-或者-

PE [-nested][]

编排格式并显示在指定地址上的任何Exception类派生对象的字段。如果你没有指定一个地址,PrintException命令显示当前线程上最近抛出的异常。

-nested 选项详细显示嵌套的异常对象。

你可以使用这个命令编排格式并查看_stackTrace字段,这是一个二元数组。

!analyze -v -hang

   displays information about the currentexception or bug check.

.foreach (ex{!dumpheap -type Exception -short}){.echo“********************************”;!pe -nested ${ex} }

定位“锁”
!sosex.dlk 检查死锁

!SyncBlk

扩展
sosex
http://www.stevestechspot.com/default.aspx

先创建堆上对象的索引!bhi

!mdt -e 00000000450bc560

netext
http://netext.codeplex.com/SourceControl/latest

Psscor4
https://www.microsoft.com/en-us/download/details.aspx?id=21255

编写Windbg扩展
https://www.codeproject.com/Articles/6522/Debug-Tutorial-Part-Writing-WINDBG-Extensions

标签:调用,Windbg,查看,套路,对象,线程,常用命令,GC,dumpheap
From: https://www.cnblogs.com/kangao/p/17727630.html

相关文章

  • Git常用命令
     1、配置个人身份gitconfig--globaluser.name枝桠[email protected]、生成ssh公钥ssh-keygen-trsa-C"[email protected]"-b4096查看公钥cat~/.ssh/id_rsa.pub3、拉取代码gitclone[-bBRANCH_NAME][email protected]:sw......
  • 关于GEC6818开发板常用命令
    cd目录路径cd用于切换路径(文件夹/目录),用来切换终端的工作路径到指定目录中去格式:cd路径名cd.表示进入当前目录cd..表示进入上一级目录cd/main/mainls列举ls列出指定目录下的文件名,可以用来查看当前工作路径下所有的文件信息格式:ls路径名lsmainlsbmpmkdir创建......
  • 关于GEC6818开发板常用命令
    cd目录路径cd用于切换路径(文件夹/目录),用来切换终端的工作路径到指定目录中去格式:cd路径名cd.表示进入当前目录cd..表示进入上一级目录cd/main/mainls列举ls列出指定目录下的文件名,可以用来查看当前工作路径下所有的文件信息格式:ls路径名lsmainlsbmpmkdir创建一......
  • mysql常用命令
    一、一般默认安装目录1、数据库目录/var/lib/mysql/2、配置文件/usr/share/mysql(mysql.server命令及配置文件)mysql5.5之后的默认安装路径,mysql5.5之前的是/usr/local/mysql3、相关命令/usr/bin(mysqladminmysqldump等命令)4、启动脚本/etc/rc.d/init.d/(启动脚本文件mysql......
  • Linux常用命令2
    cat/proc/mtd查看NandFlash分区情况flash_erase/dev/mtd300nandwrite-s0x60000-p/dev/mtd3/home/root/imx6ull-14x14-nand-7-1024x600-c.dtbsyncflash_erase/dev/mtd400nandwrite-p/dev/mtd4/home/root/zImagesyncps-Akill100 ls/dev/tty* “ttym......
  • k8s-常用命令
    1、集群管理命令     kubectlgetnodes:列出集群中的节点。  kubectlcluster-info:显示集群的基本信息。  kubectldescribenode<node_name>:显示节点的详细信息。2、命名空间管理命令kubectlgetnamespaces:列出所有命名空间。kubectlcreatenam......
  • donet 常用命令汇总......
    dotnetnew:用于创建新的.NET项目。示例:创建一个名为"MyConsoleApp"的控制台应用程序项目。dotnetnewconsole-nMyConsoleAppdotnetbuild:用于构建.NET项目。示例:构建当前目录中的项目。dotnetbuilddotnetrun:用于运行.NET应用程序。示例:......
  • [填写 9 题]一些套路
    CF721CJourney以答案代状态。P3251[JLOI2012]时间流逝树上高消,式子化为\(f(u)=k\cdotf(pr)+b\)形式。P3259[JLOI2014]路径规划最短路带特定点的数量限制时,使用分层图最短路。P3980[NOI2008]志愿者招募对于一个点,它会影响到接下来的点,故将所有的点串联起来。一个......
  • Hbase Shell的常用命令
    总结的一些Hbaseshell的命令都很简单,可以help来查看帮助create'user_test','info'describe'user_test'disable'user_testinfo'drop'user_testinfo'put'user_test','test-1','info:username','test1......
  • ubuntu 下mysql的常用命令
    MySQL数据库的基本操作命令=========================一、mysql服务操作0、查看数据库版本sql->status;1、netstartmysql//启动mysql服务2、netstopmysql//停止mysql服务3、mysql-h主机地址-u用户名-p用户密码//进入mysql数据库4、quit//......