2016-10-24 58 views
0

在調試時,我無法在VS2015中看到一個基本的std:string。 我遵循這個地址給出的指令:https://msdn.microsoft.com/fr-fr/library/jj620914.aspx (這是調試器類型設置爲本地模式,並取消選中Use Managed Compatibility ModeUse Native Compatibility Mode)。我還將stl.nativs文件添加到我的解決方案中。如何使用natvis可視化簡單的std :: string?

目前我調試的樣子: enter image description here

我想看到的值直接「測試」我的(而不是一個非常複雜的樹)可變str。你能幫助我嗎?

+0

什麼樣的Natvis XML文件包含在您的測試用例中? –

+0

謝謝 - 請參閱我的答案 - 調試器不考慮stl.natvis文件。 – Malick

回答

2

我找到了答案,一個非常奇怪的原因,我在VS安裝目錄中找到(C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers對我來說)的stl.natvis文件和我已經加入到我的項目調試器自動識別。

因此,解決方案是將另一個Debugger visualization file (.natvis)添加到我的解決方案(右鍵單擊 - >添加新項目),並將stl.natvis文件的內容複製/過去到這個新文件。重新編譯後,調試器會正確顯示標準std:字符串。

爲了完整,請參閱的std :: string涉及的Visual Studio 2015年

<!-- VC 2015 --> 
    <Type Name="std::basic_string&lt;char,*&gt;"> 
    <DisplayString Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,na}</DisplayString> 
    <DisplayString Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,na}</DisplayString> 
    <StringView Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,na</StringView> 
    <StringView Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr,na</StringView> 
    <Expand> 
     <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mysize</Item> 
     <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myres</Item> 
     <Item Name="[allocator]" ExcludeView="simple">_Mypair</Item> 
     <ArrayItems> 
     <Size>_Mypair._Myval2._Mysize</Size> 
     <ValuePointer Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer> 
     <ValuePointer Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer> 
     </ArrayItems> 
    </Expand> 
    </Type> 

    <!-- VC 2015 --> 
    <Type Name="std::basic_string&lt;wchar_t,*&gt;"> 
    <AlternativeType Name="std::basic_string&lt;unsigned short,*&gt;" /> 
    <AlternativeType Name="std::basic_string&lt;char16_t,*&gt;" /> 
    <DisplayString Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,su}</DisplayString> 
    <DisplayString Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,su}</DisplayString> 
    <StringView Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,su</StringView> 
    <StringView Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr,su</StringView> 
    <Expand> 
     <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mysize</Item> 
     <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myres</Item> 
     <Item Name="[allocator]" ExcludeView="simple">_Mypair</Item> 
     <ArrayItems> 
     <Size>_Mypair._Myval2._Mysize</Size> 
     <ValuePointer Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer> 
     <ValuePointer Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer> 
     </ArrayItems> 
    </Expand> 
    </Type> 

    <Type Name="std::basic_string&lt;char32_t,*&gt;"> 
    <DisplayString Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,s32}</DisplayString> 
    <DisplayString Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,s32}</DisplayString> 
    <StringView Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,s32</StringView> 
    <StringView Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr,s32</StringView> 
    <Expand> 
     <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mysize</Item> 
     <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myres</Item> 
     <Item Name="[allocator]" ExcludeView="simple">_Mypair</Item> 
     <ArrayItems> 
     <Size>_Mypair._Myval2._Mysize</Size> 
     <ValuePointer Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer> 
     <ValuePointer Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer> 
     </ArrayItems> 
    </Expand> 
    </Type> 

編輯

看到最後的手錶控制檯下方的stl.natvis的部分如下所示: (也請注意,你應該只複製你想要的部分stl.natvis,看起來全副本/過去不起作用。)

enter image description here

+0

你能否在更新natvis文件後顯示你的調試器窗口? –

+0

@ J.Piquard查看我編輯 – Malick

+0

感謝您的分享,Malick :)請將您的答覆標記爲答案,這樣可以幫助滿足相同問題的其他社區成員。 –

0

我發現你在VS中選擇的語言會影響這個。 .natvis xml文件的模式在$(VSINSTALLDIR)/ xml/schemas/$(LANG)/natvis.xsd中定義, 在我的電腦中有兩個版本:1033和2052,後者比另一個更新,它定義了更多的元素(例如<SmartPointerUsage>用於stl.nativs)。 如果您發現調試器的變量檢查不起作用,您可以嘗試將語言更改爲具有更新的natvis.xsd的特殊語言。

1

這不是一個答案,但我想問如何顯示給定長度的字符串,可能不會零終止。我想要可視化這種類型

class String_Ref{ const char* _p; size_t _len; }; 
+0

這不提供問題的答案。你可以[搜索類似的問題](// stackoverflow.com/search),或者參考頁面右側的相關和鏈接問題來找到答案。如果你有一個相關但不同的問題,[問一個新問題](// stackoverflow。com/questions/ask),幷包含一個鏈接以幫助提供上下文。請參閱:[提出問題,獲得答案,沒有分心](// stackoverflow.com/tour) – Bryan

+0

如果您有一個新問題,請通過單擊[問問題](https://stackoverflow.com/questions/問)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - [來自評論](/ review/low-quality-posts/18989529) –

相關問題