Natvis 浮点格式

Posted

技术标签:

【中文标题】Natvis 浮点格式【英文标题】:Natvis Floating-Point Format 【发布时间】:2015-07-29 01:37:23 【问题描述】:

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

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

很漂亮,对吧?我的下午没有遗憾。

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

如您所见,数字不一致。我想出了一个 方法 nasty crock 让负数与正数对齐,但我的方法无法解决这个问题(这是我的基本大纲) :

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

发生的情况是打印的位数因数字而异

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


P.S.:如果我能正常工作,我会很乐意上传生成“.natvis”文件的 Python 脚本供大家使用。

【问题讨论】:

【参考方案1】:

我今天遇到了同样的问题。经过一番挖掘,您可以通过添加“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>

这会导致:

【讨论】:

我想你可能误解了我的问题。问题是表示具有不可预测的长度(即使它们都是十进制),导致彼此上方的行不对齐。 没有回答这个问题,但对我很有帮助。拿我的+【参考方案2】:

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

首先,您在源代码中引入了一个简单的结构,该结构在您的代码中只包含浮点或双精度成员。这使您可以将浮点值转换为 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

【讨论】:

有一个 +1 甚至回答。我曾尝试过这样的事情,但我无法弄清楚如何获得恒定数量的数字来显示。问题是,虽然您可以指定小数点后的数字,但您不能在前面指定它们。所以例如这与序列 0.123, 1.123, 10.123, 100.123, etc. 中断。 当然你可以使用同样的技术来显示前导零,诚然看起来有点难看。

以上是关于Natvis 浮点格式的主要内容,如果未能解决你的问题,请参考以下文章

将整数转换为新的浮点格式

逆向工程未知浮点格式

Pandas 样式的默认浮点格式

printf 的浮点格式标志 (%f) 仅适用于英文数字格式

Oracle 10g 浮点格式

从 IEEE 754-2008 十进制浮点数据转换为二进制浮点格式