使用WinDbg进行调试时,我无法看到本地std::string
变量的值。我可以看到布尔变量的值,但是当将鼠标悬停在字符串变量上或在Locals窗口中查看时,我看到的只是变量的类型,而不是它的实际值。
如何查看本地std::string
变量的值?
答案 0 :(得分:5)
尽管在外面很简单,但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
等常见类型提供的.NATVIS files完成的。答案 1 :(得分:2)
将此行粘贴到txt文件中并使用$$&gt; a&lt;执行脚本 这将转储所有本地std :: string-&gt; c_str(),其长度为&gt; 16
!for_each_local ".printf \" @#Local = %ma\\n\" , poi( @#Local )"
对于短于16的字符串,请使用da <name>
答案 2 :(得分:0)
尝试“查看当地人”图标或ALT + 3,它应至少显示地址。