我可以控制调试器窗口中浮点数和双变量显示的位数吗?

时间:2013-12-19 19:39:00

标签: c++ debugging visual-studio-2012 natvis

在Visual Studio 2012中,我正在寻找一种在Autos,Locals和Watch窗口中自定义浮点类型的默认显示的方法。我熟悉Native Visualizer(Natvis)实用程序,但没有看到任何调试器格式化工具来完成此任务。同样,我不知道有任何方法可以覆盖任何基元类型的默认显示(除了启用十六进制)。

目标是为对应于点,几何向量等的类型创建具有更少位数的显示字符串,但在扩展类型时仍然显示所有精度。例如,我可能在Autos窗口的中间列中将点类型的变量显示为(0.000, 1.234, 2.429)而不是m_x = 0.00000000, m_y = 1.234245213...

我浏览了this page的格式说明符,但没有看到控制浮点精度的方法。

6 个答案:

答案 0 :(得分:11)

虽然their documentation似乎不支持,但我们使用以下定义来缩短数字(在VS 2015中):

  <Type Name="MyVec3d">
    <DisplayString>{vectorX,g}, {vectorY,g}, {vectorZ,g}</DisplayString>
  </Type>

答案 1 :(得分:2)

不幸的是,实际上没有办法在C ++调试中进行这种细粒度的更改。在托管语言中,有可能在某些有限的场景中(当基元是对象的字段并使用特殊的[DebuggerDisplay]属性注释时)。对于C ++,虽然这种类型的自定义不存在。

答案 2 :(得分:2)

原始类型目前无法进行Natvizzed。但是,如果您想要查看的特定基元是您可以观看的其他类型的成员,则可以将格式应用于该类型,例如

<!-- displays the double value as 0.000 -->
<Type Name="DoubleHolder">
  <DisplayString>{(int)myDouble}.{(int)(myDouble*1000) % 1000}</DisplayString>
</Type>

答案 3 :(得分:2)

基于Overlord Zurg's answer,用以下三个数字显示m_x的值:

<Type Name="Point">
  <DisplayString>
    {(int)m_x}.{(int)(10*m_x) % 10}{(int)(100*m_x) % 10}{(int)(1000*m_x) % 10}
  </DisplayString>
</Type>

还要考虑负数:

<Type Name="Point">
  <DisplayString>
    {(int)m_x}.{(int)((m_x&lt;0?-1:1)*10*m_x) % 10}{(int)((m_x&lt;0?-1:1)*100*m_x) % 10}{(int)((m_x&lt;0?-1:1)*1000*m_x) % 10}
  </DisplayString>
</Type>

答案 4 :(得分:1)

我知道的唯一方法是编写本机可视化DLL。请参阅this answer to the question "How to write a custom native visualizer DLL for Visual Studio 2012 debugger?"

我已经成功地使用了这个,以及在该答案中链接的源,编写自定义可视化工具,以我想要的精度显示各种类型的浮点成员。

答案 5 :(得分:0)

你无法控制这一点。我们能够比默认视图更好地获得 little 一些东西,但是,通过将我们的双精度数转换为浮点数进行预览:

<DisplayString>{{x={(float)x} y={(float)y}}}</DisplayString>

我们在展开的版本中将它们留作双打,以便您可以看到真正的价值。这足以让我们水平地打包四个或五个值,而不是通常的三个。这仍然有一些缺点:浮动上的最后几位数字将是垃圾,并且可能会让你认为你有精确错误,而事实上你并不是。但是,在微软为数字输出添加适当的格式说明符之前,这可能是我们能做的最好的。

顺便说一下,你可能会得到一个类似的&#34;切碎精度&#34;通过将浮点数转换为整数,如果值通常足够大。