簡體   English   中英

NATVIS 重新解釋類型或別名類型

[英]NATVIS reinterpret type or alias type

natvis 中有沒有辦法將類型重新解釋為已經 natvis 定義的類型? 還是別名呢?

例如,我想做這種“技巧”(在我的上下文中確實有必要,即使這聽起來對你來說真的很奇怪,這是 JIT 符號生成的問題)

<Type Name="std::vector&lt;*,*&gt;">
<DisplayString>{*(stl1.dll!std::vector&lt;$T0,$T1&gt *)this}</DisplayString>
</Type>

但它不能顯示展開項,它只是顯示一個字符串作為值(考慮到“DisplayString”角色,這似乎是合乎邏輯的)。

我也嘗試過使用SmartPointer技巧,它做得更好,但事實證明,當涉及基類時它不起作用(它只顯示 SmartPointer 類型並完全忽略繼承)

由於您沒有展示您的課程,我只能展示我自己的示例代碼。

struct A { int x, y; };
struct B { int x, y; };
struct C { int v, w; };

int main()
{
    A a{ 1,2 };
    B b{ 3,4 };
    C c{ 5,6 };
    return 0;
}

和 natvis:

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="A">
    <AlternativeType Name="B"/>
    <AlternativeType Name="C"/>
    <DisplayString>A {x}, {y}</DisplayString>
  </Type>
</AutoVisualizer>

此顯示為在此處輸入圖像描述

如您所見, AlternativeName可以解決問題,但原始 class 的 natvis 需要它。 它要求兩個類具有相同的成員/成員名稱。

另請注意,在使用 natvis 時,最好啟用 natvis 調試。 Go 到菜單工具/選項/調試/“輸出窗口”/“常規 Output 設置”並將“Natvis 診斷消息(僅限 C++)”設置為有用的值。

我認為您試圖將一種類型表示為另一種類型(透明地)? 在您的情況下,您應該使用ExpandedItem 這應該有效:

  <Type Name="std::vector&lt;*,*&gt;">
    <Expand>
      <ExpandedItem>
        *(stl1.dll!std::vector&lt;$T0,$T1&gt *)this
      </ExpandedItem>
    </Expand>
  </Type>

但要注意與reinterpret_cast相關的遞歸和副作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM