Vs 2012 natvis:可以在xml中定义类吗?

时间:2013-09-02 14:20:39

标签: visual-studio-2012 debuggervisualizer natvis

我目前正在尝试为大型项目创建一个natvis XML文件。 我们有一个指向一个类型的指针,调试器一无所知(信息隐藏了一个typedef,这是作者的一个愚蠢的想法,但是不能在瞬间改变......)。

原始结构与此类似(调试器对这些类型一无所知,他只看到指针):

struct INNER_1_t
{
    int* pointerToArray;
    int n;
}

struct INNER_2_t
{
    int v_1;
    int v_2;
}

struct OUTER_t
{        
    /* a lot of other, primitive members ... */
    int lface;

    int *edges; //Array with num_edges members
    int num_edges;

    INNER_1_t *ptr1; //Array with n1 members
    int n1;

    INNER_2_t *ptr2; //Array with n2 items
    int n2;
}

我的目标是通过natvis XML文件使这个结构的成员可见。 对于普通成员,使用Items和指针算法很容易。 示例:

<Item Name="lface">*((int*)(((char*)this)+92))</Item>

我也知道如何定义已知类型的数组:

        <Synthetic Name="edge">
            <DisplayString>Edges({*((int*)(((char*)this)+80))})</DisplayString>
            <Expand>
                <ArrayItems>
                    <Size>*((int*)(((char*)this)+80))</Size>
                    <ValuePointer>*((double**)(((char*)this)+76))</ValuePointer>
                </ArrayItems>
            </Expand>
        </Synthetic>

有没有办法定义一个(对于调试器)UNKNOWN类型的数组? 或者我可以以某种方式声明XML文件中的类型吗?

1 个答案:

答案 0 :(得分:0)

我正在尝试类似的东西。如果您有权访问OUTER_t但不能访问内部的那些,我认为一种策略涉及为INNER_1_t和INNER_2_t声明类型,其中Items对应于您希望私有/不可见字段所在的位置。您需要知道确切的偏移量和类型,并注意编译器对齐选项。因此,您不会在natvis中从头开始创建整个类,而是伪装不透明类型的显示。如果数组条目是无效指针,你可能会运气不好,但是使用typedef你应该能够安全地转换为真正的类型。您只能自定义非基本类型(HRESULT除外)。

FWIW,我在https://stackoverflow.com/a/11545420/611672了解到你可以使用注册表项打开natvis诊断

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\Debugger]

"EnableNatvisDiagnostics"=dword:00000001

如果有帮助的话,http://msdn.microsoft.com/en-us/library/vstudio/jj620914.aspx还有一个语法指南。

祝你好运。