1

我目前正在尝试为工作中的大型项目创建一个 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>

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

4

1 回答 1

0

我目前正在尝试类似的东西。如果您可以访问 OUTER_t 但不能访问内部的,我认为一种策略涉及为 INNER_1_t 和 INNER_2_t 声明类型,其中项目对应于您期望私有/不可见字段的位置。您需要知道确切的偏移量和类型,并注意编译器对齐选项。因此,您不会在 natvis 中从头开始创建整个类,而是伪造不透明类型的显示。如果数组条目是 void 指针,您可能会不走运,但是使用 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上还有一个语法指南。

祝你好运。

于 2013-09-23T19:22:06.960 回答