【问题标题】:Can I control the number of digits displayed in debugger windows for float and double variables?我可以控制在调试器窗口中显示的浮点数和双精度变量的位数吗?
【发布时间】:2014-01-08 12:39:19
【问题描述】:

在 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 的格式说明符,但没有找到控制浮点精度的方法。

【问题讨论】:

  • 你能在显示之前将每个值作为一个字符串(或转换它)吗?如果是的话,我可能有一个解决方案。等待您的答复..?
  • @KhaledHassan 我可以,在很多地方我们都这样做是为了调试输出,但对于广泛使用的类型,我不想更改实际来源。我真的在寻找一种方法来调整调试器呈现双精度的方式。
  • @MarkRansom 谢谢。原生可视化文件很棒,但不幸的是,它似乎没有添加任何额外的选项来显示在自动或即时窗口中尚不可用的原始数值。

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


【解决方案1】:

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

【讨论】:

  • 谢谢,我害怕那个。在可以使用十六进制显示来调整精度的菜单附近有一个选项是否有意义?尤其是在我一次看到很多科学计数法值的情况下,将重要的数字(即前导数字和指数)与不重要的值(中间的所有垃圾)分开会很痛苦。
【解决方案2】:

原始类型目前不能被 NatVizzed。但是,如果您要查看的特定原语是您可以查看的另一种类型的成员,则可以将格式应用于该类型,例如

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

【讨论】:

  • 很遗憾,这行不通。考虑一下它将如何显示值 1.005:您会看到“1.5”,这充其量是误导。
【解决方案3】:

您对此没有太多控制权。然而,通过将我们的双打转换为浮点数以进行预览,我们能够获得比默认视图更好的一点

&lt;DisplayString&gt;{{x={(float)x} y={(float)y}}}&lt;/DisplayString&gt;

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

顺便说一句,如果值通常足够大,您可以通过将浮点数转换为整数来获得类似的“切分精度”。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 是的,它适用于我,但不适用于原始 VS 2015 发行版。我需要更新到 Service Pack 2。我不知道该功能是在更新 1 还是 2 中引入的。
      【解决方案6】:

      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>
      

      【讨论】:

        猜你喜欢
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多