【问题标题】:How can I find the length of a _bstr_t object using windbg on a user-mode memory dump file?如何在用户模式内存转储文件上使用 windbg 找到 _bstr_t 对象的长度?
【发布时间】:2014-10-16 19:07:11
【问题描述】:

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

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

    00000000`07a4f6e8 basicString = class _bstr_t

  3. dt -n basicString

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

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

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

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

【问题讨论】:

  • BSTR 的长度(以字节为单位)存储在第一个字符之前的四个字节中,位于实际 BSTR 指针指向的偏移量 -4 处。
  • 如果遇到范围错误,请使用L?&lt;StringByteLength&gt;

标签: visual-c++ windbg


【解决方案1】:

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

首先,您需要字符串在内存中的正确地址。 07a4f6e8 是 _bstr_t 的地址,所以在那个地址写内存不会有任何好处。

_bstr_t 是一个相当复杂的类型,但最终它拥有一个名为m_wstrBSTR 成员。

我们可以像这样将它的地址存储在一个寄存器中:

r? @$t0 = @@c++(basicString.m_Data->m_wstr)

正如Igor Tandetnik 的评论所说,BSTR 的长度可以在它前面的 4 个字节中找到。

让我们也将它放入一个寄存器中:

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

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

.writemem c:\debugging\output\string.txt @$t0 L?@$t1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多