无法看到局部变量值

mkd*_*156 2 c++ debugging windbg

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

如何查看局部std::string变量的值?

Sea*_*ine 5

虽然在外面很简单,但是它std::string是一种令人惊讶的复杂类型,WinDbg只是没有智能以更人性化的格式显示它.

将它悬停在WinDbg上会显示如下内容:

std :: string的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)

它需要一些工作,但我们到了那里.


要注意的一些事项:

  1. 了解您正在深入了解库类型的实现.这可以(并且将会)随时改变.我的截图中的实现来自VS2015,可能与其他版本不同.
  2. 字符串的值隐藏在_Bx联合中,作为实现小字符串优化(SSO)的一种方法.当字符串足够短时,它将被存储_Bx._Buf,否则,它将被分配在免费存储区中,并且存储在其中的指针_Bx._Ptr.如果您看到其中一个中的垃圾数据看起来像是垃圾数据,那么请不要感到震惊,而另一个中的有效数据.
  3. 这在Visual Studio的调试器中不是问题,因为它们具有可视化类型和数据结构的方法.这是通过Visual Studio为常见类型提供的.NATVIS文件来完成的std::string.