我目前正在尝试为大型项目创建一个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文件中的类型吗?
答案 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还有一个语法指南。
祝你好运。