使用Visual Studio 调式NDK so 库时,调试工具无法显示vector内容
最近在研究C++开发安卓端so库,demo使用xamarin.android作为载体来验证算法库文件的准确性。调试过程中发现vector中的内容无法显示集合详细。如下图
研究了半天(参考链接2、3),发现需要使用.natvis文件进行debugger 可视化自定义功能。
步骤:
1.在VS的C++项目中新增:.natvis文件。
2.找到文件“Microsoft.Android.natvis”。
目录:Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\MDD\Debugger
搜索里面的vector内容,作为参考:
<!-- llvm stl --> <Type Name="std::__1::vector<*>"> <DisplayString>{{size={__end_ - __begin_}}}</DisplayString> <Expand> <Item Name="[size]" ExcludeView="simple">__end_ - __begin_</Item> <Item Name="[capacity]" ExcludeView="simple">__end_cap_.__first_ - __begin_</Item> <Item Name="[allocator]" ExcludeView="simple">__end_cap_</Item> <ArrayItems> <Size>__end_ - __begin_</Size> <ValuePointer>__begin_</ValuePointer> </ArrayItems> </Expand> </Type>
3.这里面的type类型和我们看到的不一致,修改后加入到自定义的.natvis文件中。
<?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> <Type Name="std::__ndk1::__vector_base<*>"> <DisplayString>{{size={__end_ - __begin_}}}</DisplayString> <Expand> <Item Name="[size]" ExcludeView="simple">__end_ - __begin_</Item> <Item Name="[capacity]" ExcludeView="simple">__end_cap_.__first_ - __begin_</Item> <Item Name="[allocator]" ExcludeView="simple">__end_cap_</Item> <ArrayItems> <Size>__end_ - __begin_</Size> <ValuePointer>__begin_</ValuePointer> </ArrayItems> </Expand> </Type> </AutoVisualizer>
再次调试,可以发现多了一个栏目:Visualized View,可以查看。
capacity字段缺失,对我来说不重要,可以在.natvis文件中去除。有需要的小伙伴可以研究看看。
参考链接:
1. Natvis support for Android debugging | C++ Team Blog (microsoft.com)
2. 在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示 - X_Jun - 博客园 (cnblogs.com)
3. Visual Studio 2015 cannot inspect elements of vector (microsoft.com)