8

昨天我发现了MSVC 的“Natvis”工具,它允许您调整调试器以智能的方式呈现您的类型。我很快开始美化我的数学库。

这是我的 3*3 矩阵类的外观(未初始化的数据):

矩阵 3x3

华丽,对吧?我的下午没有遗憾。

但是,现在我们遇到一个稍微复杂一点的情况:

矩阵 4x4

如您所见,数字不对齐。我已经找到了一种 讨厌的方法来让负数与正数对齐,但是我的方法无法解决这个问题(这是我的基本大纲):

<Type ...>
    <DisplayString>...</DisplayString>
    <Expand ...>
        <Synthetic ...>
            <DisplayString ...>...</DisplayString>
        </Synthetic>
        ...
    </Expand>
</Type>

正在发生的事情是打印的位数因数字而异

因此我的问题是:我可以将 Natvis 配置为打印明确定义的位数以进行调试吗?或者,也许您有一个聪明的解决方法?


PS:如果我能正常工作,我会很乐意上传生成“.natvis”文件的 Python 脚本供大家使用,以供您自己的类型使用。

4

2 回答 2

4

我今天遇到了同样的问题。经过一番挖掘,您可以通过添加“g”格式说明符来做一个更简单的本地解决方案:

<Type Name="Rect">
    <DisplayString>Min({myMin.x,g},{myMin.y,g}) Max({myMax.x,g},{myMax.y,g}) Size({myMax.x-myMin.x,g},{myMax.y-myMin.y,g})</DisplayString>
    <Expand>
        <Item Name="[Width]">myMax.x-myMin.x,g</Item>
        <Item Name="[Height]">myMax.y-myMin.y,g</Item>
    </Expand>
</Type>

这导致:

在此处输入图像描述

于 2018-08-29T06:24:47.293 回答
3

如果您仍然感兴趣:一个讨厌的解决方法是计算 natvis 中的点之后的每个单个数字,并提供一个帮助类型,您可以将您的 POD 数据类型转换为:

首先,您在源代码中引入了一个简单的结构,该结构在您的代码中只包含 float 或 double 成员。这使您可以将浮点值转换为 NATVIS_FLOAT 并访问该数字。

struct NATVIS_FLOAT { float f;}

现在您可以为 NATVIS_FLOAT 类型创建一个可视化工具,您可以在其中定义要显示的精度点之后的每个数字,例如 4:

<Type Name="NATVIS_FLOAT">
   <DisplayString>{(int)f}.{((int)(f*10))%10}{((int)(f*100))%10}{((int)(f*1000))%10}{((int)(f*10000))%10}</DisplayString>
</Type>

最后,您可以将矩阵的浮点成员转换为 NATVIS_FLOAT。如果您的矩阵有一个成员 float m[9] 您可以可视化一个条目,例如

{(NATVIS_FLOAT*)&m[2],na}
于 2016-02-10T10:07:08.243 回答