三类调试命令:.hh打开使用文档
1,标准命令
windbg自带命令
-
下一个断点(f5) g
-
退出debug qd
-
k查看当前线程栈的跟踪内容(可以看见非托管部分) kb 更详细,包括参数和局部变量
-
查看局部变量 dv /t /v
-
查看内存地址上的值 dp、db
-
修改内存字符ea,r修改寄存器
-
反汇编 u 查看寄存器 r
-
下断点bp 删断点bc 查看所有断点bl 删除所有断点bd
对方法下断点:bp 模块名!方法名
对方法偏移下断点:bp 模块名!方法名+偏移量
对地址下断点:bp 内存地址
对命中处执行自定义代码:
bp 00007ff7`9fda193e ".echo how are you?" bp ntdll!NtAllocateVirtualMemory ".if (poi(@r9)>=0x200000) { .printf \"============ %lu bytes ================\\n\",poi(@r9); k ; gc} .else {gc}"
-
查看变量 x
x clr!*s_ConcurrentGC*;x clr!*s_ServerGC*
-
切换线程 ~0s
-
s-d
命令的作用是在调试过程中搜索并显示指定模块中的符号的详细信息。s-d 0 L?0xffffffff 04F3B321 全内存搜索04F3B321的详细信息
2,元命令
windbg内置的辅助命令,以.开头
-
清空 .cls
-
查看插件(dll) .chain
-
卸载插件(dll) .unload 插件名
-
加载插件(dll) .load 插件路径
-
修改符号 .sympath
.sympath srv*c:\mysymbols*https://msdl.microsoft.com/download/symbols
-
格式化 .formats
.formats 10
3,扩展命令
针对特定目标编写的插件,以!开头
常见扩展:sos,sosex,mex,ext
查看扩展用法:!扩展.help
!sos.help
-
线程信息 !t cpu信息 !tp 特定线程信息 !t -special
-
!eeversion:workstation一般是控制台程序 server一般是网站程序
-
所有进程 !process
-
!t
命令用于显示当前调试会话中的所有线程的信息。它会列出每个线程的ID、优先级、状态、CPU使用情况等。这个命令对于查看线程的数量和状态非常有用。!t -special
可以查看gc线程、终结线程等!teb
命令用于显示当前线程的线程环境块(Thread Environment Block,简称TEB)的信息。TEB是每个线程独有的数据结构,用于存储线程的上下文信息、线程局部存储(Thread Local Storage,TLS)等。!teb
命令可以显示线程的TEB地址、线程ID、线程状态、异常处理信息等。 -
!clrstack 打印当前线程托管栈信息,!clrstack -l 打印当前线程局部变量
-
!do 显示对象的类型、大小、字段值等信息,还可以显示对象所引用的其他对象的信息
-
!syncblk 查看Monitor锁的使用情况
-
!dt
命令的语法是!dt <类型名称>
。它会显示指定类型的字段、属性和方法等详细信息,包括它们的名称、类型、偏移量和大小等。 -
!da
是!dumparray
命令的缩写,通过使用!da -details
命令,你可以获取有关数组对象的更多详细信息,包括数组的长度、元素类型、元素的内存地址和值等。 -
!eeheap
命令用于显示.NET堆的详细信息,包括堆的大小、分代、对象数量等。通过添加-gc
参数,可以显示与垃圾回收相关的信息。 -
一般定位到某个类型ip就可以通过!ip2md得到模块ip,然后导出模块:!savemodule <模块ip> <保存路径> ,然后用ilspy之类的工具查看源码
更多命令
-
在所有线程上输出线程栈信息(托管信息)
~*e !clrstack
-
查看堆
!dumpheap -type Worker
-
查找给定模块中指定方法的地址(模块名!命名空间.类名.方法名
!name2ee Example_2_1!Example_2_1.Worker.DoWork
-
查看虚拟地址
!address -summary
-
查看托管堆统计信息
!heapstat -iu
-
其它扩展
- sosex托管堆上搜html:!strings /m:html
- ext