虽然在外面很简单,但是它std::string是一种令人惊讶的复杂类型,WinDbg只是没有智能以更人性化的格式显示它.
将它悬停在WinDbg上会显示如下内容:
而且,这根本没有用.
幸运的是,数据存在,我们只需要挖掘它.在我们的例子中,它string的值隐藏在_Bx成员中.我们可以通过运行来实现它dt -r3 myString.这将以递归方式打印myString控制台的成员(最多3个级别).
0:000> dt -r3 myString
Local var @ 0x23fd90 Type std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+0x000 _Myproxy : 0x00445638 std::_Container_proxy
+0x000 _Mycont : 0x0023fd90 std::_Container_base12
+0x000 _Myproxy : 0x00445638 std::_Container_proxy
+0x000 _Mycont : 0x0023fd90 std::_Container_base12
+0x004 _Myfirstiter : (null)
+0x004 _Myfirstiter : (null)
+0x004 _Bx : std::_String_val<std::_Simple_types<char> >::_Bxty
+0x000 _Buf : [16] "test1234"
+0x000 _Ptr : 0x74736574 "--- memory read error at address 0x74736574 ---"
+0x000 _Alias : [16] "test1234"
+0x014 _Mysize : 8
+0x018 _Myres : 0xf
=00a00000 npos : 0x905a4d
Run Code Online (Sandbox Code Playgroud)
它需要一些工作,但我们到了那里.
要注意的一些事项:
_Bx联合中,作为实现小字符串优化(SSO)的一种方法.当字符串足够短时,它将被存储_Bx._Buf,否则,它将被分配在免费存储区中,并且存储在其中的指针_Bx._Ptr.如果您看到其中一个中的垃圾数据看起来像是垃圾数据,那么请不要感到震惊,而另一个中的有效数据.std::string.| 归档时间: |
|
| 查看次数: |
501 次 |
| 最近记录: |