使用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&lt;*&gt;">
    <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&lt;*&gt;">
    <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)

 

posted @ 2021-08-27 10:43  天命小猪  阅读(443)  评论(0编辑  收藏  举报