WinDbg支持以下三种类型的命令:
1.常规命令:调试进程
2.点命令:控制调试器
3.扩展命令:添加自定义命令,一般由扩展dll提供这些命令
WinDbg详细调试命令:
1.使用帮助
!help
2.设置符号路径
SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
WinDbg会将微软的符号库下载c:\symbols
3.设置/显示符号路径
.sympath [path]
4.重新加载符号
.reload
设置符号路径会,需要执行此命令重新加载符号
5.加载调试扩展
调试.net程序的sos模块:
a.对于.Net Runtime 2.0:.loadby sos mscorwks
b.对于.Net Runtime 4.0:.loadby sos clr
sos是一个dll,定义了很多针对.net assembly的调试命令,sos.dll针对不同的runtime有不同的版本。如果使用.load命令,需要为sos.dll指定完整路径。如果使用.loadby命令,则表示要在mscorwks.dll和clr.dll的同一目录下查找sos。对于.net程序,基本上都会加载mscorwks.dll(2.0)和clr.dll(4.0)
6.查看线程
~:包括托管线程和非托管线程
!threads:查看托管线程
!ThreadPool:显示有关托管线程池的信息(包括队列中工作请求的数目、完成端口线程的数目和计时器的数目)
~0s:切换线程(中间的数字表示线程号)
!clrstack [-a] [-l] [-p] [-n]:查看线程栈, 仅提供托管代码的堆栈跟踪;-p选项显示托管函 数的参数,-l 选项将显示有关帧中的局部变量的信息,-a (all) 选项是一个表示 -l 和 -p 的组合的快捷方式,-n 选项禁止显示源文件名和行号
k:查看线程栈,只能正常显示非托管部分
!dumpstack [-EE] [-n] [top stack [bottom stack]]:显示线程栈全部信息,包括托管和非托 管部分;-EE 选项使DumpStack 命令仅显示托管函数。使用top 和bottom 参数可限制 x86 平台上显示的堆栈帧,-n 选项禁止显示源文件名和行号
!EEStack [-short] [-EE]:将-EE 选项直接传递给DumpStack 命令。-short 参数将输出限制 为已获取锁的线程、己停止运行以允许垃圾回收的线程和当前在托管代码中的线程
~*e !clrstack:显示所有线程的堆栈
!dumpstackobjects [-verify] [top stack [bottom stack]] 或 !dso:显示在当前堆栈的边界内 找到的所有托管对象
7.查看堆中的所有对象信息,包括类型信息,个数,大小等
!dumpheap –stat
a.指定对象类型,如果需要结果准确,需要使用全名称,类型名称是大小写敏感的
!dumpheap -type FlowThrottle –stat
b.a中命令输出的第一列是mt(method table)信息,表示类型对象的地址。查看对象在堆中的信息
!dumpheap -mt <address> -stat
注意,如果不指定-stat,那么输出每个对象的信息,使用-stat,将会看到统计信息。
c.输出对象地址
!dumpheap -mt <address> -short
d.-short 选项将输出限制为只是每个对象的地址。
e.-min 选项忽略小于 size 参数指定的大小(单位为字节)的对象。-max 选项忽略大于size 参数指定的大小(单位为字节)的对象。
8.显示有关内部公共语言运行时数据结构所使用的进程内存的信息。
EEHeap [-gc][-loader]:-gc 和-loader 选项将此命令的输出限制为垃圾回收器或加载程序数据结构。有关垃圾回收器的信息列出了托管堆中每个段的范围。如果指针落在由-gc 给出的段范围内,则该指针是一个对象指针。
9.打印对象信息,指定任何有效的对象地址,查看该对象的内容
!dumpobj <address>或者 !do<address>
!dumpobj –nofields<address>或者!do <address>:nofields选项指示不要输出对象字段信息
10.显示有关指定地址处的值类字段的信息。
DumpVC<MethodTable address> <Address>
11.输出多个对象信息
.foreach (myobj{!dumpheap -mt 008f4104-short}) {!do ${myobj}}
12.打印数组信息
!dumparray [-start<startIndex>] [-length <length>] [-details] [-nofields] <arrayobject address>或者!da
a.-start 选项指定开始显示元素的起始索引。
b.-length 选项指定要显示的元素数量。
c.-details 选项使用 DumpObj 和 DumpVC 格式显示元素的详细信息。
d.-nofields 选项可阻止显示数组。此选项只有在指定了-detail 选项之后才可用。
!dumparray -start2 -length 5 -detail 00ad28d0:显示在地址 00ad28d0 处的数组内容。显示从第二个元素开始,连续显示五个元素。
13.输出app domain信息
!dumpdomain
枚举在指定的 AppDomain 对象地址内加载的每个Assembly 对象。若在调用DumpDomain 命令时不提供任何参数,则将列出进程中的所有AppDomain 对象。
14.输出程序集信息
!dumpassembly
15.打印方法表
!dumpmt [-MD]<MethodTable address>: 显示有关指定地址处的方法表的信息。指定-MD 选项将显示与对象一起定义的所有方法的列表。每个托管对象都包含一个方法表指针。
16.打印EEClass结构,其中可以看到类型静态变量信息
!dumpclass<EEClass address>:显示有关与类型关联的 EEClass 结构的信息。DumpClass命令显示静态字段值,但不显示非静态字段值。使用DumpMT、DumpObj,Name2EE 或Token2EE 命令获取EEClass 结构的地址。
17.显示异常
a.使调试器在引发指定异常时停止,但在引发其他异常时继续运行。
!StopOnException [-derived] [-create | -create2]<Exception> <Pseudo-register number>
-derived 选项用于捕获指定异常以及从指定异常派生的每个异常。
b.显示当前活动线程上的最后一个异常
!PrintException [-nested] [-lines] [<Exception objectaddress>] 或 !PE
显示从指定地址处的Exception 类派生的任何对象的字段并设置这些字段的格式。如果不指定地址,PrintException命令将显示在当前线程上引发的最后一个异常。
-nested 选项显示有关嵌套异常对象的详细信息。
-lines 选项显示源信息(如果可用)。
c.显示发生在所有线程上的最后的异常
~*e !pe
18.调试GC相关信息
a.显示有关对指定地址处的对象的引用(或根)的信息
!GCRoot [-nostacks] <Object address>
GCRoot 命令将检查整个托管堆和句柄表以查找其他对象内的句柄和堆栈上的句柄。然后,在每个堆栈中搜索对象的指针,同时还搜索终结器队列。此命令无法确定堆栈根是有效的还是已丢弃。使用CLRStack 和U 命令可对本地或参数值所属的帧进行反汇编,以便确定堆栈根是否仍在使用中。
-nostacks 选项将搜索限制为垃圾回收器句柄和 Freachable 对象。
b.显示所有已进行终结注册的对象
!FinalizeQueue [-detail] | [-allReady] [-short]
-detail 选项显示有关需要清理的任何 SyncBlocks 的额外信息以及有关等待清理的任何RuntimeCallableWrappers (RCW) 的额外信息。这两种数据结构都由终结器线程在运行时进行缓存和清理。
-allReady 选项显示所有准备终止的对象,无论它们已被垃圾回收标记成这样,还是将被下一个垃圾回收标记。在“准备终止”列表中的对象为不再为根的可终止对象。此选项可能耗费大量资源,因为它验证可终止队列中的所有对象是否仍然为根对象。
-short 选项将输出限制为每个对象的地址。如果与-allReady 一起使用,则将枚举具有不再为根的终结器的所有对象。如果单独使用,则将列出终结和“准备终结”队列中的所有对象。
19.断点
!bpmd System.Windows.Forms.dllSystem.Windows.Forms.MessageBox.Show
第一个参数是dll文件名,第二个是完整的方法名。
bp <address>:设置断点
bp /w condition <address>:设置条件断点
bl:显示已经设定的断点
bu <address>:设置未解析的断点
bc 清除断点
20.程序继续运行
g
21.显示公共语言运行时版本
!eeversion
22.清除屏幕信息
.cls
23.退出当前调试
q
24.调试符号
ld kernerl32:加载kernerl32模块的符号
lm m k*:显示已经加载的,以k开头的模块
ln:显示最近操作过的模块名
dt dbg2:检测模块
x kernerl32!k* 显示模块kernerl32中所有以k开头的函数
dv 显示局部变量值
dv /i/t/v 显示局部变量的类型,值相关信息。
x <module>!* / ? 显示指定模块的符号
x argc 查看变量argc的值。
dt argc 查看变量值
dt _PEB 7ffdd00 将内存地址7ffdd00开始的内容以PEB结构的方式显示出来。
dd 12000 L4 查看地址12000 后面的四个字
dds 12000 L100 查看堆栈上地址12000开始,后面的100个dword的内容,如果有调试符号,会将符号显示。此方法来追踪堆栈。(先看ebp,再用此方法)
dd ebp + 4, 返回地址, ebp + 8 第一个参数
.kill 杀死调试进程
.restart 重新调试
k/kn 显示调用堆栈
kb 显示前三个参数。第一个参数ebp+8;第二个ebp+0x0C;第三个ebp+0x10;dd ebp+0x14是第四个参数
kp 显示函数参数类型,数值
kp f f开关显示相邻栈基之差,从而可以推断出栈的健康状况。
| 显示进程
~显示线程
~0 s 切换到 0号线程
dv 显示函数参数&局部变量,注意,dv是跟栈帧相关的,对不同的栈帧显示不同的局部变量。
@1, kn 显示所有栈帧
@2, .frame选择想要查看的栈帧
@3, dv /i/v/t显示该栈帧里局部变量信息
@3, dv /i /V /t 显示变量基于栈帧的地址
!db L 32 : results in 32 bytes being displayed (as hexadecimal bytes),
!dh [Options] Address : 查看模块pe信息
!dh -f : display file headers
!dh -s : section headers
!dh -a : all header informations
dt nt!_EPROCESS:查看结构体成员
!irql:查看当前的irql
!verifier:查看Verifier 检测统计信息
!pool <address>:查看某个内存地址属于那一个模块
!lmi <address>:查看模块的主要信息
!pcr:可以查看当前执行的线程及irql, 等信息
!processfield:列出EPROCESS的成员
!threadfields:列出ETHREAD成员
!tep:查看当前线程的私有数据,线程状态、线程局部存储等信息
!peb:查看当前进程的私有数据,进程状态、全局变量和堆栈等信息
dt ntdll!*teb* 列出匹配通配符的结构名
dt -v -r ntdll!_TEB :列出结构_TEB的成员信息
!gle:查看错误信息
25.查找字符串
s –a <address> <length> <string>:以ASCII码形式在内存地址address往后length个字节搜索字符串
26.查看和修改数据
db/dw/dd/dq [Address] 字节/字/双字/四字方式查看数据
da/du [Address] ASCII字符串/Unicode字符串方式查看指定地址
dt nt!_EPROCESS:查看结构体成员
dt nt!_EPROCESS <address>:查看指定地址的结构体成员
eb/ew/ed/eq/ef/ep Address [Values]:修改内存,字节/字/双字/四字/浮点数/指针/
ea/eu/eza/ezu Address [Values]:ASCII字符串/Unicode字符串/以NULL结尾的ASCII字符串/以NULL结尾的Unicode字符串
s -[b/w/d/q/a/u] Range Target:搜索字节/字/双字/四字/ASCII字符串/Unicode字符串
27.查看系统模块
lm:列举所有加载的模块
!lmi <module>:显示指定模块信息
28.设置源码路径
.srcpath <path>
29.查看驱动对象
!drvobj <name/address>
30.查询地址相关符号
dps <address>
31.显示当前IRQL等级
!irql
32.查看pool地址
!pool <address>
33.反汇编
u <address>
ub <address>
uu <address>