windbg学习笔记

写与2014年6月3日

Default Workspace 默认工作空间
implicit Workspace 隐含工作空间
Named Workspace 命名工作空间
explicit Workspace 显示工作空间
Base Workspace 基础工作空间
dormant 状态
Default Kernel-mode Workspace 默认内核态工作空间
Remote Default Workspace 默认远程调试工作空间
DbgSrv | KdSrv 调试服务器
Processor-specific Workspace 特定处理器工作空间
Default User-mode Workspace 默认用户态工作空间
----------------------------------------------------------------------------------------------------------------------------------*/
工作空间保存
/*----------------------------------------------------------------------------------------------------------------------------------


1.保存到注册表
HKEY_CURRENT_USER\Software\Microsoft\WinDBG\Workspaces 默认保存工作空间的注册表路径
User 用户态调试工作空间
Kernel 内核态调试工作空间
Dump 转储文件调试工作空间
Explicit 命名工作空间
2.Save Workspace as ... 另存当前工作空间
----------------------------------------------------------------------------------------------------------------------------------*/
加载工作空间
/*----------------------------------------------------------------------------------------------------------------------------------
Save Workspace to File 另存当前工作空间为*.WEW文件 (二进制与注册表数据一样)
1.启动WinDBG加-w开关,指定要使用的工作空间名
2.File菜单加载指定的命名工作空间
3.WinDBG子目录Themes,有4种定制工作空间设置
  将.reg文件导入注册表
  Open Workspace in File菜单打开*.WEW文件,可以应用对应主题
----------------------------------------------------------------------------------------------------------------------------------*/
删除工作空间
/*----------------------------------------------------------------------------------------------------------------------------------
注册表编辑器(regedit)
删除注册表中工作空间的键值
全部删除Workspaces子键全部键值
File菜单Delete Workspaces 删除工作空间
----------------------------------------------------------------------------------------------------------------------------------*/
WinDBG命令
/*----------------------------------------------------------------------------------------------------------------------------------
/*----------------------------------------------------------------------------------------------------------------------------------
标准命令
----------------------------------------------------------------------------------------------------------------------------------*/
g命令 恢复运行
t命令 (trace into)跟踪执行
p命令 (step over)单步执行
wt命令 追踪监视
r命令 观察和修改通用寄存器
rdmsr命令 读MSR寄存器
wrmsr命令 写MSR寄存器
rm命令 设置寄存器显示掩码
ib命令 读写IO端口
iw命令 读写IO端口
id命令 读写IO端口
ob命令 读写IO端口
ow命令 读写IO端口
od命令 读写IO端口
d命令 观察内存数据
e命令 编辑内存数据
s命令 搜索内存数据
k命令 观察栈回溯
bp命令 设置、维护内存断点
ba命令 硬件断点
bl命令 管理断点
bc 清除断点
bd 禁止断点
be 开启断点
~(取反)命令 显示和控制线程
|(或)命令 显示进程
?(问号)命令 评估表达式
??(双问号)命令 评估C++(加加)表达式
a命令 汇编
u命令 反汇编
dg命令 显示段选择子
$命令 执行命令文件
sx命令 设置调试事件处理方式
sq命令 启用、禁止静默模式
so命令 设置内核选项
ss命令 设置符号后缀
version命令 显示调试器和目标版本
vertarget命令 显示调试目标所在系统信息
x命令 检查符号
ls命令 控制盒显示源程序
ld命令 加载调试符号
ln命令 搜索相邻符号
lm命令 显示模块列表
q命令 结束调试会话
qq命令 结束远程调试
qd命令 结束调试会话并分离调试目标
?(问号) 命令 显示主要标准命令和每个命令简单介绍
----------------------------------------------------------------------------------------------------------------------------------*/
元命令 .(点)开始,又称Dot Command点命令
/*----------------------------------------------------------------------------------------------------------------------------------
.symopt 符号选项命令
.sympath .symfix 符号路径命令
.srcpath .srcnoise .srcfix 源程序文件命令
.extpath 扩展命令模块路径
.extmatch 匹配扩展命令
.exepath 执行文件命令
.asm 设置反汇编选项命令
.expr 控制表达式评估器命令
.restart 重新打开调试会话命令
.abandon 放弃用户态调试进程命令
.create 创建新进程命令
.attach 附加存在进程命令
.opendump 转存文件命令
.detach 分离调试目标命令
.unload .unloadall 卸载命令
.chain 显示已经加载模块
.logfile 显示调试器日志信息命令
.logopen 打开调试器日志信息命令
.logappend 追加调试器日志命令
.logclose 关闭调试器日志命令
.remote 启动remote.exe远程调试服务命令
.server 启动调试引擎服务器命令
.servers 列出可用服务器命令
.send_file 向远程服务器发送文件命令
.endpsrv 结束远程服务器命令
.endsrv 结束引擎服务器命令
.sleep 调试器睡眠命令
.wake 调试器唤醒命令
.dbgdbg 启动另一调试器调试当前调试器命令
.dump 产生转储文件命令
.writemem 原始内存数据写到文件命令
.time 显示调试会话时间命令
.ttime 显示线程时间命令
.tlist(task list) 显示任务列表命令
.formats 以不同格式显示数字命令
.help 列出所有元命令和每个元命令的简单说明
----------------------------------------------------------------------------------------------------------------------------------*/
Extension Command 扩展命令 
1.扩展命令,以叹号(!)开始,又称Band Command
2.扩展命令格式 ![扩展模块名].<扩展命令名>[参数]
3.实现对特定调试目标的调试功能,实现在动态加载的DLL模块中
4.WinDBG 包含了常用扩展命令模块,用户可以根据WinDBG的SDK自己编写扩展模块和扩展命令
/*----------------------------------------------------------------------------------------------------------------------------------
WINXP 调试目标位Windows XP或更高版本时的扩展命令模块
WINEXT 使用与所有Windows版本的扩展命令模块
 
 
----------------------------------------------------------------------------------------------------------------------------------*/
加载扩展模块
/*----------------------------------------------------------------------------------------------------------------------------------
1.调试目标被激活(Debuggee Activation)时,WinDBG会根据调试目标的类型和当前工作空间自动加载指定扩展模块
2.手动加载扩展模块
.load 命令加上扩展模块名或完整路径来加载扩展命令,无路径在扩展模块路径(EXTPATH)寻找文件
.loadby 命令加上扩展模块名称和一个已经加载的程序模块的名称
.loadby sos mscorwks 在mscorwks模块所在目录中加载SOS扩展模块
!扩展模块名.扩展命令名 指定模块没加在WinDBG会自动搜搜加载
.chain 列出当前加载所有模块
.unload 卸载指定模块
.unloadall 卸载所有模块
!ext.help 显示ext模块中所有扩展命令
----------------------------------------------------------------------------------------------------------------------------------*/
用户界面
窗口布局保存到工作空间中,下次打开工作空间,子窗口恢复到保存时状态
/*----------------------------------------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------------------------------------*/
命令窗口和命令提示符
1.命令提示符由文字、大于号、星号组成
----------------------------------------------------------------------------------------------------------------------------------
一.等待状态,尚未建立调试目标连接时,显示空白提示符
----------------------------------------------------------------------------------------------------------------------------------
二.命令模式等待用户输入命令时,提示符是 提示目标+大于号
4.WinDBG支持同时调试多系统多调试目标,因此
1.用户态目标,命令提示符完整格式:
[||system_index:]process_index:thread_index>
2.双击内核调试时内核目标和内核转储文件目标, 命令提示符完整格式:
[||system_index:][processor_index]kd>
3.本地内核调试,命令提示符完整格式:
[||system_index:][processor_index]lkd>
system_index系统序号,多个用户态目标属于一个系统,每个内核目标属于一个单独的系统
process_index进程序号
processor_index处理器序号
thread_index线程序号
序号从0开始全局编排,当调试目标既有内核目标又有用户态目标,处理器需奥和线程序号同等编排,每个内核目标也被分配一个进程序号。
/*----------------------------------------------------------------------------------------------------------------------------------
||<system_index> s 切换当前系统号
||0 s 把当前系统切换到1号
||1 s 把当前系统切换到0号
|<process_index> s 切换当前进程号,进程是全局排列的,所以可以直接切换到另一个系统的进程
|1 s
~<thread_index> s 切换当前线程号,不可以跨系统切换
~0 s 切换到0号线程
~1 s 切换到1号线程
----------------------------------------------------------------------------------------------------------------------------------
三.BUSY提示符 *BUSY* 表示WinDBG处于执行任务未返回状态,用户无法输入命令
----------------------------------------------------------------------------------------------------------------------------------*/
四.命令提示符:No Target> 使用.abandon命令放弃所有调试目标后,
/*----------------------------------------------------------------------------------------------------------------------------------
五.命令提示符:Input> 表示调试目标遇到断言时,内核调试引擎通过WinDBG征求处理方式的状态,四中处理方式
b 中断到调试器
g 继续运行
p 终止进程
t 终止线程
----------------------------------------------------------------------------------------------------------------------------------*/
六.输入提示符 使用a命令、e命令编辑变量时没有指定变量值的时候
/*----------------------------------------------------------------------------------------------------------------------------------
输入和执行命令
----------------------------------------------------------------------------------------------------------------------------------*/
1.*BUSY*提示符状态下,一般不能输入命令,即使可以输入命令,命令也不会马上被执行
2.可以同一行输入输入多条命令,用 ; 分割
3.直接回车重复执行上一条命令
4.上下键浏览和选择以前输入过的命令
5.大多数命令不区分大小写,但有些命令的选项区分大小写
6.元命令以 . 开始,扩展命令以 ! 开始
7.ctrl+Pasue Break 终止长时间未完成的命令
  ctrl+c 终止DD或CDB执行的命令
8.Ctrl+Alt+V 切换启用或禁止(Verbose Output模式)详细输出模式
9.Ctrl+Alt+D 切换显示或禁止与内核调试引擎之间的数据通信
10.F1 打开帮助文档
11. .hh 空格 希望了解的命令 打开帮助文档并直接跳转到相关的主题,比如 .hh sleep
12. n命令 改变默认的数制,WinDBG默认使用十六进制数制,比如 n 8,n 16
13. 数字前加0x、0n、0y 显示指定十六进制、十进制、二进制的数字
14. 末尾加h 也可以用于显示十六进制数
15. 64位长的数字 31位前加 ` 
16. 64位长的数字 也可以什么也不加,比如FFFFFFFF`80000000
17. 选中数字 可以直接拖拽复制的文字到命令行输入窗口中
18. 选中WinDBG中的数字 可以直接拖拽复制的文字到各种文本编辑器重
/*----------------------------------------------------------------------------------------------------------------------------------
表达式
WinDBG支持宏汇编(MASM)和C++语法编写的表达式,但默认支持MASM表达式
1. .expr 查看和设置默认表达式语法
Current expression evaluator: MASM - Microsoft Assembler expressions
2. @@masm(...)或@@C++(...) 显示指定括号中表达式使用的语法规则
比如对于C++表达式:
0:001> ? @@C++(18<int>(0x7c9840cb))
Unexpected token '>(0x7c9840cb))'
??专用于评估C++表达式,所以可以也可以写成如下形式:
1:000> ?? @@C++(18<int>(0x7c9840cb))
Unexpected token '>(0x7c9840cb))'
----------------------------------------------------------------------------------------------------------------------------------
可以使用的MSAN表达式
加减乘除(+、-、*、/)
移位(<<、>>、>>>)
求余(%或mod)
比较(=或==,>、<、>=、<=、!=)
按位于(&或and)
按位异或(^或xor)
按位或(|或or)
正负号等运算符
hi或low 分别取32位的高16位或者低16位
by 从指定地址取一字节(BYTE)
wo 从指定地址取一个字(WORD)
dwo 从指定地址取一个双字(DWORD)
qwo 从指定地址取一个四字(QWORD)
poi 从指定地址取指针长度的数据
比如:poi(ebp+8) 返回栈指针+8处的DWORD值
----------------------------------------------------------------------------------------------------------------------------------*/
WinDBG还定义了类似函数的特殊表达式,都以$符号开头
1. $iment(Adress) 返回参数Adress代表模块的入口地址
2. $scmp("string1","string2")
比较两个字符串,类似strcmp函数
3. $sicmp("string1","string2")
比较两个字符串,忽略大小写,类似stricmp函数
4. $spat("string1","string2")
判断参数1指定的字符串,是否符合参数2的指定的模式,模式字符串中可以包含?、*、#等特殊呼号。
5. $vvalid(Address,Length) 
判断指定区域是不是有效的内存区,有效返回1,无效返回0
6. $funsucc(FunAdress,RetVal,Flag)
根据函数的返回值,评估函数执行是否成功
7. 在MSAM表达式中,使用如下格式指定源文件的行:
`[[Module!]Filename][:LineNumber]`
两端是重音符号,行号十进制,模块名和源文件名可以省略,省略WinDBG使用当前程序指针所对应的源文件。
比如:
bp `d4dtest!d4dtestdlg.cpp:196` 
在d4dtestdlg.cpp文件的196行设置一个断点
----------------------------------------------------------------------------------------------------------------------------------*/
在C++表达式中,可以使用C/C++语言定义的各种运算符
取地址(&)
引用指针(*)
索引结构中的字段( -> 或  . )
指定类名 ( :: )
类型转换  (dynamic_cast、static_cast、const_cast、reinterpret_cast)等各种运算符。
比如:
??&(this->m_Button1)
可以显示出m_Button1对象的所有成员
----------------------------------------------------------------------------------------------------------------------------------
在C++表达式中,还可以使用以下#号开始的宏
##CONTAINING_RECORD(Adress,Type,Field)
根据Field的地址(Adress),返回这个字段所属的Type结构的基地址
#FIELD_OFFSET(Adress,Type)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值