WinDBG 用法详解(13)-内存分析

      内存是软件工作的舞台,程序的代码必须先加载到内存中才可以被CPU 所执行,程序的数据(变量)也主要是分配在内存中的(极少数变量分配在寄存器中)。除了外界因素外,程序的行为就是由它的代码和数据所决定的,程序的内存状态,决定了它的外在行为。很多时候,软件调试的目标就是为了搞清楚某个行为的内在根源,即所谓的根本原因(Root Cause)。观察和分析内存是寻找根本原因的最有效方式之一。
      内存空间是通过地址来标识和引用的。内存地址有多种,常用的有物理内存地址和虚拟内存地址。本节中的内存地址除非特别说明外都是指虚拟内存地址。

 

13.1 显示内存区域

WinDBG 的d 系列命令用来显示指定内存区域的数据内容。这些命令的格式为:
d{a|b|c|d|D|f|p|q|u|w|W} [Options] [Range]
dy{b|d} [Options] [Range]
d [Options] [Range]

其中大括号中的字母(区分大小写)用来指定数据的显示方式,a 表示ASCII 码,b 表示字节和ASCII 码,c 表示DWORD 和ASCII 码,d 表示DWORD,D 表示双精度浮点数,f 表示单精度浮点数,p 表示按指针宽度显示,q 表示四字(8 字节),u 表示UNICODE 字符,w 表示字,W 表示字和ASCII 码,yb 表示二进制和字节,yd 表示二进制和双字。

Range 参数用来指定要显示的内存范围。可以有以下几种表示方法。
第一种方法是起始地址加空格加终止地址,比如dd 0012fd9c 0012fda8 命令以双字格式显示从0012fd9c 开始到0012fda8 结束的16 字节内存数据:
0:000> dd 0012fd9c 0012fda8
0012fd9c cccccccc cccccccc cccccccc cccccccc
第二种方法是起始地址加空格加L(或者l)和对象个数,比如上面的命令可以等价的写为:
dd 0012fd9c L4。
第三种方式是终止地址加空格加L(或者l)加负号和对象个数。使用这种方式可以把上面的命令写为:dd 0012fdac L-4。
注意理解上面的对象个数(L 后的数字),它是“数据单元”的个数,而不是字节数。对于dd 它的单位是DWORD,对于db,它的含义是4 个字节,例如:
0:000> db 0012fd9c l4
0012fd9c cc cc cc cc ....
如果省略数据显示格式而直接执行d 命令,那么它将采用最近使用过的数据显示格式。

 

13.2 显示字符串

可以以0 结尾的简单字符串,可以使用da 或者du 命令来显它的内容,前者用于使用单字节字符集的字符串,后者用于采用UNICODE 字符集的字符串。当遇到字符串末尾的0 时,会自动停止显示。例如:
0:000> du 003a2e9c

003a2e9c "C:/dig/dbg/author/code/chap28/db"
003a2edc "gee/Debug/dbgee.exe"
如果使用da 命令显示UNICODE 字符集的字符串,如果字符串的内容是英文字母,那么通常只能显示第一个字符:
0:000> da 003a2e9c
003a2e9c "C"
有些字符串是使用数据结构来表示的,常用的结构有UNICODE_STRING 结构和STRING 结构,它们的定义分别为:
0:000> dt _UNICODE_STRING
ntdll!_UNICODE_STRING
+0x000 Length : Uint2B
+0x002 MaximumLength : Uint2B
+0x004 Buffer : Ptr32 Uint2B
0:000> dt _STRING
ntdll!_STRING
+0x000 Length : Uint2B
+0x002 MaximumLength : Uint2B
+0x004 Buffer : Ptr32 Char
对于着两种结构的字符串,可以分别使用dS(S 大写)(UNICODE_STRING 结构)和ds 命令(STRING 结构)来显示。对于后者,也可以使用!str 扩张命令来显示。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值