Windbg和cdb
简介¶
windbg默认是源码级调试,带界面,cdb默认是汇编级调试,仅支持命令行。
windbg还有个好处就是可以和visual studio一样使用F5
,F9
,F10
,F11
进行调试。
以下内容均参考自微软官网文档:https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-operation-win8
以下讨论的都是用户态程序的调试。
下载和安装¶
参考官网:https://learn.microsoft.com/en-gb/windows-hardware/drivers/debugger/
调试基础¶
-
设置符号路径
_NT_SYMBOL_PATH=C:\Symbols;srv*C:\Symbols*http://msdl.microsoft.com/download/symbols _NT_ALT_SYMBOL_PATH=cache*C:\Symbols _NT_SYMBOL_PROXY=127.0.0.1:8100
-
设置源码路径
常用命令¶
流程控制¶
windbgx -p pid # 附加到进程
g # 相当于F5,继续执行
gu # 执行到函数上层
p # 相当于F10,单步步进
pt # 执行到当前函数的return处
t # 相当于F11, 单步步入
tc # 跟踪到下一个调用
.restart # 重启
断点¶
# 下软件断点
bp main
bp user32!GetMessageBoxA
bp `test_demo.cpp:100`
bp Class::unction
# 列出断点
bl
# 删除断点
bc 断点编号
# 暂时禁用断点
bd 断点编号
# 启用断点
be 断点编号
# 设置条件断点
bp /w "MyVal > 20" `mysource.cpp:143`
bp /w "myVec.Count() == 4" `mysource.cpp:143`
读取和写入内存¶
# 常规读取内存
d* L长度
d、da、db、dc、dd、dD、df、dp、dq、du、dw
# 将某个变量或地址或函数反汇编
u xxx
# 显示数据类型信息
dt
dt -a 数组变量
dt -b 结构体变量
dt -h # 查看具体用法
# 显示局部变量
dv
dv -t # 显示局部变量的类型
# 显示c++表达式,在看结构体变量时非常方便
dx
dx -? # 查看具体用法
dx var ,x # 16进制的方式显示数据
dx var ,s8 # uf8格式查看字符串,相当有用
dx !var # 查看和地址混淆的变量
dx -g # 表格形式查看数据
# 比较内存,相同则没有输出,不同会显示地址信息
c 变量或地址 L长度 变量或地址
# 填充内存
f 变量或地址 L长度 值
# 移动内存,复制内存
m 变量或地址 L长度 源变量或地址
# 编辑内存
e*
其他¶
# 重复上条指令
ENTER
# 清屏
.cls
# 显示堆栈回溯
k
# 切换当前堆栈上下文
.frame 堆栈编号
# 计算c++表达式,结合dt使用比较方便
?? sizeof(var1)
?? data.t1
?? data.t1->t2
# 列出当前模块
lm
# 设置当前数字进制
n 8/10/16
# 查看寄存器
r
# 源代码相关
lsc # 列出当前源
ls # 显示当前源代码
l+,l- # 设置源选项
l+t,l+s,l+o # l+t: 源码级调试
l-t,l-s,l-o # l-t: 汇编级调试
# 查看进程环境信息
!peb
dt ntdll!_PEB # 查看某模块的环境信息
本文总阅读量 次