windbg dump分析入门

1.符号路径基本语法:

SRV* 【cache】*toppath

例如:Microsoft公有符号存储地址:http://msdl.microsoft.com/download/symbols

设置符号路径就是:SRV*c:\mysymbols*http://msdl.microsoft.com/download/symbols

c:\mysymbols作为符号缓存以加快符号的访问速度


2.查看已加载的模块和符号文件基本语法:

lm [option] [-a Address] [-m Pattern] [-M Pattern]


3.重新加载符号基本语法:

.reload  抛弃所有已加载的符号信息,任何解析符号的动作将从硬盘上重新加载符号文件

.reload <module>抛弃module的符号信息,任何解析符号的动作将从硬盘上重新加载符号文件

.reload /f <module> 强制调试器立刻加载并且解析与模块module相关的符号文件

.reload nt  加载与当前windows NT内核相对应的符号文件

.reload /user 当前活跃的进程加载所有的用户态符号

.reload <module>=start, size通过指定起始地址来强制加载符号

eg:

0:000> .reload /f WS2_32.dll


4.验证符号基本语法:

!chksym Address

eg:(参考71a20000 71a37000   WS2_32 )

:000> !chksym 71a20011


5.使用符号基本语法:

x [option] module!symbols

例如:

*为通配符,在调试陌生代码时很有用

x *!*some*

x module!*


6. 查看目标系统

vertarget 是version命令的一个功能子集

vertarget显示调试目标所在的操作系统版本

version则会显示调试环境的其它信息


7. 查看寄存器值

r :查看所有寄存器,如果要在表达式中使用寄存器的值,在寄存器名前加@符号(比如@eax

reax:查看eax寄存器


8.处理器当前执行代码

u .  当前eip指向地址上8条指令

uf  .  当前eip指向地址整个函数

ub . 当前eip指向地址之前8条指令

u .L2之后2条指令

ub .L2之前2条指令

9. 查看当前调用栈

k 显示调用栈

kP 5 显示在调用栈中前五个函数以及它们的参数

kb 5 显示在调用栈中五个函数的前三个参数

kf 5 显示在调用栈中五个函数所使用的栈大小


10. 在代码中设置断点

bl:列出所有断点

bc * : 清除所有断点

bp module!myclass:memfun:设置断点

    

bp+address/符号地址       在address指令处加断点,但是这个地址所在的模块必须已经被加载

bu+address/符号地址        在address指令处加断点,但是这个地址所在的模块可以没有被加载,即延迟加载的模块。

ba: 内存访问断点,当访问这个内存地址时(一般是数据),程序会断住。

bl: 列出所有已经加载的断点和地址

bc: 清理断点。 bc *,清理所有的断点。 bc 1,清理1号断点。

bd: 使一个断点无效。

be: 使一个断点有效,与bd左右相反。


反汇编:

ub address/符号 反汇编这个地址之前的语句

u address/符号 反汇编这个地址之后(包括这条语句)的语句

uf address/符号 反汇编整个函数


查看内容:

dd + address: 将内存地址中内容以四字节为单位显示出来

da : 将内存中内容,以ascii码的形式显示出来,主要用于观察字符串

du : 将内存中内容以unicode码形式显示出来,也用于显示字符串

dv: 不用加内存地址,显示当前栈上面的所有的变量

dt+ 格式 + (address): 把内存地址所在的内容,以制定的格式显示出来,这个格式一般是结构体等。

dds: 把制定地址开始的内容,列出来,如果能对应到代码符号,将符号显示出来。



11. 查看变量的值

dv显示局部变量的值

dv /i显示值以及存储位置


dt this 已知符号this指针

dt KBTest 0x1111111 :解析地址0x1111111,类型为KBTest 变量值


12. 查看内存命令

d[type] [AddressRange]


13 综合分析一个dump文件:

!analyze -v   :列出堆栈
~0s; .ecxr ; kb :列出寄存器cxr 和调用堆栈
kn:给栈列出序号
快捷键alt+3: 打开locals窗口
.frame 05:列出当前栈结构内容

~*kb会显示所有线程的调用堆栈。如果堆栈太长,Windbg只会显示堆栈的一部分。

dt xxx - 显示出诸如PEB等的数据结构


.lastevent
!analyze
 –v

以上兩行指令都可以顯示 exception 發生時的 exception record 和 stack trace of the function。你也可以使用 .exr, .cxr 和 .ecxr 指令來顯示 exception 和 context records。

14.窗口分析

spy++http://jingyan.baidu.com/article/3a2f7c2e76584a26aed61174.html


15 当EBP和ESP的值已经不可信时,此时无法使用k系列命令来查看栈回溯,应该通过配合使用“!teb”(得到栈的内存位置)和“dds <AddressScope>”(显示和分析栈内存)来手动分析栈回溯(通过排除不是函数的字符串行)。


16WinDbg提供dt命令来显示符号类型信息(Dump symbolic Type information),有以下三种用法:

(1)“dt [ModuleName]!TypeName”,若省略模块名,则自动查找所有已加载的模块,如“dt ntdll!*”显示ntdll里的所有类型信息。其中,-b开关指定递归的显示所有子类型的信息。-r加数字指定递归显示的深度,如-r0表示不显示子类型信息。若不想显示全部字段,可以使用开关-ny附加字段过滤搜索信息,如“dt _TEB -ny LastError”。

(2)第二种用法是在上一种用法之后加上内存地址,按照指定的内存地址的内容来显示具体类型的变量。

(3)第三种用法是显示类型的实例,如全局变量、静态变量和函数。同样可以枚举函数符号,此时同x命令的功能相似,如“dt dbgee!*wmain*”,若是指定的函数,则会显示该函数的参数取值和返回值类型。


17 可以使用如下方法搜索内存内容:

(1)“s-[[Flags]]sa|su Range”用来搜索ASCII(UNICODE)字符串,可以用l加整数指定字符串的长度。例如“s-[l5] sa (注意这里sa之前不能有空格)0X600000 0X800000”。

(2)“s-[[Flags]]v Range Object”,在指定内存地址范围内与指定对象相同类型的对象。

(3)“s [-[[Flags]]Type] Range Pattern”,Type决定了匹配搜索内容的方式,可以为b、w、d、q、a、u,Pattern参数用来指定要搜索的内容,可以用空格分隔依次搜索的数值,如:

“s -w -0X400000 l2A000 41 64 76 44 62 67”,要搜索的内容也可以表示为ASCII码,如:“s -w 0X400000 l2A000 'A' 'd' 'v' 'D' 'b' 'g'”

(其中l后面跟数字表示在起始地址之后多少范围内进行搜索)

54、修改内存:

(1)以字符串方式编辑:“e{a|u|za|zu} Address "String"”

其中,za|zu代表以0结尾的ASCII(UNICODE)字符串。

(2)以数值方式编辑:“e{b|w|d|D|f|p|q} Address Value”,其中,Value参数决定用户需要修改多少数值。若不键入Value,则会进入交互式的修改内存界面。

是否显示所有的信息都是正确的?

windbg dump分析入门_第1张图片
这就是函数,感叹号前是所属模块(dll or exe),感叹号后是函数名+偏移地址。
函数参数是不能直接显示的,就是显示出来也不一定对,因为windbg只是依赖寄存器ebp+xx来猜你的函数参数,
而这个推导过程是否正确取决于你的编译选项,是否选中了帧指针优化等等因素,因为有可能函数参数只是存在了某个寄存器里而已。

命令

操作

.hh

调出帮助文件

!help

显示部分命令

!help <command>

显示某命令的详细信息

 

 

lm

显示进程中加载的模块信息

lmvm

可以查看任意一个DLL/EXE的详细信息

lml

查看模块的加载情况

ld

加载某块

 

 

!thread

查看所有线程

~ns

切换到第n号线程

!runaway

显示每一个线程所消耗CPU的时间

 

 

!sym noisy

开启WinDbg log日志,显示具体信息

!analyze -v

调用WinDbg智能解析,一般程序崩溃的情况下首选调用

!locks

查看锁,一般调试死锁的情况下使用

 

 

~*kb

显示所有调用堆栈

kb

显示当前调用堆栈

dv

显示局部变量

dt

显示数据结构

dd

察看堆内容

!address

显示某一地址上的页信息

u

显示汇编代码

uf

反汇编代码

.exr

打印出异常的信息

.cxr

切换上下文

 

 

x

查找某一符号的地址

dds

把某一地址对应到符号(于x的用法相反)


参考自:

http://blog.csdn.net/chollima/article/details/7704249

http://cuijingbing.blog.163.com/blog/static/46825825201187105423613/

http://blog.csdn.net/agan4014/article/details/2180699



你可能感兴趣的:(windbg dump分析入门)