0

我正在尝试为我们公司的自定义智能指针创建调试可视化工具。我想使用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]             {...}

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

4

2 回答 2

0

我没有使用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 尝试解析第一个条目。那个正在检查 if _ptr->__vfptris not nullptr。对于您的IStreamManagerthis 可以被解析并评估为 true,因此使用第一个条目,对象本身被获取和扩展。如果第一个条目的条件因为不存在而无法解析,__vfptr则不使用第一个条目并使用第二个条目。那就是你现在在现有代码中所做的事情。

于 2018-11-11T19:27:17.310 回答
0

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

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

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

于 2017-08-30T19:58:26.200 回答