标签: natvis

我正在寻找一种在VS2012中通过NatVis显示UUID的正确方法

我正在寻找一种在VS2012中通过NatVis显示UUID的正确方法.我自己的uuid类型在内部使用UUID big-endian,因此转换为(GUID*)不起作用,因为GUID在Windows中使用little-endian.所以我总是看到一个歪曲的uuid.

此外,Natvis中的任何格式说明符看起来都不好,因为在使用十六进制表示法时我无法摆脱输出中的0x.有任何想法吗?

c++ debugging visual-studio-debugging visual-studio-2012 natvis

16
推荐指数
3
解决办法
2130
查看次数

使用 std::type_info 在 natvis 中进行转换

在我正在工作的代码库中,我们使用std::any而不是void*通过一些通用的非模板代码来传递类。具体来说,我们使用 Visual Studio 2019、它的编译器和标准库。

为了可视化std::any,微软已经给出了一个natvis:

  <Type Name="std::any">
      <Intrinsic Name="has_value"   Expression="_Storage._TypeData != 0"/>
      <Intrinsic Name="_Rep"        Expression="_Storage._TypeData &amp; _Rep_mask"/>
      <Intrinsic Name="type"        Expression="(const type_info*)(_Storage._TypeData &amp; ~_Rep_mask)"/>
      <Intrinsic Name="_Is_trivial" Expression="has_value() &amp;&amp; _Rep() == 0"/>
      <Intrinsic Name="_Is_big"     Expression="has_value() &amp;&amp; _Rep() == 1"/>
      <Intrinsic Name="_Is_small"   Expression="has_value() &amp;&amp; _Rep() == 2"/>
      <DisplayString Condition="!has_value()">[empty]</DisplayString>
      <DisplayString Condition="_Is_trivial() || _Is_small()">[not empty (Small)]</DisplayString>
      <DisplayString Condition="_Is_big()">[not empty (Large)]</DisplayString>
      <Expand>
          <Synthetic Name="has_value">
              <DisplayString>{has_value()}</DisplayString>
          </Synthetic>
          <Synthetic Name="type" Condition="has_value()">
              <DisplayString>{type()}</DisplayString>
          </Synthetic>
          <Synthetic Name="[representation]" Condition="_Is_trivial()">
              <DisplayString>(Small/Trivial Object)</DisplayString>
          </Synthetic>
          <Synthetic Name="[representation]" …
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio natvis c++17

15
推荐指数
1
解决办法
926
查看次数

使用 .natvis 文件在 VS Code 中可视化 C++ 对象

根据此链接,.natvis 文件可用于可视化本机对象。具体来说,我希望能够Eigen::Matrix使用这个 .natvis 文件检查对象。

但是,上面的链接不包含有关如何在 VS Code 中实际使用 .natvis 文件的任何信息。是否可以使用自定义 .natvis 文件?

这是我的 launch.json 文件以供参考:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++-8 build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb", …
Run Code Online (Sandbox Code Playgroud)

c++ ubuntu g++ natvis visual-studio-code

11
推荐指数
1
解决办法
2043
查看次数

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

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

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

我查看了此页面上的格式说明符,但没有看到控制浮点精度的方法.

c++ debugging visual-studio-2012 natvis

9
推荐指数
2
解决办法
4003
查看次数

用户在Visual Studio 2012中定义的natvis文件

我正在尝试在我的项目中使用新的调试可视化工具,但是Visual Studio发生了一些事情,它不再获取我的natvis文件.我尝试将它们复制到%USERPROFILE%\My Documents\Visual Studio 2012\Visualizers以及\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Packages\Debugger\Visualizers它仍然失败.

它在一周前确实有效,但从那以后出现了一些问题.

我尝试修复Visual Studio但它没有帮助.

我尝试EnableNatvisDiagnostics在注册表中启用但我没有得到任何诊断消息Output window.

预安装的natvis文件工作正常.所以我试图删除一个预先安装的natvis文件:stl.natvis来自Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Packages\Debugger\Visualizers但Visual Studio仍然显示vector它好像有权访问stl.natvis文件.有人知道如何解决这个问题吗?Visual Studio是否还有其他位置加载natvis文件?也许有一个注册表项?

PS.我试图ProcessMonitor找出Visual Studio加载natvis文件的位置,但我在ProcessMonitors日志中找不到任何引用.

c++ debuggervisualizer visual-studio-2012 natvis

8
推荐指数
1
解决办法
3849
查看次数

Natvis 浮点格式

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

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

矩阵 3x3

华丽,对吧?我的下午没有后悔。

但是,现在我们要处理一个稍微复杂的案例:

矩阵 4x4

如您所见,数字不对齐。我想出了一个办法 讨厌缸与正数得到负数对齐,但我的方法没有接近这个(这是我的基本轮廓)的方式:

<Type ...>
    <DisplayString>...</DisplayString>
    <Expand ...>
        <Synthetic ...>
            <DisplayString ...>...</DisplayString>
        </Synthetic>
        ...
    </Expand>
</Type>
Run Code Online (Sandbox Code Playgroud)

发生的事情是打印的数字数量因数字而

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


PS:如果我能成功,我很乐意上传生成“.natvis”文件的 Python 脚本,供你们玩自己的类型。

natvis visual-studio-2015

7
推荐指数
1
解决办法
1441
查看次数

.natvis - 如何引用模板模板参数?

我正在尝试.natvis为 Visual Studio创建一个文件。根据此页面,我可以使用等引用模板参数$T1, $T2。所以在MyClass<A> $T1will 引用类型的情况下A。这有效。但在我的情况下A是一个模板本身,我需要引用它的参数,某种$T1<$T1>- 但这显然不起作用。

c++ debugging visual-studio natvis

7
推荐指数
1
解决办法
1642
查看次数

Visual Studio 2015 Natvis如何显示函数静态变量?

我正在使用Microsoft Visual Studio 2015中的.natvis文件编写调试器可视化工具.如果可能的话,我想在课程中提供一条信息.我想知道获取该变量的语法是什么.

这是C++代码的简化版本:

class MyClass
{
public:

    MyClass() {}

    int getAValue(size_t index)
    {
        static std::vector<int> numberVector;

        if (numberVector.size() <= index)
        {
            addSomeNumbersToTheEnd(numberVector);
        }

        return numberVector[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

在调试器中,当我将鼠标悬停在MyClass的实例上时,我希望看到向量的大小,但我不知道如何引用它(或者如果可能的话).这是可视化器类型,<what goes here?>在我遇到麻烦的地方:

<Type Name="MyClass">
    <DisplayString>[$(Type)] staticVectorSize={<what goes here?>}</DisplayString>
</Type>
Run Code Online (Sandbox Code Playgroud)

实际问题要复杂得多,包括奇怪的重复模板模式以创建更好的枚举对象,所以请不要评论这个有点人为的场景的无用性.

c++ static visual-studio natvis visual-studio-2015

6
推荐指数
1
解决办法
686
查看次数

Visual Studio natvis 语句的局部变量

我目前正在为 natvis 中的日期类型编写可视化工具。日期类型以通常的 Unix 方式存储自 1970 年以来的秒数,但如果不使用临时变量,从中导出年、月和日则极其冗长。我希望能够存储工作变量,以便以合理的方式评估可视化工具。这可能吗?

我得到的解决方案如下所示:

struct SLowResAbsoluteTime
{
    SLowResAbsoluteTime() : mTime(0) { calcDOE(); }
    SLowResAbsoluteTime(int year, SDate::EMonth m, SDate::EDayOfWeek day, UINT8 hour, UINT8 minute, UINT8 seconds);
    SLowResAbsoluteTime(const SDate &date);
    SLowResAbsoluteTime(unsigned long long time) : mTime(time) { calcDOE(); }
    SLowResAbsoluteTime(const SLowResAbsoluteTime &other) : mTime(other.mTime) { calcDOE(); }

    SDate getDate() const; //calculate date object from given time
    UINT32 getHour() const; 
    UINT32 getMinutes() const;
    UINT32 getSeconds() const;

    bool operator < (const SLowResAbsoluteTime &other) const { return mTime < other.mTime; } …
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio natvis

6
推荐指数
1
解决办法
728
查看次数

访问 Visual Studio ImageWatch 插件的 .natvis 文件中的矢量基础数据

问题

与这个问题类似,我尝试将ImageWatch插件用于我自己定义的类型MyImageClass。ImageWatch 是一个 Visual Studio 插件,允许您在调试代码时以图形表示形式查看图像。您可以编写 .natvis 文件来添加对自定义定义类的支持。

struct MyImageClass
{
  uint32_t width;
  uint32_t height;
  std::vector<char> image_data;
}
Run Code Online (Sandbox Code Playgroud)

ImageWatch 插件需要char*图像数据的类型,但是我将数据存储在std::vector<char>. 我的 .natvis 文件非常简单(您可以跳过它,只是为了完整性)

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> 
  <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1"
            MenuName="Add to Image Watch"/> 
  <Type Name="MyImageClass">
    <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
  </Type>

  <Type Name="MyImageClass">
    <Expand>
      <Synthetic Name="[type]">
        <DisplayString>UINT8</DisplayString>
      </Synthetic>
      <Item Name="[channels]">1</Item>
      <Item Name="[width]">width</Item>
      <Item Name="[height]">height</Item>
      <Item Name="[planes]">1</Item>
      <Item Name="[data]">image_data</Item>
      <Item Name="[stride]">width</Item>
    </Expand>
  </Type>  
</AutoVisualizer>
Run Code Online (Sandbox Code Playgroud)

但下面这行我很挣扎<Item Name="[data]">image_data</Item>。图像数据分配不起作用,我无法在查看器中看到图像。相反,我收到消息“无效”。显然,这是因为image_datais a …

visual-studio-debugging natvis

5
推荐指数
2
解决办法
1787
查看次数