#调试命令窗口
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#重要说明
(1) windbg命令分为标准命令,元命令和扩展命令。
标准命令提供最基本的调试功能,不区分大小写。如:bp g dt dv k等
元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头。如.sympath .reload等
扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中,以!开头。如!analyze等
(2) 进入调试状态时,直接回车可重复执行上一条命令;按上下方向键可以浏览和选择以前输入过的命令
(3) 神奇的Tab键,进行命令补全;ESC清除当前命令输入框中的文本
(4) 使用;作为分隔符,可以在同一行输入多条命令
(5) 上图红色框中的“0:000”。【0为当前调试会话的进程号;000为调试会话的线程号】
(6) 当命令提示符显示*BUSY*时,即使命令输入框可以输入命令,但输入的命令不会立即被执行,要等windbg空闲时才能执行。
可使用Ctrl + Break来终止一个长时间未完成的命令
#启动调试
windbg "notepad.exe" arguments // 使用windbg启动调试notepad.exe
windbg -p 4200 // 将windbg附加到一个正在运行的pid为4200的进程上
windbg -pn "notepad.exe" // 将windbg附加到一个正在运行的名为notepad.exe的进程上
windbg –z "c:\mydumpfile.dmp" // 调试mydumpfile.dmp文件
.attach 0n4220 // 4220为十进制pid,使用该命令附加调试时,必须先存在一个调试会话
.detach // 分离调试
.restart // 重启并调试
.kill // 强制结束当前调试
q // 退出windbg
#获取帮助
? // 打印出所有标准命令
.help // 打印出所有元命令
.hh // 打开windbg的chm帮助文件
command /? // 打印命令command具体参数用法
#注释符
* // 注释整行
$$ // 注释(遇到分号结束)
#配置调试环境
.sympath // 查看当前符号查找路径
.sympath c:\symbols // 将符号查找路径设为:c:\symbols
.sympath+ c:\symbols // 将c:\symbols添加到符号查找路径集合中
.symfix // 将符号查找路径设为:SRV*WinDbg安装目录\Sym*http://msdl.microsoft.com/download/symbols
.symfix f:\symbols // 将符号查找路径设为:SRV*f:\symbols*http://msdl.microsoft.com/download/symbols
.symfix+ f:\symbols // 将SRV*f:\symbols*http://msdl.microsoft.com/download/symbols添加到符号查找路径集合中
.srcpath // 查看当前源文件查找路径
.srcpath f:\src // 将源文件查找路径设为:f:\src
.srcpath+ f:\src // 将f:\src添加到源文件查找路径集合中
.exepath // 查看可执行文件查找路径
.exepath f:\bin // 将可执行文件查找路径设为:f:\bin
.exepath+ f:\bin // 将f:\bin添加到可执行文件查找路径集合中
#符号加载与查看
除了使用ld和.reload命令直接加载符号文件,某些使用符号的命令也可以触发调试器来加载符号,如:栈回溯命令(k*)和反汇编命令(u)等。
值得说明的是,windbg缺省使用的是懒惰式符号加载策略,当它收到模块加载事件时,它通常是不会加载符号的,符号状态显示为deferred(延迟加载)。
.symopt // 显示当前所有符号选项
.symopt+ flags // 添加符号选项
.symopt- flags // 删除符号选项
ld * // 为所有模块加载符号
ld kernel32 // 加载kernel32.dll的符号
.reload // 为所有模块加载符号信息
.reload /f /v // f:强制立即模式 v:详细模式
.reload /f @"c:\windows\System32\verifier.dll" // 为指定模块加载符号信息
x *! // 列出所有模块对应的符号信息
lm // 列出所有模块对应的符号信息
x ConsoleTest!* // 列出ConsoleTest模块中的所有符号
x ConsoleTest!add* // 列出ConsoleTest模块中的所有add开头的符号
x /t /v ConsoleTest!* // 带数据类型、符号类型和大小信息,列出ConsoleTest模块中的所有符号
x kernel32!*LoadLib* // 列出kernel32模块中所有含LoadLib字样的符号
u // 反编译
#进程与线程
| // 列出调试进程
|* // 列出调试进程
|N // 参看序数为N的调试进程
|Ns // 切换序数为N的进程为当前调试进程
~ // 列出线程
~* // 所有线程
~* k // 所有线程堆栈信息
~* r // 所有线程寄存器信息
~. // 查看当前线程
~# // 查看导致当前事件或异常的线程
~N // 查看序数为N的线程
~~[n] // 查看线程ID为n的线程
~Ns // 切换序数为N的线程为当前调试线程
~N f // 冻结序数为N的线程
~N u // 解冻序数为N的线程
~N n // Suspend序数为N的线程
~N m // Resume序数为N的线程
#断点
bl // 列出所有断点
bc * // 清除所有断点
bc 1 // 清除1号断点
bc 1 2 5 // 清除1号、2号、5号断点
be * // 启用所有断点
be 1 // 启用1号断点
be 1 2 5 // 启用1号、2号、5号断点
bd * // 禁用所有断点
bd 1 // 禁用1号断点
bd 1 2 5 // 禁用1号、2号、5号断点
bp 7c801b00 // 在7c801b00地址处放置一个断点
bp `ConsoleTest.cpp:36` // 在ConsoleTest.cpp的36行处放置一个断点
bp main // 在main函数的起始处放置一个断点
bp CSecondLoader::CSecondLoader // 在CSecondLoader的构造函数处放置一个断点
bp `ConsoleTest.cpp:40` "j (poi(MyVar)>5) ''; 'g'" // 条件断点 MyVar>5,执行空语句(;),断住 否则继续执行
bp `ConsoleTest.cpp:40` "j @eax = 0xa3 ''; 'g'" // 条件断点 寄存器eax的值为0xa3时断住
bu // 保存断点,其用法和bp一样
bm add_* // 匹配add_开头的函数,并在这些函数起始处都打上断点
ba w4 0483dfe0 // 当对0483dfe0地址写操作时停下
// ba [r|w|e] [Size] Addr [r=read/write, w=write, e=execute], Size=[1|2|4 bytes]
#调试执行控制
g // Go(F5)
gH // 执行gH命令强制让调试器返回已经处理了这个异常。【Go with Exception Handled】
// 系统收到这个回复后会停止分发异常(因为调试器声称已经处理了异常),恢复调试目标继续执行,
// 但由于异常条件仍在,所以还会产生异常,于是再次分发,WinDBG再次中断到命令模式。
gN // 【Go with Exception Not Handled】
// 执行gN命令强制让调试器返回没有处理了这个异常,那么系统会进一步分发该异常,
// 如果没有其他调试器也不处理,最后系统会弹出程序终止对话框。
gu // 执行到当前函数完成时停下 【Go Up】
p // 单步执行(F10) 【Step】
p 2 // 2为步进数目
pc // 执行到下一个函数调用处停下 【Step to Next Call】
pa 7c801b0b // 执行到7c801b0b地址处停下 【Step to Adress】
t // Step into(F11) 【Trace】
tc // 执行到下一个进入点处停下 【Trace to Next Call】
ta 7c801b12 // 执行到7c801b12地址处停下 【Trace to Adress】
# 查看变量
dt nRet // 查看变量nRet的类型与值
dv // 显示当前函数内所有局部变量,函数参数
dv n* // 显示当前函数内n开头的所有局部变量,函数参数
dv /t /i /V /a|/n|/z
/*****************************************
更加详细地显示当前函数内所有局部变量,函数参数信息
i = type (local, global, parameter)
t = data type
V = memory address or register location
-----------------------
a = sort by Addr, n = sort by name, z = sort by size
*****************************************/
#调用堆栈
k // 显示当前调用堆栈
kn // 带栈编号显示当前调用堆栈
kb // 打印出前3个函数参数的当前调用堆栈
kb 5 // 只显示最上的5层调用堆栈
.frame // 显示当前栈帧
.frame n // 设置编号n的栈帧为当前栈帧
.frame /r n // 设置编号n的栈帧为当前栈帧 并显示寄存器变量
!uniqstack // 显示所有线程的调用堆栈
#寄存器
r // 显示所有寄存器信息
r eax, edx // 显示eax,edx寄存器信息
r eax=5, edx=6 // 对寄存器eax赋值为5,edx赋值为6
#内存
da /c 5 7c801e02 // 从7c801e02内存处开始,显示5个ascii字符
/*****************************************
d[a| u| b| w| W| d| c| q| f| D] [/c 列数] [地址]
a = ascii chars
u = Unicode chars
b = byte + ascii
w = word (2b)
W = word (2b) + ascii
d = dword (4b)
c = dword (4b) + ascii
q = qword (8b)
f = floating point (single precision - 4b)
D = floating point (double precision - 8b)
*****************************************/
dyb /c 3 7c801e02 // 从7c801e02内存处开始,显示3个byte及二进制
/*****************************************
dy[b | d] .. // b = binary+byte d = binary+dword
*****************************************/
#dump输出
.dump /ma "d:\mydmpfile.dmp" // 将当前调试进程输出Dump文件
#其他元命令
.tlist // 显示所有进程
.cls // 清除屏幕
#其他扩展命令
!analyze -v // 详细显示当前异常信息
!peb // 格式化输出PEB信息(process's environment block)
!gle // 打印当前线程最近的错误信息
!gle -all // 打印所有线程的最近的错误信息
!error 897// 显示错误码为897的详细描述信息
#帮助
中文在线帮助:http://www.dbgtech.net/windbghelp/index.html
windbg cmd: http://www.slideshare.net/kewuc/windbg-cmds 【下载】
启动, 附加进程, 执行和退出(Starting, Attaching, Executing and Exiting)
=======================
| Start -> All Programs -> Debugging Tools for Windows -> WinDBG | 启动 |
F6 | attach to process | 附加到进程 |
Ctrl-Break | interrupt debugee | 中断正在被debug的程序 |
.detach | detach from a process | 脱离进程 |
g | continue debugee execution | 继续执行被debug的程序 |
q | exit WinDBG | 退出WinDBG |
获得帮助(Getting Help)
=======================
? | help on commands that affect the debugee | 列出所有的内置命令和操作符 |
.help | help on commands that affect the debugger | 列出所有的元命令 |
.hh command | view the on line help file | 打开WinDBG的帮助文件 |
!help | help on the extension dll at the top of the chain (e. g., SOS) | 列出扩展DLL中的扩展命令帮助 |
操纵命令(Issuing Commands)
=======================
up arrow, down arrow, enter | scroll through command history | 浏览命令历史 |
Right mouse button | paste into command window | 在命令窗口中粘贴 |
检查非托管环境(Examining the Unmanaged Environment)
=======================
lmf | list loaded modules with full path | 列出已加载了的模块及其完整路径 |
lmt | list loaded modules with last modified timestamp | 列出已加载了的模块和最后修改的时间戳 |
~ | list unmanaged threads | 列出所有非托管线程 |
~thread s | select a thread for thread specific commands |
|
!token -n | view thread permissions |
|
k | view the unmanaged call stack | 查看非托管调用栈 |
!runaway | view thread CPU consumption | 显示每个线程占用的时间 |
bp | set a breakpoint | 设置一个断点 |
.dump path | dump small memory image | 创建一个小的dump内存镜像 |
.dump /ma path | dump complete memory image | 创建一个完整的dump文件 |
使用Debuger DLL扩展(Working with Extension DLLs (e. g., SOS))
=======================
.chain | list extensions dlls | 列出所有加载了的debugger extension |
.load clr10\sos | load SOS for debugging framework 1.0 / 1.1 | 加载.net 1.1托管程序的debug扩展 |
.unload clr10\sos | unload SOS | 卸载SOS |
.loadby sos mscorwks | load SOS for debugging framework 2.0 | 加载.net 2.0的debug 扩展 |
SOS命令(SOS Commands)
=======================
!threads | view managed threads | 查看所有托管线程 |
!clrstack | view the managed call stack | 查看托管调用栈 |
!dumpstack | view combined unmanaged & managed call stack | 查看非托管和托管结合的调用栈 |
!clrstack -p | view function call arguments | 查看托管函数调用的参数 |
!clrstack –l | view stack (local) variables | 查看托管栈的局部变量 |
!name2ee module class | view addresses associated with a class or method | 查看某个类或方法的内存地址 |
!dumpmt –mdaddress | view the method table & methods for a class | 查看指定地址的方法表和一个类的方法集 |
!dumpmd address | view detailed information about a method | 显示指定地址的MethodDesc结构信息 |
!do address | view information about an object | 显示某地址的对象的信息, 包括fields, EEClass, Method Table和object size |
!dumpheap –stat | view memory consumption by type | 显示堆内存的使用 |
!dumpheap –min size | view memory consumption by object when at least size | 查看堆内存使用, 忽略小于size字节大小的对象 |
!dumpheap –typetype | view memory consumption for all objects of type type | 查看所有类型为type的对象的内存使用 |
!gcroot address | view which object are holding a reference to address | 查看所有对指定地址的对象的引用 |
!syncblk | view information about managed locks | 查看托管的锁(SyncBlock结构) |
SOS 2.0 命令(SOS 2.0 Commands)
========================
!bpmd module method | set breakpoint | 在指定模块的某一指定的方法上设置断点 |
!DumpArray address | view contents of an array | 查看数组中的元素 |
!PrintException | view information about most recent exception | 格式化地显示最近的异常信息 |