2015-09-18 61 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」。但是,我沒有卸載,而是嘗試進行「修復」。我不知道是什麼導致了這個問題,但修復安裝固定它。