Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315295
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2010-06-06 11:35:09

windbg命令众多, 之所以要说ds命令, 是因为它的名字有严重的误导人弟的倾向, 我在这个问题上已经磕了几个小时了.

首先, windbg的命令继承了DOS下debug的遗风, db, dw, dd, f, e 等都跟DOS下debug命令一样, 今天调试一个程序时, 想当然地用了 ds 在一个char * 变量上, 该变量是一个合法的内存地址, ds 命令是有的, 而且, 即使看了windbg的文档, 我也觉得它应该是用来显示字符串的.

至于区分大小写的dS用来处理unicode, 可以认为它跟ds 类似, 只是把单字节的ASCII字符按多字节的unicode处理而已.

文档上这样说:


没有更多的东西了, 我忽略了"These commands do not display null-delimited character strings"这句警告. 也没想到"ANSI_STRING", "STRING"不是泛指而一个数据结构的名字.

发现ds对一个 char *地址的输出结构不对之后, 从文档中找不出更多的内容, 在网上查找, 奈何绝大多数都是对windbg的文档copy&paste.

再仔细看了windbg文档, 怀疑它强调并非 null-terminated的字符串原因是不是把前4个字节看作字符串长度, 也就是COM/VB中的那种字符串格式, 前4个字节为长度, 后面则为真正的字符串缓冲区, 在windbg中通过e命令来改变内存数据, 验证这一猜想, 不想还是不对.

考虑到文档中的说法, 又怀疑是C++中的string, wstring两种数据结构, 毕竟C++的string从技术角度是可以用来管理包含了NUL的任意内容的, 验之仍不中.

搜索windbg ds ansi_string what
最终把我引向 ansi_string 的解释, 在MSDN中是这样定义的:

ANSI_STRING

The ANSI_STRING structure defines a counted string used for ANSI strings.

typedef struct _STRING {
  USHORT  ;
  USHORT  ;
  PCHAR  ;
} ANSI_STRING, *PANSI_STRING;

 
还有一个 STRING的结构, 其定义与此相同. 原来这个ds命令是专门用来显示这样的数据结构的. 再用e命令生造出这么一个数据结构, 验证之以ds, 可以了. 而且ds命令虽然声称不是处理nul 结尾的字符串, 但在实际碰到NUL 字符时也会停止显示, 即使Length中指定了更大的长度.


不理解为什么这么一个在我看来并不那么广为人知的数据结构, 要在windbg中为它专供一个命令来显示.

附带一说, 查看某类数据结构的变量, 最好用dv, dt 两个命令. 而不是ds, 真要用d*命令, da (ASCII)是用来查看ASCII字符串的.
阅读(4168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~