windbg常用命令总结

来源:互联网 发布:双色球随机选号软件 编辑:程序博客网 时间:2024/06/05 20:03


   命令                           解析
!process 0 0                显示所有进程
!dt _EPROCESS 地址          所有进程的EPROCESS信息
!process 地址               显示进程的关键信息
!token                      查看访问令牌的有关信息
!handle                     显示内核对象句柄表信息

cdb调试器通过 q 或者 qd 退出调试会话。
kd内核态调试器通过 ctrl+B 退出调试会话。

.sympath 设置符号路径
.sympath <new path> 修改现有符号路径
.sympath+ <new path> 添加新的符号路径

.sympath cache*c:\symbols;SRV*http://msdl.microsoft.com/download/symbols;D:\windbg
.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

.symfix <downstream folder>  将符号路径修改为microsoft公有符号存储库
等同于 .sympath SRV*downstream folder*http://msdl.microsoft.com/download/symbols

set _NT_SYMBOL_PATH=C:\symbols
windbg <image.exe>

set _NT_SYMBOL_PATH=CACHE*C:\Symbols;SRV*http://www.advancedwindowsdebugging.com/symbols/symstore.pri;SRV*http://msdl.microsoft.com/download/symbols 
windbg <image.exe>

windbg -y c:\symbols <image.exe>

lm 显示进程中已经加载的模块和符号。
lm v m kernel* 过滤带有kernel的模块。不能包含扩展名。

!lmi <module> 输出完整的调试目录信息
!dh <module address> 进一步查看模块头信息

.reload 抛弃所有已知加载模块的符号信息
.reload <module> 抛弃模块module的符号信息
.reload /f <module> 强制调试器立刻加载并且解析与模块module相关的符号文件
.reload nt 内核态调试器选项,加载当前windows NT内核相对应的符号文件
.reload /user 内核态调试器选项
.reload <module>=start,size

!sym noisy 启用详细日志

!chksym <module> 验证符号文件相对于映像文件的有效性

x [options] module!symbols 查看符号信息,module和symbols都可以包含通配符。
x *!*some* 在调试目标的每个符号文件中查找包含字符串some的符号名。
x *!*NtOpenThreadToken*
x kernel32!g_*
x /v /t module!symbol 按照对象或函数所占的字节数以升序来列出符号的类型和大小。

ln命令将尽可能地给出与特定地址相关的符号。

.srcpath <sourcepath> 设置源文件的路径,如果是在编译源代码的机器上面调试,则不需要设置源码代码路径,因为符号文件里面包含了源代码的路径信息。
.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 <address> dt命令在显示内存块时使用了传递进来的数据类型
dt 02sample!gGlobal dt命令在显示内存块时将解析对象的类型

d[type] [AddressRange] 显示存储在地址中的数据。
dv /V argv 获得argv参数的地址。
dc <address> l4 转储出argv地址上的4个双字数据。
dd <address> l4
du <address> 转储出Unicode字符串
da <address> 将Unicode字符串转储成ASCII字符串。

db <address> l4 将4个字节转储为一个字节数组。
dyb <address> l4 以二进制格式转储4个字节。
dyd <address> l4 以二进制格式转储4个双字
df  <address> l4 转储出4个浮点数
dw  <address> l4 转储出4个字
dc 0 l4 转储一个无效内存地址

dds 将每4个字节视作为一个符号。
dqs 将每8个字节视作为一个符号。
dps 将根据当前处理器架构来选择最合适的长度。
dpu <address> L4 转储出一个

s 可以用来在调试目标的内存中找出已知的值。
s -d 0 L10000000/4 C0000005

ba 表示内存访问断点。内存访问断点所监控的地址必须与断点所监控的数据大小保持对齐。
dt gGlobal 获得需要监测的变量的地址
设置一个断点,当m_ref内存地址被修改时将触发这个断点,处理器将监测在4个字节上的写入操作。
ba w4 gGlobal+0

!address <address> 将显示对应地址的输出信息。
!address 将显示整个进程的大概内存情况。
!address .  显示当前地址的信息。
!address @esp 显示栈地址的信息。

!peb 将显示进程环境块的信息。
!teb 将显示线程环境块的信息。
!teb 显示当前线程信息
!teb <address> 显示对应地址线程信息

!gle 当系统函数发生错误后,可以通过扩展命令!gle来查看错误码。

l+t 打开源代码模式的调试,只有当模块中包含私有符号时。
l-t 关闭源代码模式的调试

t 会执行一行代码(源代码或者汇编代码),如果遇到函数,会进入函数。
p 将整个函数视为一句来执行。
pc 显示当前调用的函数。

g 用来释放调试目标。
g <address> 将调试目标执行到指定的地址address.
gu 使调试目标执行完当前函数并且返回到调用者。
~0 gu 执行到从当前函数中返回,除了线程0外,冻结其他所有的线程。

wt -l1 将替换p 用来执行一个函数,并且显示函数调用信息。
~<thread index>s 命令来激活线程。
~~[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 <address> -v 显示对应堆的详细信息

!heap -s 列出所有堆。
!heap -a <address> 列出对应堆得详细信息

用应用程序验证器添加页堆。
dt _DPH_BLOCK_INFORMATION <address>-0x20 显示页堆的插入信息。
dds <address>  显示页堆里面对应的堆栈回溯。

.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设置为默认的调试器

原创粉丝点击