windows下有很多调试工具的,但是比较强大的调试工具是 windbg 既能调试用户态又能调试 内核态。本人是初学者,也是在学习中,希望大家能一起学习。。
一. 加载符号
1.设置符号路径
.sympath E:\symbols
.symfix c:\symbols 将符号路径修改为Microsoft公有符号库存储库, 结果是将符号路径设置为SRV* downstream folder*http://msdl.microsoft.com/dowmload/symbols
还可以在 File/Symbol file path 里面设置
2.加载符号
显示符号信息
lm l 显示已加载符号的模块
lm vm 模块名字 显示模块版本信息等
! lmi ntdll.dll 显示ntdll.dll 模块的头部信息
.reload 是抛弃已加载的符号信息,重新加载
!sym noisy
如果.relaod 没有成功,用!sym noisy 打开.reload 的命令详细日志 在重新加载
.reload /f 模块名
检查模块是否加载成功
在 !lmi 命令下会有checksum 数值
!chksym 数值 看是不是那个模块的符号加载上了
3.使用符号
x 使用通配符 查找 x *!*singe*查找每个符号文件中包含的字符串 some的符号名
x /v /t 模块名!*
显示所有函数和对象所占字节数按升序排列出符号的类型和大小
ln address 显示address附近的相对应的符号
4.加载源文件
.srcpath cpp路径 逐行调试代码,这样就和vs一样了,在local里面可以查看变量的值
.srcpath c:\ : d:\ 可以有多个路径 查找到对应的.cpp文件
还可以在file/sorce file path 里面设置路径
.srcnoisy 查看状体
.srcnoisy 1 开始 这样会显示丰富的源码信息
.srcnoisy 0 关闭
5.判断程序停下来的原因
.lastevent
1.由于有断点
2.内存越界
version 命令 是打印系统版本及调试器 的版本号
r是寄存器 reax 查看eax寄存器的值
二。断点设置
bp
查看所有断点 bl
bp ntdll!RtlAllocateHeap 每次执行到这个函数都会停下来
bp /p @$pro ntdll!RtAllocateHeap "lprocess -l0:g "
bu 可以设置延迟断点
dv 是显示局部变量的值
dt 结构体 显示结构体信息
eg: dt this 就会显示这个this里面的信息