WinDbg 学习笔记

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> * 穿件新的调试目标

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值