无法看到局部变量值

时间:2015-08-12 00:41:16

标签: c++ debugging windbg

使用WinDbg进行调试时,我无法看到本地std::string变量的值。我可以看到布尔变量的值,但是当将鼠标悬停在字符串变量上或在Locals窗口中查看时,我看到的只是变量的类型,而不是它的实际值。

如何查看本地std::string变量的值?

3 个答案:

答案 0 :(得分:5)

尽管在外面很简单,但std::string是一种令人惊讶的复杂类型,而且WinDbg没有智能以更易于阅读的格式显示它。

在WinDbg中将鼠标悬停在它上面会显示如下内容:

Tooltip in WinDbg of std::string

而且,这根本没有用。

幸运的是,数据存在,我们只需要挖掘它。在我们的示例中,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

花了一些工作,但我们到了那里。

要记住的一些事情:

  1. 了解您正在深入了解库类型的实现。这可以(并且将会)随时改变。我的截图中的实现来自VS2015,可能与其他版本不同。
  2. 字符串的值隐藏在_Bx联合中,作为实现Small String Optimization(SSO)的方法。当字符串足够短时,它将存储在_Bx._Buf中,否则,它将被分配在免费存储区中,并且指向它的指针存储在_Bx._Ptr中。如果您看到其中一个中的垃圾数据看起来像是垃圾数据,那么请不要感到震惊,但另一个中的数据是有效的。
  3. 这不是Visual Studio调试器中的问题,因为它们具有可视化类型和数据结构的方法。这是通过Visual Studio为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>

enter image description here

答案 2 :(得分:0)

尝试“查看当地人”图标或ALT + 3,它应至少显示地址。