命令 解析
!process 0 0 显示所有进程
!dt _EPROCESS 地址 所有进程的EPROCESS信息
!process 地址 显示进程的关键信息
!token 查看访问令牌的有关信息
!handle 显示内核对象句柄表信息
cdb调试器通过 q 或者 qd 退出调试会话。
kd内核态调试器通过 ctrl+B 退出调试会话。
.sympath 设置符号路径
.sympath
.sympath+
.sympath cache*c:\symbols;SRV*http://msdl.microsoft.com/download/symbols;D:\windbg
.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
.symfix
等同于 .sympath SRV*downstream folder*http://msdl.microsoft.com/download/symbols
set _NT_SYMBOL_PATH=C:\symbols
windbg
set _NT_SYMBOL_PATH=CACHE*C:\Symbols;SRV*http://www.advancedwindowsdebugging.com/symbols/symstore.pri;SRV*http://msdl.microsoft.com/download/symbols
windbg
windbg -y c:\symbols
lm 显示进程中已经加载的模块和符号。
lm v m kernel* 过滤带有kernel的模块。不能包含扩展名。
!lmi
!dh
.reload 抛弃所有已知加载模块的符号信息
.reload
.reload /f
.reload nt 内核态调试器选项,加载当前windows NT内核相对应的符号文件
.reload /user 内核态调试器选项
.reload
!sym noisy 启用详细日志
!chksym
x [options] module!symbols 查看符号信息,module和symbols都可以包含通配符。
x *!*some* 在调试目标的每个符号文件中查找包含字符串some的符号名。
x *!*NtOpenThreadToken*
x kernel32!g_*
x /v /t module!symbol 按照对象或函数所占的字节数以升序来列出符号的类型和大小。
ln命令将尽可能地给出与特定地址相关的符号。
.srcpath
.srcnoisy <1|0> 启用或者关闭“详细模式”,如果参数为1将打开模式,调试器将显示出在搜索源文件时所有需要查看的位置。
.lastevent 将显示导致调试器停止的最近调试事件。
version 获取操作系统和调试器版本信息。
r 命令可以显示寄存器和修改寄存器的值。
reax 显示eax寄存器的值。
r of 显示overflow。
reax=1 修改eax寄存器的值。
rm 命令显示当前的寄存器掩码或者根据调试需要对其进行修改。
rm ? 寄存器掩码各个位的含义是什么?
rm 0 将寄存器掩码设置为0 (不显示任何寄存器)
$ip 指令指针寄存器。
$ra 当前函数的返回地址。
$retreg 主要的值寄存器。
$csp 当前的栈指针。
$proc 当前进程。用户态的进程环境快。内核态的EPROCESS结构的地址。
$thread 当前线程。用户态的线程环境快。内核态的ETHREAD结构的地址。
$tpid 当前进程的标识。
$tid 当前线程的标识。
r $ip 为查看方式。
u . 表示反汇编。
uf . 反汇编包含当前$ip整个函数。
ub . 反汇编当前$ip之前的8条指令。
k 显示栈回溯
.kframes n 显示栈帧的数量。
kP 5 显示在调用栈中前五个函数以及它们的参数。
kb 在栈上传递给函数的前3个参数。
dc esp 显示对应的栈信息
~0 bp 02sample!KBTest::Fibonacci_stdcall "resp" 只在线程0上设置断点,并且在触发断点时将执行"resp"命令
bl 列出所有的断点
g 继续执行
bc * 清除所有的断点
bp 02sample!KBTest::Fibonacci_stdcall "resp;g" 在所有线程上设置一个断点,并且触发断点时执行"resp;g"命令
在ntdll!RtlAllocateHeap上设置断点,那么在每次执行内存分配操作时都会发生中断。
bp ntdll!RtlAllocateHeap
在当前进程设置断点。
bp /p @$proc ntdll!RtlAllocateHeap "!process -1 0;g"
bp 02sample!wmain 到wmain函数处设置一个断点
bm 02sample!*kbtest* 在所有与这个符号模式匹配的地址上都将设置一个断点。
bu 可以用来设置一个延迟断点,只有当这个断点所在的模块被加载时,延迟断点才能成为一个真正的断点。
bu ole32!CoInitializeEx
dv 不带参数的dv命令将显示局部变量的值
dv 02sample!gGlo* dv命令可以显示匹配特定模式的变量的值。
dv /V 将显示变量的存储位置
dv /i 将在第2列显示符号类型和参数类型
dt this dt命令在显示内存块时将解析this对象的类型
dt KBTest
d[type] [AddressRange] 显示存储在地址中的数据。
dv /V argv 获得argv参数的地址。
dc
db
l4 将4个字节转储为一个字节数组。dds 将每4个字节视作为一个符号。
dqs 将每8个字节视作为一个符号。
dps 将根据当前处理器架构来选择最合适的长度。
dpu
s 可以用来在调试目标的内存中找出已知的值。
s -d 0 L10000000/4 C0000005
ba 表示内存访问断点。内存访问断点所监控的地址必须与断点所监控的数据大小保持对齐。
dt gGlobal 获得需要监测的变量的地址
设置一个断点,当m_ref内存地址被修改时将触发这个断点,处理器将监测在4个字节上的写入操作。
ba w4 gGlobal+0
!address
将显示对应地址的输出信息。!peb 将显示进程环境块的信息。
!teb 将显示线程环境块的信息。
!teb 显示当前线程信息
!teb
!gle 当系统函数发生错误后,可以通过扩展命令!gle来查看错误码。
l+t 打开源代码模式的调试,只有当模块中包含私有符号时。
l-t 关闭源代码模式的调试
t 会执行一行代码(源代码或者汇编代码),如果遇到函数,会进入函数。
p 将整个函数视为一句来执行。
pc 显示当前调用的函数。
g 用来释放调试目标。
g
wt -l1 将替换p 用来执行一个函数,并且显示函数调用信息。
~
~~[threadIdentifier]
ed 改变变量的值。
ed n 3 将变量的名字作为地址来修改变量的值。
ed @ebp+0x08 5 通过变量的存储地址来修改变量的值。
ed kernel32!g_dwLastErrorToBreakOn 5 修改一个双字全局变量
eb .-6 90 90 90 90 90 90 将即将要执行的6个字节替换为90
!error可以用来找出与错误相关的信息
!dreg 可以用于查看被调试机器上的注册表内容。
!dreg Software \Microsoft\Windows NT\CurrentVersi
设置JIT调试
windows操作系统有一个默认调试器设置,使程序出现崩溃时,自动调用这个调试器进行调试。这个设置在windows的注册表中,
对于32位操作系统:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger,
对于64位操作系统:HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger。
在这个注册表键中,有两个重要的值:
1、auto值 (0或者1)0表示出现崩溃弹出对话框,让用户选择调试器 1表示自动弹出默认的调试器。
2、Debugger值,对于windows自带的Dr.Watson该值为“ DRWTSN32 -p %ld -e %ld -g”,
对于 WinDBG该值为“WinDbg的安装目录\windbg.exe" -p %ld -e %ld -g”对于Visual Studio该值为"C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld"
示例1:
s -u 10000 L8000000 "当年在交大"
dU 001b5942 L1000
eb 001b5942-8 ff fe
.writemem c:\gedu\blog.txt 001b5942-8 L1458
实例4:
WinDbg -I 设置JIT调试器模式。
kn 100 显示最多100个栈帧
lm vm urlmon 显示模块urlmon的详细信息
.frame /c c 切换到序号为 c 的栈帧
kv 1 显示包含参数的栈帧
dt _GUID 01f1b434 用对应类型查看对应地址的参数
lm vm wc98pp 查看模块wc98pp的详细信息
堆操作:
!heap -h 列出所有的堆
!heap
!heap -s 列出所有堆。
!heap -a
用应用程序验证器添加页堆。
dt _DPH_BLOCK_INFORMATION
.dump -ma 文件名(可以加路径) ---用windbg写dmp文件
!analyze -v
adplus -hang -pn <进程名> -o c:\dumps ---通过进程名抓取一个进程的dmp文件
adplus -hang -p <进程ID> -o c:\dumps ---通过进程ID抓取一个进程的dmp文件
adplus -crash -pn <进程名> -fullonfirst -o c:\dumps
adplus -crash -p <进程ID> -fullonfirst -o c:\dumps
---该命令会通过监视进程运行,在当第一次出现异常时记录一次完整的dump
adplus -crash -pn <进程名> -o c:\dumps
该命令也是在进程崩溃时记录dump,但这是一个mini dump
Windbg.exe -I ---将Windbg设置为默认的调试器