Visual Studio调试器指南---Natvis 语法参考

【VS】【Qt】vs+ qt .natvis 失效问题 qstring调试乱码 .natvis文件用于调试时候自定义显示自定义类型的可视化提示。 一般这类文件存在 C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\Packages\Debugger\Visualizers路径下。.natvis文件的规则在此不介绍,详见官网:在调试器中创建本机对象的自定义视图在natvis失效的时候,检查以下选项是否被勾选,如果是,则解除勾选 如果没勾选还是无法显示正确的自定义试图,则考虑是否natvis文件出错 阅读详情

转自:Visual Studio调试器指南---Natvis 语法参考 - 活着的虫子 - 博客园

AutoVisualizer 元素

AutoVisualizer 元素是 .natvis 文件的根节点,并包含命名空间 xmlns: 属性。

XML

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
.
.
</AutoVisualizer>

AutoVisualizer 元素可以具有类型、 HResult、 UIVisualizer和CustomVisualizer子项。

Type 元素

基本 Type 如下例所示:

XML

<Type Name="[fully qualified type name]">
  <DisplayString Condition="[Boolean expression]">[Display value]</DisplayString>
  <Expand>
    ...
  </Expand>
</Type>

Type 元素指定:

  1. 可视化对象应使用的类型(Name 特性)。

  2. 该类型的对象的值是什么样的( DisplayString 元素)。

  3. 用户在变量窗口中展开类型时,该类型的成员应当以什么形式显示(Expand 节点)。

模板类

Type 元素的 Name 属性接受星号 * 作为可用于模板化类名的通配符。

在以下示例中,无论对象是 CAtlArray<int> 还是 CAtlArray<float>,都使用了相同的可视化效果。 如果 CAtlArray<float> 有特定的可视化条目,它的优先级将高于通用的条目。

XML

<Type Name="ATL::CAtlArray&lt;*&gt;">
    <DisplayString>{{Count = {m_nSize}}}</DisplayString>
</Type>

可以使用 $T1 和 $T2 这样的宏,在可视化条目中引用模板参数。 有关这些宏的示例,请参阅 Visual Studio 随附的 .natvis 文件。

可视化工具类型匹配

如果无法验证某个可视化条目,则使用下一个可用的可视化效果。

可继承的特性

可选的 Inheritable 属性用于指定,一个可视化效果是仅适用于一个基类型,还是适用于一个基类型和所有的派生类型。 Inheritable 的默认值为 true。

在下面的示例中,可视化效果仅适用于 BaseClass 类型:

XML

<Type Name="Namespace::BaseClass" Inheritable="false">
    <DisplayString>{{Count = {m_nSize}}}</DisplayString>
</Type>

优先级特性

如果某个定义的分析失败,可选的 Priority 属性会指定使用备用定义的顺序。 Priority 的值包括:Low、MediumLow、Medium、MediumHigh 和High。 默认值是 Medium。 Priority属性只区分同一个 .natvis 文件中的优先级。

下面的示例会首先分析与 2015 STL 匹配的条目。 如果分析失败,就会使用 STL 的 2013 版本的备用条目:

XML

<!-- VC 2013 -->
<Type Name="std::reference_wrapper&lt;*&gt;" Priority="MediumLow">
     <DisplayString>{_Callee}</DisplayString>
    <Expand>
        <ExpandedItem>_Callee</ExpandedItem>
    </Expand>
</Type>

<!-- VC 2015 -->
<Type Name="std::reference_wrapper&lt;*&gt;">
    <DisplayString>{*_Ptr}</DisplayString>
    <Expand>
        <Item Name="[ptr]">_Ptr</Item>
    </Expand>
</Type>

可选特性

你可以将 Optional 属性放在任一节点上。 如果某个可选节点内的某个子表达式的分析失败,调试器就会忽略该节点,但会应用 Type 规则的其余部分。 在下面的类型中, [State] 不可选,但 [Exception] 可选。 如果 MyNamespace::MyClass 包含名为 M_exceptionHolder 的字段,就会同时显示 [State] 节点和 [Exception] 节点,但如果不包含 _M_exceptionHolder 字段,就会只显示 [State] 节点。

XML

<Type Name="MyNamespace::MyClass">
    <Expand>
      <Item Name="[State]">_M_State</Item>
      <Item Name="[Exception]" Optional="true">_M_exceptionHolder</Item>
    </Expand>
</Type>

条件属性

可选的 Condition 属性可用于许多可视化元素,指定何时使用可视化规则。 如果条件属性内的表达式解析为 false,就不应用可视化规则。 如果其计算结果为 true,或者没有 Condition 属性,就会应用可视化规则。 你可以将此属性用于可视化条目中的 if-else 逻辑。

例如,下面的可视化对象具有智能指针类型的两个 DisplayString 元素。 当 _Myptr 成员为空时,第一个 DisplayString 元素的条件解析为 true,以便显示该窗体。 如果 _Myptr 成员不为空,则条件的计算结果为 false,第二个 DisplayString 元素显示。

XML

<Type Name="std::auto_ptr&lt;*&gt;">
  <DisplayString Condition="_Myptr == 0">empty</DisplayString>
  <DisplayString>auto_ptr {*_Myptr}</DisplayString>
  <Expand>
    <ExpandedItem>_Myptr</ExpandedItem>
  </Expand>
</Type>

IncludeView 和 ExcludeView 特性

IncludeView 和 ExcludeView 属性用于指定是否在特定视图内显示元素。 例如,在下面的 Natvis std::vector 规范中,simple 视图不显示 [size] 和[capacity] 项。

XML

<Type Name="std::vector&lt;*&gt;">
    <DisplayString>{{ size={_Mylast - _Myfirst} }}</DisplayString>
    <Expand>
        <Item Name="[size]" ExcludeView="simple">_Mylast - _Myfirst</Item>
        <Item Name="[capacity]" ExcludeView="simple">_Myend - _Myfirst</Item>
        <ArrayItems>
            <Size>_Mylast - _Myfirst</Size>
            <ValuePointer>_Myfirst</ValuePointer>
        </ArrayItems>
    </Expand>
</Type>

可以针对类型和各个成员使用 IncludeView 和 ExcludeView 属性。

Version 元素

Version 元素用于将可视化条目的范围限定在特定模块和版本内。 Version 元素有助于避免名称冲突、减少无意间的不匹配,还允许在不同的类型版本中使用不同的可视化效果。

如果某个由不同模块使用的公共头文件定义了一个类型,则只有当该类型位于指定的模块版本中时,版本化的可视化效果才会显示。

在下面的示例中,可视化效果只适用于在 DirectUI::Border 版本 1.0 到 1.5 中找到的 Windows.UI.Xaml.dll 类型。

XML

<Type Name="DirectUI::Border">
  <Version Name="Windows.UI.Xaml.dll" Min="1.0" Max="1.5"/>
  <DisplayString>{{Name = {*(m_pDO->m_pstrName)}}}</DisplayString>
  <Expand>
    <ExpandedItem>*(CBorder*)(m_pDO)</ExpandedItem>
  </Expand>
</Type>

不需要 Min 和 Max。 它们是可选属性。 不支持通配符。

Name 特性的格式为filename. ext,如hello或some。 不允许使用路径名。

DisplayString 元素

DisplayString 元素用于指定要显示为变量值的字符串。 它接受混合表达式的任意字符串。 大括号内的所有内容都可解释为表达式。 例如,以下DisplayString 条目:

XML

<Type Name="CPoint">
  <DisplayString>{{x={x} y={y}}}</DisplayString>
</Type>

表示 CPoint 类型的变量显示如下图所示:

在 DisplayString 表达式中,属于 x 成员的 y 和 CPoint 位于大括号内,因此它们的值会被计算。 该示例还介绍了如何用双层大括号({{ 或 }})对大括号进行转义。

备注

DisplayString 元素是唯一接受任意字符串和大括号语法的元素。 所有其他可视化元素只接受调试器可以计算的表达式。

StringView 元素

StringView 元素用于定义一个值,调试器可以将该值发送给内置的文本可视化工具。 例如,假设 ATL::CStringT 类型有以下可视化效果:

XML

<Type Name="ATL::CStringT&lt;wchar_t,*&gt;">
  <DisplayString>{m_pszData,su}</DisplayString>
</Type>

CStringT 对象将显示在一个变量窗口中,如下例所示:

添加 StringView 元素会告诉调试器,它可以将值显示为文本可视化。

XML

<Type Name="ATL::CStringT&lt;wchar_t,*&gt;">
  <DisplayString>{m_pszData,su}</DisplayString>
  <StringView>m_pszData,su</StringView>
</Type>

在调试过程中,可以选择变量旁边的放大镜图标,然后选择 "文本可视化工具" 以显示m_pszData指向的字符串。

表达式 {m_pszData,su} 包含一个 C++ 格式说明符 su,用于将值显示为 Unicode 字符串。 有关详细信息,请参阅 C++ 中的格式说明符。

Expand 元素

可选的 Expand 节点用于自定义当你在变量窗口中展开类型时,该可视化类型的子项。 Expand 节点接受用于定义子元素的子节点列表。

  • 如果未在可视化条目中指定 Expand 节点,子项将使用默认的展开规则。

  • 如果指定的 Expand 节点下面没有子节点,类型就无法在调试器窗口中展开。

Item 展开

Item 元素是 Expand 节点中最基本、最常见的元素。 Item 定义单个子元素。 例如,一个包含 CRect、top、left 和 right 字段的 bottom 类具有以下可视化条目:

XML

<Type Name="CRect">
  <DisplayString>{{top={top} bottom={bottom} left={left} right={right}}}</DisplayString>
  <Expand>
    <Item Name="Width">right - left</Item>
    <Item Name="Height">bottom - top</Item>
  </Expand>
</Type>

在调试器窗口中,CRect 类型如下例所示:

调试器将计算 Width 和 Height 元素中指定的表达式,然后在变量窗口的值列中显示值。

调试器会为每个自定义展开自动创建 [Raw View] 节点。 上面的屏幕截图中的 [Raw View] 节点是展开的,显示了对象的默认原始视图与其 Natvis 可视化效果的区别。 默认展开会为基类创建一个子树,并将基类的所有数据成员以子项的形式列出。

备注

如果项元素的表达式指向复杂类型,则项节点本身是可展开的。

Size

使用 ArrayItems 节点,让 Visual Studio 调试器将类型解释为一个数组并显示其各个元素。 std::vector 的可视化效果是一个很好的示例:

XML

<Type Name="std::vector&lt;*&gt;">
  <DisplayString>{{size = {_Mylast - _Myfirst}}}</DisplayString>
  <Expand>
    <Item Name="[size]">_Mylast - _Myfirst</Item>
    <Item Name="[capacity]">(_Myend - _Myfirst)</Item>
    <ArrayItems>
      <Size>_Mylast - _Myfirst</Size>
      <ValuePointer>_Myfirst</ValuePointer>
    </ArrayItems>
  </Expand>
</Type>

std::vector 在变量窗口中展开时显示其自身的元素:

ArrayItems 节点必须具有:

  • 用于使调试器了解数组长度的 Size 表达式(必须计算为整数)。
  • 一个 ValuePointer 表达式,指向第一个元素(必须为非 void* 元素类型的指针)。

数组下限的默认值为 0。 要修改此值,请使用 LowerBound 元素。 Visual Studio 随附的 .Natvis 文件中提供了示例。

备注

可以使用 [] 运算符(例如 vector[i])以及任何使用了 ArrayItems 的一维数组可视化效果,即使该类型本身(例如 CATLArray)不允许使用此运算符。

还可以指定多维数组。 在这种情况下,调试器需要稍微详细地显示子元素:

XML

<Type Name="Concurrency::array&lt;*,*&gt;">
  <DisplayString>extent = {_M_extent}</DisplayString>
  <Expand>
    <Item Name="extent">_M_extent</Item>
    <ArrayItems Condition="_M_buffer_descriptor._M_data_ptr != 0">
      <Direction>Forward</Direction>
      <Rank>$T2</Rank>
      <Size>_M_extent._M_base[$i]</Size>
      <ValuePointer>($T1*) _M_buffer_descriptor._M_data_ptr</ValuePointer>
    </ArrayItems>
  </Expand>
</Type>
  • Direction 指定数组是采用行优先顺序还是列优先顺序。
  • Rank 指定数组的秩。
  • Size 元素接受将其替换为维索引以查找该维度中数组的长度的隐式 $i 参数。 在前面的示例中,表达式 _M_extent.M_base[0] 应为第0个维度指定长度,_M_extent._M_base[1] 为1,依此类推。

下面是调试器窗口中显示的一个二维 Concurrency::array 对象:

IndexListItems 展开

仅当数组元素在内存中连续排列时,才能使用 ArrayItems 展开。 调试器只需递增其指针,就可以获取下一个元素。 如果你需要操作值节点的索引,可以使用 IndexListItems 节点。 下面是 IndexListItems 节点的可视化处理:

XML

<Type Name="Concurrency::multi_link_registry&lt;*&gt;">
  <DisplayString>{{size = {_M_vector._M_index}}}</DisplayString>
  <Expand>
    <Item Name="[size]">_M_vector._M_index</Item>
    <IndexListItems>
      <Size>_M_vector._M_index</Size>
      <ValueNode>*(_M_vector._M_array[$i])</ValueNode>
    </IndexListItems>
  </Expand>
</Type>

ArrayItems 和 IndexListItems 之间的唯一区别是 ValueNode,它期望带有隐式元素 参数的第 i$i 个元素的完整表达式。

备注

可以使用 [] 运算符(例如 vector[i])以及任何使用了 IndexListItems 的一维数组可视化效果,即使该类型本身(例如 CATLArray)不允许使用此运算符。

LinkedListItems 展开

如果可视化类型表示一个链接列表,则调试器可以通过使用 LinkedListItems 节点显示其子级。 以下 CAtlList 类型的可视化效果使用 LinkedListItems:

XML

<Type Name="ATL::CAtlList&lt;*,*&gt;">
  <DisplayString>{{Count = {m_nElements}}}</DisplayString>
  <Expand>
    <Item Name="Count">m_nElements</Item>
    <LinkedListItems>
      <Size>m_nElements</Size>
      <HeadPointer>m_pHead</HeadPointer>
      <NextPointer>m_pNext</NextPointer>
      <ValueNode>m_element</ValueNode>
    </LinkedListItems>
  </Expand>
</Type>

Size 元素引用该列表的长度。 HeadPointer 指向第一个元素, NextPointer 引用下一个元素,而 ValueNode 引用项的值。

调试器将在 NextPointer 节点元素(而不是父列表类型)环境中计算 ValueNode 和 LinkedListItems 表达式。 在前面的示例中,CAtlList 有一个 CNode类(位于 atlcoll.h 中),它是链接列表的节点。 m_pNext 和 m_element 是 CNode 类(而不是 CAtlList 类)的字段。

ValueNode 可以保留为空或使用 this 来引用 LinkedListItems 节点本身。

CustomListItems 展开

CustomListItems 展开允许编写自定义逻辑,以遍历数据结构(如哈希表)。 使用 CustomListItems 来可视化数据结构,这些数据结构可以使用 C++ 表达式进行所有运算,但不太适合 ArrayItems、IndexListItems 或 LinkedListItems 模式。

借助在展开内定义的变量和对象,你可以在 Exec 展开中使用 CustomListItems 来执行内部代码。 可以将逻辑运算符、算术运算符和赋值运算符与 Exec 一起使用。 不能使用 Exec 来计算函数( C++表达式计算器支持的调试器内部函数除外)。

下面的 CAtlMap 可视化工具是一个很好的例子,其中的 CustomListItems 用得很恰当。

XML

<Type Name="ATL::CAtlMap&lt;*,*,*,*&gt;">
    <AlternativeType Name="ATL::CMapToInterface&lt;*,*,*&gt;"/>
    <AlternativeType Name="ATL::CMapToAutoPtr&lt;*,*,*&gt;"/>
    <DisplayString>{{Count = {m_nElements}}}</DisplayString>
    <Expand>
      <CustomListItems MaxItemsPerView="5000" ExcludeView="Test">
        <Variable Name="iBucket" InitialValue="-1" />
        <Variable Name="pBucket" InitialValue="m_ppBins == nullptr ? nullptr : *m_ppBins" />
        <Variable Name="iBucketIncrement" InitialValue="-1" />

        <Size>m_nElements</Size>
        <Exec>pBucket = nullptr</Exec>
        <Loop>
          <If Condition="pBucket == nullptr">
            <Exec>iBucket++</Exec>
            <Exec>iBucketIncrement = __findnonnull(m_ppBins + iBucket, m_nBins - iBucket)</Exec>
            <Break Condition="iBucketIncrement == -1" />
            <Exec>iBucket += iBucketIncrement</Exec>
            <Exec>pBucket = m_ppBins[iBucket]</Exec>
          </If>
          <Item>pBucket,na</Item>
          <Exec>pBucket = pBucket->m_pNext</Exec>
        </Loop>
      </CustomListItems>
    </Expand>
</Type>

TreeItems 展开

如果可视化类型表示一个树,则调试器可以通过使用 TreeItems 节点遍历该树并显示其子级。 下面是使用 TreeItems 节点的 std::map 类型的可视化效果:

XML

<Type Name="std::map&lt;*&gt;">
  <DisplayString>{{size = {_Mysize}}}</DisplayString>
  <Expand>
    <Item Name="[size]">_Mysize</Item>
    <Item Name="[comp]">comp</Item>
    <TreeItems>
      <Size>_Mysize</Size>
      <HeadPointer>_Myhead->_Parent</HeadPointer>
      <LeftPointer>_Left</LeftPointer>
      <RightPointer>_Right</RightPointer>
      <ValueNode Condition="!((bool)_Isnil)">_Myval</ValueNode>
    </TreeItems>
  </Expand>
</Type>

语法类似于 LinkedListItems 节点。 LeftPointer、RightPointer 和 ValueNode 是在树节点类的上下文中计算的。 ValueNode 可以保留为空或使用 this来引用 TreeItems 节点本身。

ExpandedItem 展开

通过将基类或数据成员的属性显示为可视化类型的子项,ExpandedItem 元素生成了一个聚合的子视图。 调试器将计算指定的表达式,并将结果的子节点附加到该可视化类型的子列表中。

例如,智能指针类型 auto_ptr<vector<int>> 通常显示为:

要查看矢量的值,就必须在变量窗口中穿过 _Myptr 成员,向下深入两个级别。 通过添加 ExpandedItem 元素,就可以从层次结构中去除 _Myptr 变量并直接查看矢量元素:

XML

<Type Name="std::auto_ptr&lt;*&gt;">
  <DisplayString>auto_ptr {*_Myptr}</DisplayString>
  <Expand>
    <ExpandedItem>_Myptr</ExpandedItem>
  </Expand>
</Type>

下面的示例介绍了如何将基类的属性聚合到一个派生类中。 假定 CPanel 类派生自 CFrameworkElement。 CFrameworkElement 节点的可视化会将基ExpandedItem 类的属性附加到 CPanel 类的子列表中,而不是重复这些属性。

XML

<Type Name="CPanel">
  <DisplayString>{{Name = {*(m_pstrName)}}}</DisplayString>
  <Expand>
    <Item Name="IsItemsHost">(bool)m_bItemsHost</Item>
    <ExpandedItem>*(CFrameworkElement*)this,nd</ExpandedItem>
  </Expand>
</Type>

关闭派生类的可视化匹配的 nd 格式说明符肯定在这。 否则,*(CFrameworkElement*)this 表达式将导致再次应用 CPanel 可视化,因为默认可视化类型匹配规则认为它是最适合的类型。 使用nd格式说明符指示调试器使用基类可视化,如果基类没有可视化效果,则使用默认扩展。

Synthetic Item 展开

ExpandedItem 元素通过消除层次结构提供更简单的数据视图,Synthetic 节点则恰好相反。 它允许您创建不是表达式结果的人工子元素。 人工智能元素可以具有其自己的子元素。 在下面的示例中, Concurrency::array 类型的可视化效果使用 Synthetic 节点向用户显示诊断消息:

XML

<Type Name="Concurrency::array&lt;*,*&gt;">
  <DisplayString>extent = {_M_extent}</DisplayString>
  <Expand>
    <Item Name="extent" Condition="_M_buffer_descriptor._M_data_ptr == 0">_M_extent</Item>
    <ArrayItems Condition="_M_buffer_descriptor._M_data_ptr != 0">
      <Rank>$T2</Rank>
      <Size>_M_extent._M_base[$i]</Size>
      <ValuePointer>($T1*) _M_buffer_descriptor._M_data_ptr</ValuePointer>
    </ArrayItems>
    <Synthetic Name="Array" Condition="_M_buffer_descriptor._M_data_ptr == 0">
      <DisplayString>Array members can be viewed only under the GPU debugger</DisplayString>
    </Synthetic>
  </Expand>
</Type>

HResult 元素

借助 HResult 元素,你可以自定义显示在调试器窗口中的 HRESULT 信息。 HRValue 元素必须包含要自定义的 HRESULT 的 32 位值。 HRDescription 元素包含要显示在调试器窗口中的信息。

XML


<HResult Name="MY_E_COLLECTION_NOELEMENTS">
  <HRValue>0xABC0123</HRValue>
  <HRDescription>No elements in the collection.</HRDescription>
</HResult>

UIVisualizer 元素

UIVisualizer 元素用于向调试器注册图形可视化工具插件。 图形可视化工具会创建一个对话框或其他界面,用符合其数据类型的方式显示变量或对象。 可视化工具插件必须被编写为 VSPackage,并且必须公开一项调试器可以使用的服务。 .Natvis 文件包含插件的注册信息,例如名称、所公开服务的 GUID 以及它可以直观显示的类型。

下面是 UIVisualizer 元素的示例:

XML

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
    <UIVisualizer ServiceId="{5452AFEA-3DF6-46BB-9177-C0B08F318025}"
        Id="1" MenuName="Vector Visualizer"/>
    <UIVisualizer ServiceId="{5452AFEA-3DF6-46BB-9177-C0B08F318025}"
        Id="2" MenuName="List Visualizer"/>
.
.
</AutoVisualizer>
  • ServiceId - Id 属性对用来标识 UIVisualizer。 ServiceId 是可视化工具包公开的服务的 GUID。 如果服务提供了多个可视化工具,Id 是用来区分它们的唯一标识符。 在上面的示例中,同一个可视化工具服务提供了两个可视化工具。

  • MenuName 属性用于定义可视化工具名称,该名称会显示在调试器的放大镜图标旁边的下拉列表中。 例如:

.natvis 文件中定义的每种类型都必须明确列出能够显示它的所有 UI 可视化工具。 调试器会将类型条目中的可视化工具引用与注册的可视化工具相匹配。 例如,下面的 std::vector 类型条目引用的是前一个示例中的 UIVisualizer。

 

XML

<Type Name="std::vector&lt;int,*&gt;">
  <UIVisualizer ServiceId="{5452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
</Type>

你可以在用于查看内存中位图的图像监视扩展中查看 UIVisualizer 的示例。

CustomVisualizer 元素

CustomVisualizer 是一个扩展点,用于指定你编写的 VSIX 扩展,以便在 Visual Studio 代码中控制可视化效果。 有关编写 VSIX 扩展的更多信息,请参阅 Visual Studio SDK。

编写自定义可视化工具比 XML Natvis 定义要费事得多,但 Natvis 在支持方面的限制对你没有影响。 自定义可视化工具有权访问所有的调试器扩展性 API,因此可以查询和修改调试对象进程,也可以与 Visual Studio 的其他部分通信。

可以在 Condition 元素上使用 IncludeView、ExcludeView 和 CustomVisualizer 属性。

限制

Natvis 自定义项适用于类和结构,但不能使用 typedef。

Natvis 不支持用于基元类型的可视化工具(例如 int、bool)或指向基元类型的指针。 在此方案中,一种选择是使用适合用例的格式说明符。 例如,如果您在代码中使用 double* mydoublearray,则可以在调试器的 "监视" 窗口中使用数组格式说明符,如表达式 mydoublearray, [100],这将显示前100个元素。

Qt4/5/6版本.natvis文件差异解析:解决VS调试中的常见可视化问题 本文深入解析了Qt4、Qt5和Qt6版本中.natvis文件的差异,重点对比了QString、QList等核心数据结构的可视化规则变迁。针对在Visual Studio调试中常见的Qt调试乱码问题,提供了从诊断日志分析、版本冲突隔离到项目级.natvis文件配置的完整解决方案,帮助开发者构建稳定高效的多版本Qt调试环境。 阅读详情

相关推荐

[C++][调试技巧] VS 中的 Debugger Visualizers 使用指南 (.natvis文件)

目录简介使用前的一些检查如何使用Visualizers(让.natvis文件生效)例子 简介 Debugger Visualizers 是微软在 Visual Studio 2013之后添加的功能. 可让程序员使用XMAL定义调试视窗的数据结构显示. 以更爽的方式来显示. Visual Studio 中STL容器的调试显示信息就是通过该功能实现的. 注意!只支持结构体和类 下面是示例图: 自定义数据视图支持中文显示. 当然,你也可以按照STL的格式来写,完全随你的心情 使用前的一些检查 1.首先,你需

八宝咸鱼 7218

vs natvis编写,自定义vs中变量的展示

vs 自定义变量显示

&Ψ的博客 1803

VC++ 6.0完整安装与维护指南:让经典开发环境在现代系统重生

在软件工程领域,向后兼容与遗留系统维护是持续存在的挑战,尤其涉及核心生产工具链的稳定性。其原理在于确保历史代码库能在原始编译环境中正确构建,避免因编译器差异导致的未定义行为。这一实践的技术价值在于保护既有投资,为技术栈迁移赢得时间窗口,是工业控制、嵌入式上位机等长周期系统的重要保障。应用场景广泛存在于需要维护90年代末至21世纪初MFC、ATL项目的企业环境中。本文聚焦于VC++ 6.0这一经典工具,详细解析其完整安装包组件构成,并提供在Windows 10/11等现代系统上的具体兼容性配置方案,涵盖MSD

过客阵营 -- 简单的就要最简单 410

VS Code C++可视化调试配置Natvis,查看Qt、STL变量内容

VS Code C++可视化调试配置Natvis,查看Qt、STL变量内容 可以查看QString、std::string、std::map等各种容器和其它类型的内容,而不是显示地址

izwmain的博客 5034

AI赋能C++调试:七大实战技巧提升开发效率

调试是软件开发中定位和修复缺陷的关键环节,其核心原理是通过断点、单步执行、变量观察等手段分析程序运行状态。传统调试依赖开发者手动操作,效率较低且对复杂问题(如内存泄漏、并发竞争)定位困难。AI技术的引入为调试带来了革命性变革,通过代码语义理解、模式识别和预测分析,将调试从“事后补救”升级为“预测-定位-修复”的智能闭环。在工程实践中,AI能辅助生成智能断点、解析自然语言问题描述、自动检测内存与并发错误,并可视化复杂数据结构,显著提升问题诊断效率。本文聚焦C++开发场景,结合AI代码补全、智能断点生成、自然语

weixin_34007886的博客 407

NatvisFile.natvis

将该文件添加到vs2015工程中,可以解决vs2015调试时无法查看stl(vector,string,list等容器类)值的问题,加入方法可以参考博主博客https://blog.youkuaiyun.com/u014552102/article/details/82466516

在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示

在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示 当我们在VS的C++中使用vector、list、map等这些STL容器,在开启调试的时候可以看到这样的信息: 然而在我们自己手写链表,调试的时候却要像这样一级一级展开,很是麻烦。 有时候会想,如果要能像STL里面的list那样子直接显示出来就方便许多。经过几番寻找,终于...

weixin_30647065的博客 318

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本

纯ai识别实现自动化脚本

专注安卓前沿科技 4785

Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示

在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示 阅读目录 在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示 使用 .natvis 文件 新建一个 .natvis 文件 自定义数组结构体/类 自定义非连续内存的数组结构体/类 自定义链表 自定义...

cxu123321的博客 1516

ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS

在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。

Dirge19的博客 1172

阿里云大模型ACP认证模拟考试(三)

【摘要】:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 3584

C++项目集成Posit数值格式:工程实践避坑指南与性能优化

在计算机数值计算领域,浮点数是表示实数的标准方式,遵循IEEE 754标准,广泛应用于科学计算、图形渲染和人工智能。其原理基于科学计数法,通过符号位、指数位和尾数位的组合来表示数值。然而,传统浮点数在处理极大/极小数值范围或对累积误差敏感的场景时,存在精度损失和舍入误差等固有限制。为了追求更高的数值精度和能效比,Posit作为一种新兴的实数表示格式被提出,它通过动态调整指数域和尾数域的分配,旨在用更少的比特位提供更优的精度和动态范围。在AI芯片、边缘计算等对性能和能效有极致要求的应用场景中,Posit展现出

weixin_33966095的博客 302

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

weixin_44240228的博客 1万+

UE5字符串处理深度解析:FString与FText性能优化与本地化实战

字符串处理是软件开发中的基础操作,涉及数据存储、解析与展示。其核心原理在于内存管理与编码格式,高效处理直接影响程序性能。在游戏开发与大型应用场景中,优化字符串操作能显著提升运行效率与用户体验。虚幻引擎5(UE5)为此提供了FString和FText两套核心方案,分别针对动态操作与本地化需求。FString采用写时复制和短字符串优化策略,适用于高频拼接与解析;而FText作为不可变类型,专为多语言支持与线程安全设计。掌握二者差异,能有效规避性能陷阱,并实现健壮的国际化和本地化功能。

weixin_30859423的博客 592

《FPGA接口与协议》专栏的说明与导航

《FPGA接口与协议》专栏的说明与导航(建议阅读)。

孤独的单刀 17万+

Android平台实现Airplay的方法及源代码

Airplay是由苹果公司推出的一项无线音视频传输技术,它允许用户将音频、视频和照片从iOS设备(如iPhone、iPad)或Mac电脑无线传输到支持Airplay的设备(如Apple TV、智能音箱等)。具体的解码和播放方式取决于你选择的库和技术。当Android设备启动AirplayService服务后,它将监听来自iOS设备的连接请求,并在建立连接后接收、解码和播放音视频数据。在AirplayService类的onStartCommand()方法中,我们需要处理Airplay的请求。

CyberLynxX的博客 1600

Natvis文件实现VS2013调试可视化(Debugger Visualizers)

1、natvis文件是干什么的? 微软提出使用一种.natvis的文件来定义一个类的对象在调试窗口时显示。 natvis的定义方式举例如下: <Type Name="std::list&lt;*&gt;"> <DisplayString>{{ size={_Mysize} }}</DisplayString> <...

$firecat利白的代码足迹$ 4671

8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术

NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。

烟云的计算 4267

natvis调试自定义可视化

linux上使用vscode可以全局搜索stl.natvis,使用visualizerFile配置指定文件。launch.json文件中需要添加"showDisplayString":true,解析错误提示。launch.json中指定,“visualizerFile”: “”针对dog类定义dog.natvis文件,内容如下。vs studio的natvis存放在。vscode指定natvis。microsoft官方示例。开发natvis工具。

daoer_sofu的专栏 940

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 529

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

vs2015调试时无法查看变量值(调试时无法查看string、vector等类型的值)

一、现象   最近使用vs2015调试C++程序,结果发现了一个很奇怪的问题:调试时无法查看stl里面string,vector,list等容器类的值了,如下图所示,调试时把鼠标移动到“str”这个变量上面,结果发现显示“str|{...}”,无法显示str的值了。   正常情况下调试时应该显示“hello world”才对,如下图所示:   二、问题产生的可能原因   问题发...

崔杰城的博客 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

vs studio配置可视化natvis插件

Ue4.natvis(只限C++) 配置前tips窗口查看变量值,只有地址信息,配置后可以查看变量具体的值 【拷贝到指定路径即可】[VisualStudioInstallPath]/Common7/Packages/Debugger/Visualizers/UE4.natvis Vs配置系统 工具–&gt;选项-&gt;调试-&gt;在变量窗口中显示对象的原始结构(取消勾选) ...

daoer_sofu的专栏 2092

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VS2019自定义调试可视化:Natvis 可视化框架

摘要:Natvis是Visual Studio专为C/C++调试设计的可视化框架,通过XML文件定义规则,优化复杂数据结构(如结构体、模板、链表等)在调试时的显示效果。支持实时生效、无代码侵入,可配置条件显示、数组/树可视化等高级功能。使用方法包括创建项目内/全局.natvis文件,核心XML节点有<Type>、<DisplayString>、<Expand>等,并提供数组/链表/树的专用可视化方案。适用于自定义类型、第三方库数据结构等场景,显著提升调试效率。

红军不怕远征难,万水千山只等闲 685

使用Visual Studio 2013编写可维护的本地可视化(natvis)

在Visual Studio 2012中,我们介绍了创建可视化使用原生类型的能力natvis文件。 Visual Studio 2013中包含了一些改进,使其更容易编写可视化的类,在内部利用收集来存储项目。 在这篇博客文章中,我将介绍一个示例场景,告诉你什么是你必须做的VS2012以达到预期的效果,然后告诉你如何在natvis创作变得更容易,体验VS2013新功能的增强。 示例场...

weixin_30540691的博客 395

VS调试STL问题总结

---恢复内容开始---   以前写代码总觉用自己写的东西比较牛逼,vector?stack?为什么不自己实现。后来才认识到这是个幼稚的想法!首先每次都自己实现是一种重复劳动;其次,自己写的话很难保证没有bug;效率往往也不如STL。STL的优势不在此赘述,最近使用STL的时候发现调试时,监视器中的内容不忍直视,乱七八糟的,经过一番了解才慢慢发现问题所在。在这里总结一下,也希望能帮到遇到同样问题...

weixin_34405925的博客 446
上一篇: Visual Studio高级调试技巧
下一篇: Visual Studio版本号对应表
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值