在Visual Studio 2015中检查STL容器

Gra*_*ull 31 c++ stl visual-c++ visual-studio-2015

我正在运行Visual Studio Enterprise 2015,版本14.0.23107.0 D14REL.

在调试C++程序时,我看不到STL容器的内容.

我没有选中"在变量窗口中显示对象的原始结构"选项(工具 - >选项 - >调试 - >常规).

这是一个说明问题的示例:

#include <list>
#include <string>
#include <vector>

int main()
{
    std::string string = "test";
    std::vector<int> vector{ 4, 5, 6 };
    std::list<std::string> list{ "one", "two", "three" };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Locals或Watch窗口中,我看到以下内容:

list         [...]()
vector       [...](...
  (error)    0
  (error)    0
string       {npos=4294967295}
  (error)    0
  (error)    0
Run Code Online (Sandbox Code Playgroud)

如果我然后检查"显示原始结构..."选项,我可以正确深入到矢量和字符串对象,但仍然不是列表!

还有其他选择我错过了,或者这是VS中的真正错误?

小智 26

我遇到了同样的问题.

您需要进入Tools-> Options-> Debugging-> General并取消选中"Use Managed Compability Mode"和"Use Native Compability Mode".


Eug*_*ene 6

我有同样的问题,但只有当Debugger Type为"Mixed"时(或者我的项目包含C++/CLI代码且类型为"Auto").使用调试器类型"仅限本机",std :: vector作为一个整体及其单个元素都正确显示.

您可以使用Debugger Type"Native Only"来调试混合项目的纯C/C++部分,您只是无法进入C++/CLI代码.

另外:如果您在本机调试器中查看时遇到问题,可能需要阅读:https://msdn.microsoft.com/en-us/library/jj620914.aspx


use*_*er1 1

不,这不是 Visual Studio 中的错误!

Microsoft Visual Studio 2005 是第一个支持可用于模板类的调试器可视化工具的 Visual Studio 版本。

你实际上缺少一个可视化工具std::<list>

在文件中添加格式规则autoexp.dat

您可以在此处找到该文件

%VSINSTALLDIR%\Common7\Packages\Debugger\autoexp.dat
Run Code Online (Sandbox Code Playgroud)

将新规则附加到该[Visualizer]部分。

例如查看列表大小

std::list<*,*>{
  preview
    (
      #("[list size=", $e._Mysize, "]")
    )
}
Run Code Online (Sandbox Code Playgroud)

我们正在访问实现_Mysize的成员std::<list>_Mysize给出列表中元素的数量。

模式匹配:

std::list<*,*>将匹配std::list<int>并且std::list<int,std::allocator<int> >

std::list<*,*>将匹配std::list<string>并且std::list<string,std::allocator<string> >

查看儿童项目

std::list<*,*>{
  children
  (
    #(
      first item: $e._Myhead->_Next->_Myval,
      second item: $e._Myhead->_Next->_Next->_Myval,
      [third item]: $e._Myhead->_Next->_Next->_Next->_Myval
    )
  )
}
Run Code Online (Sandbox Code Playgroud)

甚至

std::list<*,*>{
  children
  (
    #list(size: $c._Mysize,
          head: $c._Myhead->_Next,
          next: _Next
    ) : $e._Myval
  )
}
Run Code Online (Sandbox Code Playgroud)