2013-04-16
!gle
!error
2013-03-26
查看类的成员变量的值,不能只输入“? <variable_name>”,这样会找不到该变量,还会导致windbg在所有模块中去查找该名字的符号
.dump [/ma] C:\dump\xxx.dmp * /m生成minidump, /ma生成尽可能多选项的dump
!analyze –v * 对于应用崩溃(包括应用程序和驱动)产生的dump,在加载完符号后,可以让WinDBG自动分析分析,执行命令!analyze -v即可
~*kb * 对于手工尝试的dump,一般current thread不是出问题的thread,所以要看所有的线程,执行命令,显示所以的线程的call stack。
.ecxr * 如果崩溃分析为当前线程,先用查看上下文,再执行kb查看当前崩溃代码行。
.cls * 清屏
Windbg的命令分为标准命令,原命令和扩展命令,输入问号(?)可以显示所有的标准命令的帮助信息; 元命令以一个点(.)开始,输入.help可以显示所有的原命令的帮助信息;扩展命令以叹号(!)开始。
崩溃分析: !analyze –v
查看死锁: !locks
查看当前进程所有线程:~, ~*(包含函数入口及和优先级)
查看当前活动线程: ~. ;所有线程堆栈: ~*kb,~~[0x]转换ID,~1s设置当前线程号
查看当前调用堆栈: kb,(k,kb,kp,kv,kn检查callstack)
查看异常记录上下文: .ecxr,.exr,.cxr(切换上下文)
查看当前线程: !thread
查看一个或多个临界区(critical section)或者整个临界区树: !cs,!cs address
仅显示锁定的临界区: !cs -l
转储DUMP: .dump [/ma] e:\\dcrash.dmp
设置断点(break point): bp,bc(清除),bd(禁用),be(启用)
查看内存: db/dw/dd/dq [Address] 字节/字/双字/四字方式查看数据
清屏: .cls
显示每个线程CPU的消耗时间: !runaway
加载不严格匹配的符号文件时,先用.reload /i,再进入!sym noisy开启吵杂模式。
Attach process后退出调试模式 q直接退出程序;qd退出调试,程序继续执行。
2013-03-19
s-b/w/d/q/a/u <address> L<search_length> <pattern> * 给定address,在search_length长度范围内,搜索pattern
e[a|u|za|zu] <address> <string_value> * 以字符串方式修改内存地址
e[b|d|D|f|p|q|w] <address> <value> * 以值方式修改内存地址!
!address <address> * 显示内存地址的属性
!vprot <address>
!vadumpx
2013-03-18
bp *
bu * 设置一个延时加载的命令
bm * 设置一批断点
ba r1 nRet * 对nRet变量的第一个字节进行读取或者写入时,触发硬件断点
bp `my.cpp:122` “.if (poi(MyVar) > 5) {.echo MyVar Too Big ;} .else {.echo MyVar Accetable; gc;} "
The gc command resumes execution from a conditional breakpoint in the same fashion that was used to hit the breakpoint (stepping, tracing, or freely executing).
by/wo/dwo/qwo/poi (<address>) * 取地址所在的1/2/4/8/指针长度个字节的值
~0 bp MSVCR110D!printf * 针对线程0设置断点
bc/bd/be 删除/禁止/启动 断点
kn * 显示栈帧序号
kv * 显示函数调用方式
kb * 显示函数前三个参数
kp * 显示函数参数值,有私有符号文件
dv /i /t /V * 显示当前栈帧局部变量的参数
dd <address> L4 * L4表示显示的元素个数
dt * 显示数据类型
dt string
dt –r1 string <address> * 在给定的地址数据以string类型显示出来
2013-03-15
!sym noisy/quiet * 显示/不显示加载符号的过程信息
.formats <some number> * 显示该数的各个进制的形式
pa|ta @$ra == gu
pc | tc * 单步执行到下一个函数调用指令
tb * 单步执行到下一分支,在x86只能内核态调试
ph|th == tb
wt * 对当前函数进行调用情况分析
pt | tt * 单步执行到下一个return
2013-03-14
ld <ModuleName> * load symbols for the specified module
lm v m note* * 显示以note开头的模块的详细信息
x /v /t dbgee!arg* * 显示dbgee模块中以arg开头的符号信息
.reload /i * 加载不严格匹配的符号文件
sx * 列出各个事件代码和目前设置的状态
LdrpInitialize函数是一个新进程的初始线程在用户态执行的最早代码
gn/gh * go with Exception not handled/go with Exception handled
p * Step
t * Trace
p|t 2 执行两次p或者t命令
2013-03-08
q * 退出调式
.detach * 分离调试器与被调试进程,被调试进程继续执行
.abandon * 抛弃调试器与被调试进程,被调试进程不会继续执行
<path_of_windbg> –p PID * 调试进程ID为PID的进程
<path_of_windbg> –pn <process_name> * 调试指定进程名的进程
.kill * 杀死被调试进程
.restart * 重新启动调试器
.frame * 查看当前线程栈帧
dv * Display Local Variables
~0 s * 切换到线程0
k * 显示当前Call Stack信息
2013-03-04
|| <system_index> s : 切换系统
| <process_index> s : 切换进程
~ <thread_index> s : 切换线程
? <expressions>: 表达式求值
? @@c++(<expressions>): c++表达式求值
? @@masm(<expressions>): masm表达式求值
srv*d:\v-yuzo\Projects\Small Projects\Debug\msftpdbs*http://msdl.microsoft.com/download/symbols
下载系统模块的pdb文件。
.reload: 重新加载模块
.restart
.restart /f: 重新启动
$$: 注释,可以用分号分隔
*: 注释,*号后面全部注释
? @$exentry: 显示当前模块的入口函数
? @$pagesize: 显示调式目标所在系统的内存页字节数
.echo $ntnsym * 显示WinDBG定义的别名
as v version * 定义用户别名
r $.u<0~9>=<别名实体> * 修改固定别名所代表的实体
!for_each_frame !for_each_local dt @#Local * 打印每个栈帧的每个局部变量
bp `my.cpp:122` “j (poi(MyVar) > 5) ‘.echo MyVar Too Big’ ; ‘.echo MyVar Accetable; gc’ "
r ecx; .if (ecx > 2) {r ecx} .else {r eax}
.opendump <file_path> * 打开dump文件
.create <file_path> * 穿件新的调试目标