【问题标题】:Visual Studio natvis displaying pointer-to-interfaceVisual Studio natvis 显示指向接口的指针
【发布时间】:2017-05-30 14:24:12
【问题描述】:

我正在尝试为我们公司的自定义智能指针创建调试可视化工具。我想使用ExpandItem 将内容仅向下一层,这适用于ref_ptr<Vector2d> 之类的具体类型,但不适用于ref_ptr<IStreamManager> 之类的虚拟类型。使用虚拟类型时,我得到两个条目,一个用于基础类型,然后我可以扩展它,另一个用于__vfptr

我得到了什么:

v streamManagerPtr         shared_ptr { count=35, ptr=... }
    [Reference Count]      2
  v [StreamMgr]            {...}
      m_resourceMgr        shared_ptr { count=35, ptr=... }
      m_fileMgr            shared_ptr { count=23, ptr=... }
      ...
  > __vfptr                0xdeadbeef
  > [Raw View]             {...}

我想要什么:

v streamManagerPtr         shared_ptr { count=35, ptr=... }
    [Reference Count]      2
    m_resourceMgr          shared_ptr { count=35, ptr=... }
    m_fileMgr              shared_ptr { count=23, ptr=... }
    ...
  > [Raw View]             {...}

有什么方法可以将底层动态类型的内容再上一层,这样我就不必处理这种无用的嵌套级别了?

【问题讨论】:

    标签: visual-studio debuggervisualizer natvis


    【解决方案1】:

    我相信你可以使用这样的东西:

    <Type Name="shared_ptr&lt;*&gt;">
      <Expand>
        <ExpandedItem Condition="ptr != 0">*ptr</ExpandedItem>
      </Expand>
    </Type>
    

    ExpandedItem 标签基本上移除了嵌套级别,显示标签中项目的内容,就好像它们是与Expand 标签中的其余Items 相同的嵌套级别的常规项目一样.

    【讨论】:

    • ref_ptr 不是std::shared_ptr,所以这不会有效果。
    【解决方案2】:

    我没有使用ref_ptr,所以我使用自己的模板类进行了测试。因此,如果以下代码可能无法立即与 ref_ptr 一起使用,请多多包涵。

    <Type Name="ref_ptr&lt;*&gt;" Priority="MediumLow">
      <Expand>
        <ExpandedItem Condition="_ptr->__vfptr">*_ptr</ExpandedItem>
      </Expand>
    </Type>
    <Type Name="ref_ptr&lt;*&gt;">
      <Expand>
        <ExpandedItem>_ptr</ExpandedItem>
      </Expand>
    </Type>
    

    MSDN 上描述了这个技巧:natvis 尝试解析第一个条目。那是检查_ptr-&gt;__vfptr 是否不是nullptr。对于您的IStreamManager,这可以被解析并评估为真,因此使用第一个条目,对象本身被获取并扩展。如果第一个条目的条件由于没有__vfptr 而无法解析,则不使用第一个条目并使用第二个条目。那就是你现在在现有代码中所做的事情。

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2010-11-18
      • 2016-06-06
      • 2016-08-01
      相关资源
      最近更新 更多