问题标签 [natvis]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
926 浏览

c++ - 使 .natvis 显示 SmartPointer作为 static_cast(空白*)

E2<T>是一个智能指针。

要启用E2<T>->aField鼠标悬停在其上方时的工具提示,我可以创建.natvis如下:-

.cpp

.natvis

结果

在此处输入图像描述

问题

void*如果内容在基类中,则上述方法不起作用E1

.cpp

.natvis(不起作用 - 没有工具提示出现)

问题

如何修改.natvis以使工具提示显示void*在基类(E1)中?

0 投票
1 回答
537 浏览

c++ - 函数本地结构/类和 natvis 文件

假设我必须遵循结构:

我的 natvis 文件中有以下内容:

今天发现 natvis 文件提供的调试辅助在这种情况下不起作用:

但适用于那个:

如果有人有解决方案,我将非常感激,因为这是一种限制。但这对我来说似乎是一个错误。

0 投票
2 回答
2697 浏览

c++ - 有没有办法解决“这个表达式有副作用,不会被评估。”?

在 Visual Studio 2017 中,我创建了一个调用 C++ 函数的 .natvis 调试器可视化规则。

在调试器中显示:

This expression has side effects and will not be evaluated.

除此之外,它显示了一个蓝色的小箭头,可以单击它来强制它进行评估,然后它实际上确实调用了该函数。(我认为这可能是最近的一个功能,因为我似乎记得在 VS2013 中尝试过这个并且不记得它有绕过)

我的问题是:有什么方法可以永久绕过此安全检查,以便它始终立即评估我的功能并且不需要我点击箭头?

我看过一个非常相似的问题: “这个表达式会导致副作用,不会被评估”。怎么压制?其中接受的答案仅对 C# 有效(在 C# 表达式的末尾添加 ,ac 会强制调试器自动重新评估它)

我想如果存在这样的事情,它将是以下机制之一:

  1. 始终禁用安全检查的注册表设置或其他全局设置。
  2. 一种注释代码或 .natvis 规则的方法,以便编译器以某种方式知道它是一个安全且纯粹的无副作用函数

提供有关应用程序的更多详细信息:我们在代码中到处使用 uint32,它们是从字符串散列而来的,并且我们有一个仅在开发版本中加载的字符串数据库。解码函数在二叉搜索树中查找 u32 ID,返回在存储节点中找到的字符串。所以我知道它完全没有副作用,而且速度足够快,不会损害调试体验,每次 .natvis 规则都这么说时调用函数。

0 投票
2 回答
1936 浏览

c++ - Visual Studio Natvis DisplayString 条件

使用 Visual Studio 2017,我正在为某些类编写 Visualizer,但我遇到了 .natvis 代码可读性方面的问题。我有一个自定义 Array 类型,我想直接在Watch窗口的Value字段中显示它的成员(而不是必须使用展开按钮)。

arrayType是一个定义数组类型(稀疏、空、密集、单例)的枚举。 numElems是数组中的条目数。无需关注这个数据结构;这只是一个例子。这是我当前的 natvis 代码:

[请注意,我必须再次重复相同的代码(只是添加一个额外的元素来显示)。由于代码膨胀,我停止显示 3 个元素。]

这将允许监视窗口(在 Visual Studio 中)以下列方式显示对象:

理想情况下,DisplayString 标记将允许其中包含条件。我用 C++ 三元运算符尝试了以下解决方法,但没有奏效。

请注意,在此代码中,我不必多次重复 DisplayString 标记和重复代码。也许有一种方法可以在 DisplayString 中提供一个迭代器,以便列出所有(可变数量的)元素?我知道 ArrayItems 标记,但它必须在 Expand 标记中使用(同样,我试图在Value字段中显示数组元素(无需单击展开按钮))。

有什么建议么?需要澄清吗?谢谢!

0 投票
1 回答
1268 浏览

visual-studio-2015 - VisualStudio .natvis:我可以在 CustomListItems 中有一个自定义复杂项吗?

在 C++ 中,我有一个想要可视化的整数数组,其中的元素如下所示:

因此,我想将其可视化为具有自定义表示,其中每个可视化项目都类似于[0] <1253-1320>[1] <1852-2528>等等

目前,我有这个(没有给我想要的结果):

但我希望每个项目都像这样(在 DisplayString 语法中):

由于 item 元素的内容不能是这个,我似乎无法做到这一点。此外,我看不到在可视化器中定义字符串(或字符数组)变量并在 Item 元素之前构造它的方法 - 最重要的是,可视化器没有可用的字符串修饰符内在函数。在项目的 Name 属性中执行此操作不是一个选项,因为我需要在 Value 列中使用它。

可以以某种方式完成吗?

编辑:是实现我想要的视图所需的请求。

0 投票
1 回答
2089 浏览

c++ - 有没有一种方法可以自动将 .natvis 附加到使用 -DebugExe 启动的调试会话?

我正在使用一个在其树中包含 .natvis 的解决方案。工作流程要求我经常使用 devenv.exe 的/DebugExe 开关启动各种解决方案的可执行文件的调试会话。但是当以这种方式启动时,调试器不会使用 .natvis 文件。

我曾尝试将/Command 开关Add Existing Item command一起使用,但看起来由于调试的 .exe 不是正确的解决方案或项目,因此无法向其中添加任何内容(至少我失败了)。

所以问题是:有没有一种方法可以在 /DebugExe 会话中使用放置在任意路径中的 .natvis(而不是 VisualStudio 会自动使用它的用户配置文件)?

0 投票
1 回答
203 浏览

xml - 如何使用本机可视化器在不同的解决方案中处理相似的类名

在我的公司,我们正在使用原生可视化工具(.natvis 文件)来调试 Visual Studio 中的内存转储。

由于我们对不同的项目有相同的类名,我们正在考虑在项目定义中包含 .natvis 文件,这似乎是可行的:.natvis 文件在构建期间嵌入到符号文件 (*.pdb) 中,这是一件好事。

不幸的是,现在似乎不可能进行任何自定义:从两个 .natvis 文件(PC 上的文件和符号文件中的文件)中,符号文件中的一个优先,这使得它无法更改,因此似乎没有自定义可能了。

为了拥有可定制的 .natvis 文件,我们正在考虑更改 .natvisreload 序列。这是可能的还是有另一种方法(比如向.natvisreload命令添加参数)?

0 投票
1 回答
282 浏览

c++ - 可以编译成 dll 或 lib 的类型的 Natvis

我在visual studio中有一个解决方案,它有一个配置允许每个项目静态链接到主exe,另一个配置将每个项目编译为自己的dll。

我的想法是我可以使用 DLL 进行开发,从而最大限度地减少编译和链接期间的停机时间,但是当我向公众发布时,只有一个 exe。

不幸的是,这意味着在其中一个项目中创建的类型似乎需要 2 个 natvis 文件,以便可以在任一配置中进行调试。

除了 myProject.dll 之外,这 2 个 natvis 文件是相同的!应用于 dll 配置的 natvis 中的所有命名空间的前缀。(运行静态链接的 exe 时,包含对 dll 中类型的引用的 natvis 失败,导致整个文件被忽略,而不仅仅是那个类型)

这种情况的最佳解决方案是否只是为每种类型维护 2 个 natvis 文件?是否可以从模板生成 natvis?是否可以对 dll 的引用是可选的?

(我使用的是 Visual Studio 2015,但如果 2017+ 有解决方案,请告诉我)

谢谢

0 投票
2 回答
203 浏览

c++ - Natvis FourCC 可视化语法

我正在尝试为一个uint32_t类型定义一个 .natvis <DisplayString> ,以显示为一个由四个字符组成的数组,在调试期间,在 Watch 窗口中,它的表达方式有点像这样:(char*)&fourcc,4

不幸的是,natvis 似乎不太喜欢 & - 它会被忽略,例如,{(char*)&fourcc,4}不起作用。如果完全支持,文档并没有明确说明如何执行强制转换。{(char*)&{fourcc},4{((char*)&)fourcc,4}

我错过了什么?

0 投票
1 回答
256 浏览

c++ - 如何(临时)使用 natvis 对 CPtrList 条目进行类型转换?

我正在使用基于 STL 的 C++ 解决方案,并且正在使用 CPtrList 集合。

我这里有一个 CPtrList 集合,其中包含void *条目,我想使用 natvis 文件自动对它们进行类型转换。

目前,我的 natvis 如下所示:

因此,我的 CPtrList 的条目如下所示:

我希望将条目类型转换为如下内容:

一旦我知道如何完成这项工作,我可以在我的 natvis 中添加一个“SL_SET_PARAMETER”条目并决定如何显示它,但因此我首先需要向 natvis 解释每个 CPtrList 条目都应该转换为一个“SL_SET_PARAMETER”对象。

有人知道怎么做这个吗?