昨天我发现了MSVC's "Natvis" tool,它使您可以调试程序以智能方式显示类型。我很快着手美化我的数学库。

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


visual-studio-2015 - Natvis浮点格式-LMLPHP


太好了吧?我的下午没有遗憾。

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


visual-studio-2015 - Natvis浮点格式-LMLPHP


如您所见,数字不对齐。我想出了一种讨厌的方法来使负数与正数对齐,但是我的方法无法解决这个问题(这是我的基本要点):

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


发生的事情是,打印的数字位数因数字而异。

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



附注:我很乐意上传生成“ .natvis”文件的Python脚本,以供大家使用,以供您使用自己的类型(如果可以的话)。

最佳答案

如果您仍然感兴趣:一个讨厌的解决方法是计算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>


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

{(NATVIS_FLOAT*)&m[2],na}

08-27 00:44
查看更多