我有一个转储文件,我试图从中提取一个很长的字符串。我找到了线程,然后找到变量并使用以下步骤转储它的一部分:
~1s
dv /v
,返回:
00000000`07a4f6e8 basicString = class _bstr_t
dt -n basicString
命令3将调试控制台中的字符串截断为实际内容的一小部分。
我想要做的是找到_bstr_t变量的实际长度,以便我可以使用如下命令将其内容转储到文件中:
.writemem c:\debugging\output\string.txt 07a4f6e8 L<StringByteLength>
所以我的问题是如何确定我应该为StringByteLength添加什么?
答案 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)