2015-09-18 58 views
28

我正在运行Visual Studio Enterprise 2015,版本14.0.23107.0 D14REL。检查Visual Studio 2015中的STL容器

在调试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; 
} 

在我看到下面的局部变量或监视窗口:

list   [...]() 
vector  [...](... 
    (error) 0 
    (error) 0 
string  {npos=4294967295} 
    (error) 0 
    (error) 0 

如果我再选中“显示原始结构......”选项,我可以正确地钻入向量和字符串对象,但仍然不是列表!

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

+2

多年来,在调试器中查看C++数据结构的MSFT支持并不总是很好。如果这被忽略了,我不会感到惊讶。 – edtheprogrammerguy

+4

您是编译调试版本还是尝试在发行版中调试? – Melkon

+0

这通常适用于VS2015。如果您正在编译Release版本,则调试器可能无法解析所有变量。我能想到的其他(不太可能)的可能性是一个腐败的[natvis文件](https://msdn.microsoft.com/en-us/library/jj620914.aspx) – mattnewport

回答

1

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

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

你实际上是缺少观察仪为您std::<list>

添加格式规则autoexp.dat文件。

您可以找到该文件在这里

%VSINSTALLDIR%\Common7\Packages\Debugger\autoexp.dat 

追加新规则到[Visualizer]部分。

例如要查看列表的大小

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

我们访问std::<list>实施_Mysize成员。 _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 
    ) 
) 
} 

甚至

std::list<*,*>{ 
    children 
    (
    #list(size: $c._Mysize, 
      head: $c._Myhead->_Next, 
      next: _Next 
    ) : $e._Myval 
) 
} 
+1

感谢user1。但事情是,每个Visual Studio(现在为几个版本)提供了可视化STL容器的开箱即用支持。我刚刚在2010年和2013年都确认过,我不需要大肆渲染可视化器!而VS 2015的autoexp.dat文件已经包含了STL容器,它们似乎没有任何作用。 –

+0

请再次勾选“显示原始结构....”选项,如果它已打开,则所有定制都被禁用 – user1

+0

“显示原始结构...”选项绝对未选中。如果我检查它,那么我确实得到了原始结构,所以这一点工作得很好。再次取消选中它,我会看到原始文章中描述的错误。 –

6

我有同样的问题,但只有当调试器类型是“混合”(或者,如果我的项目包含C++/CLI代码和类型为“自动”)。使用调试器类型“仅限Native”,std :: vector和它的单个元素都将正确显示。

您可以使用调试器类型“Native Only”来调试混合项目的纯C/C++部分,但您无法步入C++/CLI代码。

增加:如果你有观看在本机调试的问题,您可能需要阅读此:https://msdn.microsoft.com/en-us/library/jj620914.aspx

+0

感谢Eugene的建议,但更改调试器类型并没有帮助:(我从Auto更改为Native,重新构建测试项目,甚至重新启动Visual Studio,但没有任何区别 –

+0

这个答案中有一些额外的信息,来自什么看起来是微软的员工,他们也提出了相同的解决方法,但还有一些其他建议:https://connect.microsoft.com/VisualStudio/feedback/details/1735111/debugger-completely-broken-when-using -std-boost-types-in-c – premes

25

我同样的问题。

您需要进入工具 - >选项 - >调试 - >常规,并取消勾选“使用托管兼容模式”和“使用本机兼容模式”。

+1

哇,非常感谢 - 挽救了我的一天,似乎VS 2013和VS 2015版本之间发生了变化(看起来像VS 2013中不存在设置) 它的价值:之前,我也无法调试到我正在开发的DLL,但现在(禁用本地兼容模式后)我可以再次执行此操作。 – volzo

+0

这很奇怪;我有最新版本'14.0.25431.0 1更新3“,我必须检查这些复选框才能重新启用此功能。 – Skywalker13

0

对于VS2015,我不得不修改autoexp.dat的列表,例如:

std::list<*>{ 
    preview (
     #(
      "[", 
      $e._Mypair._Myval2._Mysize, 
      "](", 
     #list(
      head: $e._Mypair._Myval2._Myhead->_Next, 
      size: $e._Mypair._Myval2._Mysize, 
      next: _Next 
     ) : $e._Myval, 
      ")" 
     ) 
    ) 

    children (
     #list(
      head: $e._Mypair._Myval2._Myhead->_Next, 
      size: $e._Mypair._Myval2._Mysize, 
      next: _Next 
     ) : $e._Myval 
    ) 
}  

这些变化从检查VS2015 stl.natvis,并指出了各种数据结构上作出标记<!-- VC 2015 -->的变化来

我做出决定的其他STL结构适当的变化,以及,虽然被警告我没有测试过所有

std::unique_ptr<*>{ 
    preview (
     #if ($e._Mypair._Myval2 == 0) (
      "empty" 
     ) #else (
      #(
       "unique_ptr ", 
       *$e._Mypair._Myval2 
      ) 
     ) 
    ) 

    children (
     #if ($e._Mypair._Myval2 == 0) (
      #array(expr: 0, size: 0) 
     ) #else (
      #([ptr] : $e._Mypair._Myval2) 
     ) 
    ) 
} 

std::_Bind<*>{ 
    preview (
     #(
      "bind(", $e._Mypair, 
      ", ", $e._Mypair._Myval2, 
      ")" 
     ) 
    ) 

children (
     #(
      #([f] : $e._Mypair), 
      #([bound_args] : $e._Mypair._Myval2) 
      ) 
    ) 
} 

std::_Mem_fn_wrap<*>{ 
    preview (
     ; We preview the functor returned by mem_fn() with "mem_fn(<stored member function pointer>)". 
     #(
      "mem_fn(", 
      $e._Pm, 
      ")" 
     ) 
    ) 

    children (
     ; Member function pointers have no children. 
     #array(expr: 0, size: 0) 
    ) 
} 

std::_Func_impl<*>{ 
    preview ($e._Mypair._Myval2) 
    children (
     #(
      #([functor] : $e._Mypair._Myval2), 
      #([allocator] : $e._Mypair) 
     ) 
    ) 
} 

std::function<*>{ 
    preview (
     #if ($e._Mystorage._Ptrs[$e._Impl] == 0) (
      ; Detecting empty functions is trivial. 
      "empty" 
     ) #else (
      *$e._Mystorage._Ptrs[$e._Impl] 
     ) 
    ) 

    children (
     #if ($e._Mystorage._Ptrs[$e._Impl] == 0) (
      ; We make empty functions appear to have no children. 
      #array(expr: 0, size: 0) 
     ) #else (
      #([functor and allocator] : *$e._Mystorage._ptrs[$e._Impl]) 
     ) 
    ) 
} 
std::basic_string<char,*>{ 
    preview  (#if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ([$e._Mypair._Myval2._Bx._Buf,s]) #else ([$e._Mypair._Myval2._Bx._Ptr,s])) 
    stringview (#if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ([$e._Mypair._Myval2._Bx._Buf,sb]) #else ([$e._Mypair._Myval2._Bx._Ptr,sb])) 

    children (
     #(
      #([size] : $e._Mypair._Myval2._Mysize), 
      #([capacity] : $e._Mypair._Myval2._Myres), 
      #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) (
       #array(expr: $e._Mypair._Myval2._Bx._Buf[$i], size: $e._Mypair._Myval2._Mysize) 
      ) #else (
       #array(expr: $e._Mypair._Myval2._Bx._Ptr[$i], size: $e._Mypair._Myval2._Mysize) 
      ) 
     ) 
    ) 
} 
std::basic_string<unsigned short,*>|std::basic_string<wchar_t,*>{ 
    preview  (#if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ([$e._Mypair._Myval2._Bx._Buf,su]) #else ([$e._Mypair._Myval2._Bx._Ptr,su])) 
    stringview (#if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ([$e._Mypair._Myval2._Bx._Buf,sub]) #else ([$e._Mypair._Myval2._Bx._Ptr,sub])) 

    children (
     #(
      #([size] : $e._Mypair._Myval2._Mysize), 
      #([capacity] : $e._Mypair._Myval2._Myres), 
      #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) (
       #array(expr: $e._Mypair._Myval2._Bx._Buf[$i], size: $e._Mypair._Myval2._Mysize) 
      ) #else (
       #array(expr: $e._Mypair._Myval2._Bx._Ptr[$i], size: $e._Mypair._Myval2._Mysize) 
      ) 
     ) 
    ) 
} 
std::deque<*>{ 
    preview (
      #(
      "[", 
      $e._Mypair._Myval2._Mysize, 
      "](", 
      #array(
       expr: $e._Mypair._Myval2._Map[(($i + $e._Mypair._Myval2._Myoff)/$e._EEN_DS) % $e._Mypair._Myval2._Mapsize][($i + $e._Mypair._Myval2._Myoff) % $e._EEN_DS], 
       size: $e._Mypair._Myval2._Mysize 
      ), 
      ")" 
     ) 
    ) 

    children (
     #(
      #array(
       expr: $e._Mypair._Myval2._Map[(($i + $e._Mypair._Myval2._Myoff)/$e._EEN_DS) % $e._Mypair._Myval2._Mapsize][($i + $e._Mypair._Myval2._Myoff) % $e._EEN_DS], 
       size: $e._Mypair._Myval2._Mysize 
      ) 
     ) 
    ) 
} 
std::forward_list<*>{ 
    preview (
     #(
      "(", 
      #list(
       head: $e._Mypair._Myval2._Myhead, 
       next: _Next 
      ) : $e._Myval, 
      ")" 
     ) 
    ) 

    children (
     #list(
      head: $e._Mypair._Myval2._Myhead, 
      next: _Next 
     ) : $e._Myval 
    ) 
} 
std::vector<bool,*>{ 
    preview (
     #(
      "[", 
      $e._Mysize, 
      "](", 
      #array(
       expr: (bool)(($e._Myvec._Mypair._Myval2._Myfirst[$i/$e._EEN_VBITS] >> ($i % $e._EEN_VBITS)) & 1), 
       size: $e._Mysize 
      ), 
      ")" 
     ) 
    ) 

    children (
     #(
      #([size] : $e._Mysize), 
      #([capacity] : ($e._Myvec._Mypair._Myval2._Myend - $e._Myvec._Mypair._Myval2._Myfirst) * $e._EEN_VBITS), 
      #array(
       expr: (bool)(($e._Myvec._Mypair._Myval2._Myfirst[$i/$e._EEN_VBITS] >> ($i % $e._EEN_VBITS)) & 1), 
       size: $e._Mysize 
      ) 
     ) 
    ) 
} 
std::vector<*>{ 
    preview (
     #(
      "[", 
       $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst, 
      "](", 
      #array(
       expr: $e._Mypair._Myval2._Myfirst[$i], 
       size: $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst 
      ), 
      ")" 
     ) 
    ) 

    children (
     #(
      #([size] : $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst), 
      #([capacity] : $e._Mypair._Myval2._Myend - $e._Mypair._Myval2._Myfirst), 
      #array(
       expr: $e._Mypair._Myval2._Myfirst[$i], 
       size: $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst 
      ) 
     ) 
    ) 
} 
std::map<*>|std::multimap<*>|std::set<*>|std::multiset<*>{ 
    preview (
     #(
      "[", 
      $e._Mypair._Myval2._Myval2._Mysize, 
      "](", 
      #tree(
       head: $e._Mypair._Myval2._Myval2._Myhead->_Parent, 
       skip: $e._Mypair._Myval2._Myval2._Myhead, 
       left: _Left, 
       right: _Right, 
       size: $e._Mypair._Myval2._Myval2._Mysize 
      ) : $e._Myval, 
      ")" 
     ) 
    ) 

    children (
     #(
      #tree(
       head: $e._Mypair._Myval2._Myval2._Myhead->_Parent, 
       skip: $e._Mypair._Myval2._Myval2._Myhead, 
       left: _Left, 
       right: _Right, 
       size: $e._Mypair._Myval2._Myval2._Mysize 
      ) : $e._Myval 
     ) 
    ) 
} 
std::unordered_map<*>|std::unordered_multimap<*>|std::unordered_set<*>|std::unordered_multiset<*>|stdext::hash_map<*>|stdext::hash_multimap<*>|stdext::hash_set<*>|stdext::hash_multiset<*>{ 
    preview (
     #(
      "[", 
      $e._List._Mysize, 
      "](", 
      #list(
       head: $e._List._Myhead->_Next, 
       size: $e._List._Mysize, 
       next: _Next 
      ) : $e._Myval, 
      ")" 
     ) 
    ) 

    children (
     #list(
      head: $e._List._Myhead->_Next, 
      size: $e._List._Mysize, 
      next: _Next 
      ) : $e._Myval 
    ) 
} 
2

“工程上我的箱子“......终于......终于......但曾专门做这些步骤:

  1. 安装VS2015 Update 2,需要三个小时左右
  2. 取消勾选‘使用管理兼容模式’和”使用工具|“使用本机兼容模式”选项选项|调试
  3. 添加这个REG开关,如"How to Try It Out"表示:

注册键: HKCU\Software\Microsoft\VisualStudio\14.0_Config\AD7Metrics\ExpressionEvaluator\{3A12D0B7-C26C-11D0-B442-00A0244A1DD2}\{994B45C4-E6E9-11D2-903F-00C04FA302A1} 添加DWORD LoadInShimManagedEE设置为0

现在我可以查看标准集装箱 就像我从来没有做过 就像我以前在的早期版本中所做的那样。我们的大部分本地C++代码都是从C++/CLI代码调用的,所以这种修复是非常必要的。

+2

非常好,您不再需要编辑注册表,因为它们已将它打包为[vsix](https://visualstudiogallery.msdn.microsoft。com/ab846c83-56be-41b4-88e7-95895ab528dc)(仍然需要先安装KB,如链接所述)。他们承诺上述两项都将包含在更新3中。 – dlf

0

有同样的麻烦。我的环境:赢得10个教授。 x64,VS 2015,更新3,工具集v140,C++项目。 我甚至看不到字符串。 这个问题似乎是通过更新或扩展引入的。

解决方案: 我在另一个系统上安装了VS2015(win 7 prof。x64)。这是安装 与更新3(净安装)。 在这台机器上一切正常:可以看到字符串(不扩展dbg工具提示)。对于容器,大小显示为移动并可以检查元素。完善。

有什么区别?我不知道。我比较了两个 机器上的.natvis文件和 C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ Packages \ Debugger \ autoexp.dat

没有区别。

所以这种解决方案在这种情况下非常常见:卸载VS2015。运行一个reg清洁器。重新安装。 开始。我的旧设置从第一次启动开始,调试检查 再次运行。问题解决了。

0

我正在运行VS2015 SP3。我花了2个小时尝试互联网告诉我要做的每一个修复。没有工作!我最后的手段是重新安装VS(需要几个小时)。所以我去了“添加/删除程序”>“Microsoft Visual Studio Professional 2015”。但是,我没有卸载,而是尝试进行“修复”。我不知道是什么导致了这个问题,但修复安装固定它。