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_STRINGThe 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字符串的.
阅读(4230) | 评论(0) | 转发(0) |