【发布时间】:2015-08-12 00:41:16
【问题描述】:
使用 WinDbg 进行调试时,我看不到本地 std::string 变量的值。我可以看到布尔变量的值,但是当将鼠标悬停在字符串变量上或在本地窗口中查看时,我看到的只是变量的类型,而不是它的实际值。
如何查看本地 std::string 变量的值?
【问题讨论】:
使用 WinDbg 进行调试时,我看不到本地 std::string 变量的值。我可以看到布尔变量的值,但是当将鼠标悬停在字符串变量上或在本地窗口中查看时,我看到的只是变量的类型,而不是它的实际值。
如何查看本地 std::string 变量的值?
【问题讨论】:
尽管表面上很简单,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
我们花了一些功夫,但我们做到了。
注意事项:
_Bx 联合中,作为实现Small String Optimization (SSO) 的一种方式。当字符串足够短时,它将被存储在_Bx._Buf 中,否则,它将被分配到空闲存储中,并且指向它的指针存储在_Bx._Ptr 中。如果您在其中一个中看到看起来像垃圾数据,但在另一个中看到有效数据,请不要感到震惊。std::string 等常见类型提供。【讨论】:
【讨论】:
试试“查看本地人”图标或 ALT+3,它应该至少显示地址。
【讨论】: