1、natvis文件是干什么的?
微软提出使用一种.natvis的文件来定义一个类的对象在调试窗口时显示。
natvis的定义方式举例如下:
<Type Name="std::list<*>">
<DisplayString>{{ size={_Mysize} }}</DisplayString>
<Expand>
<LinkedListItems>
<Size>_Mysize</Size>
<HeadPointer>_Myhead->_Next</HeadPointer>
<NextPointer>_Next</NextPointer>
<ValueNode>_Myval</ValueNode>
</LinkedListItems>
</Expand>
</Type>
摘录于C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\stl.natvis
2、vector等STL容器看不到?
VS2013断点调试时,vector<string> item_vec;查看一下item_vec中的内容时,watch中的内容如下:
vector对象为什么没有显示size, capacity, vector中的所有元素列表等等?
原因有几种可能:
(1)Natvis文本本身有语法错误
(2)VS调试器的版本问题,低版本解析不出高版本的Natvis文件
(3)VS发布的更新程序有bug,stl.natvis文件中的一些定义通不过验证
例如,本人遇到的vector问题就是版本不匹配造成,VS2013和VS2015在C++ STL定义不同:
<!-- VC 2013 -->
<Type Name="std::vector<*>">
<DisplayString>{{ size={_Mylast - _Myfirst} }}</DisplayString>
<Expand>
<Item Name="[capacity]" ExcludeView="simple">_Myend - _Myfirst</Item>
<ArrayItems>
<Size>_Mylast - _Myfirst</Size>
<ValuePointer>_Myfirst</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- VC 2015 -->
<Type Name="std::vector<*>">
<DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
<Expand>
<Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
<Item Name="[allocator]" ExcludeView="simple">_Mypair</Item>
<ArrayItems>
<Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
<ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
</ArrayItems>
</Expand>
</Type>
3、自定义Natvis文件(例如Qt定义的qt5.natvis)
把自定义文件Natvis存放在如下位置,Visual Studio就能找到,每次修改之后不需要重启Visual Studio,只需要重新运行一次Debug就行了。
%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
%USERPROFILE%\My Documents\Visual Studio 2013\Visualizers\
如果发现没有起作用,可以在注册表中加入如下的键值,这样在Visual Studio的Output窗口就可以看到加载Natvis时的信息了。
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\Debugger]
"EnableNatvisDiagnostics"=REG_DWORD:0x00000001
以上工作完毕,调试的时候,在Visual Studio中输出窗口可以看到如下文本显示:
Natvis: 正在分析 natvis xml 文件: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\atlmfc.natvis。
Natvis: natvis xml 文件分析完毕: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\atlmfc.natvis。
Natvis: 正在分析 natvis xml 文件: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\concurrency.natvis。
Natvis: natvis xml 文件分析完毕: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\concurrency.natvis。
Natvis: 正在分析 natvis xml 文件: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\cpp_rest.natvis。
Natvis: natvis xml 文件分析完毕: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\cpp_rest.natvis。
Natvis: 正在分析 natvis xml 文件: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\stl.natvis。
Natvis: natvis xml 文件分析完毕: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\stl.natvis。
......
4、微软官网文档:
创建自定义视图的C++在调试器中的对象
https://docs.microsoft.com/zh-cn/visualstudio/debugger/create-custom-views-of-native-objects
---
参考文献
用Natvis定制C++对象在Visual Studio调试时如何显示