跳转至

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/

调试基础

  1. 设置符号路径

    _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
    

    Snipaste_2023-01-09_11-01-35.png

  2. 设置源码路径 ​image_20230109105522.png

常用命令

流程控制

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  # 查看某模块的环境信息

本文总阅读量
回到页面顶部