[英]NATVIS reinterpret type or alias type
natvis 中有沒有辦法將類型重新解釋為已經 natvis 定義的類型? 還是別名呢?
例如,我想做這種“技巧”(在我的上下文中確實有必要,即使這聽起來對你來說真的很奇怪,這是 JIT 符號生成的問題)
<Type Name="std::vector<*,*>">
<DisplayString>{*(stl1.dll!std::vector<$T0,$T1> *)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<*,*>">
<Expand>
<ExpandedItem>
*(stl1.dll!std::vector<$T0,$T1> *)this
</ExpandedItem>
</Expand>
</Type>
但要注意與reinterpret_cast
相關的遞歸和副作用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.