如何在用户模式内存转储文件中使用windbg查找_bstr_t对象的长度?

时间:2014-10-16 19:07:11

标签: visual-c++ windbg

我有一个转储文件,我试图从中提取一个很长的字符串。我找到了线程,然后找到变量并使用以下步骤转储它的一部分:

  1. ~1s
  2. dv /v,返回:

    00000000`07a4f6e8 basicString = class _bstr_t

  3. dt -n basicString
  4. 命令3将调试控制台中的字符串截断为实际内容的一小部分。

    我想要做的是找到_bstr_t变量的实际长度,以便我可以使用如下命令将其内容转储到文件中:

    .writemem c:\debugging\output\string.txt 07a4f6e8 L<StringByteLength>
    

    所以我的问题是如何确定我应该为StringByteLength添加什么?

1 个答案:

答案 0 :(得分:2)

您的.writemem行非常接近您的需求。

首先,您需要在内存中找到正确的字符串地址。 07a4f6e8是_bstr_t的地址,因此在该地址写入内存不会有任何好处。

_bstr_t是一个相当复杂的类型,但最终它拥有一个名为BSTR的{​​{1}}成员。

我们可以将其地址存储在如下的寄存器中:

m_wstr

正如Igor Tandetnik的评论所说,r? @$t0 = @@c++(basicString.m_Data->m_wstr) 的长度可以在它前面的4个字节中找到。

让我们把它放到一个寄存器中:

BSTR

现在,您可以使用这些寄存器来编写。

r? @$t1 = *(DWORD*)(((BYTE*)@$t0)-4)