Windbg学习 (0x0002) 命令基础
命令分为三种:基本命令,元命令,扩展命令,其中基本命令和元命令都是内建在Windbg中的,扩展命令通过加载扩展模块提供的
基本命令:
包括但不限于以下:
- 调试器控制:g(go) t(trace) p(step over)
- 寄存器修改/查看:r
- 内存查看 修改 搜索:d e(edit) s(search)
- 栈观察:k
- 断点控制:BP BA BL BC BD BE
- 线程控制(查看切换线程):~
- 进程控制(查看进程): |
- 汇编(a)、反汇编(u)
- 执行命令文件:$
- 设置调试时间 sx
- 查找符号(x) 搜索符号(ln) 显示模块列表(lm)
- 退出调试: q
元命令:
元命令以点号 :"." 开始,提供以下功能
- 调试器和调试会话设置的显示与设置
- 控制调试目标、调试会话或者调试器 .sleep .restart .create .attach
- 控制模块 .load .unload .unloadall .chain(查看加载的模块列表)
- 远程调试 .remote(链接到远程调试服务器) .server(启动远程调试服务器)
- 日志
- 内建的命令程序关键字 .if .else 等
扩展命令:
以 叹号:"!"开始,提供扩展功能,通过动态加载(.load)扩展模块(例如 sos.dll)实现。
扩展模块所在目录:
主要的扩展模块及其应用
除了Windbg会根据当前的Workspace的需要加载必要的扩展模块外,可以通过以下方式手动加载扩展模块:
命令输入
- 注释 * 或者 $$ ;($$开始注释 ;结束注释)
- ; 分割多个命令
- 回车执行上一条命令
- 上下箭头 浏览执行过的命令
命令别名
.echo 显示别名内容
Wingbd自动别名
使用 $别名
用户别名
使用 : ${别名}
- 定义 : as v version
- 使用 ${别名} 例如 ${v} 相当于调用 version
显示别名内容 .echo ${v}
*最好使用这种形式 :${别名} 明确指明这是个别名 并且最好加大括号 区分与其他命令连接时候的分界
固定别名:
使用 : $别名 ($u0- $u9)
- 定义 :r $u0 = version
- 使用 :$u0 相当于调用 version $u0 不需要使用加大括号的形式 例如 ${u0}
伪寄存器
可以像使用别名一样使用伪寄存器
TIPS 推荐再使用伪寄存器前加一个@,例如 @$ptrsize
流程控制 (循环 条件)
z
r ecx=2;*设定 ecx
r ecx=ecx-1; r ecx ; z(ecx); r ecx =ecx+1;
r ecx=ecx-1$$减一; r ecx $$显示; z(ecx)$$检查 如果为 true 执行前面的语句 否则 执行后面的语句; r ecx =ecx+1;
j
j 'expression' 'command 1','command2'
.if .else .elseif
进程线程限定符
日志
.logopen .logclose .logfile