我正在寻找一种在VS2012中通过NatVis显示UUID的正确方法.我自己的uuid类型在内部使用UUID big-endian,因此转换为(GUID*)不起作用,因为GUID在Windows中使用little-endian.所以我总是看到一个歪曲的uuid.
此外,Natvis中的任何格式说明符看起来都不好,因为在使用十六进制表示法时我无法摆脱输出中的0x.有任何想法吗?
c++ debugging visual-studio-debugging visual-studio-2012 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 & _Rep_mask"/>
<Intrinsic Name="type" Expression="(const type_info*)(_Storage._TypeData & ~_Rep_mask)"/>
<Intrinsic Name="_Is_trivial" Expression="has_value() && _Rep() == 0"/>
<Intrinsic Name="_Is_big" Expression="has_value() && _Rep() == 1"/>
<Intrinsic Name="_Is_small" Expression="has_value() && _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) 根据此链接,.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) 在Visual Studio 2012中,我正在寻找一种在Autos,Locals和Watch窗口中自定义浮点类型的默认显示的方法.我熟悉Native Visualizer(Natvis)实用程序,但没有看到任何调试器格式化工具来完成此任务.同样,我不知道有任何方法可以覆盖任何基元类型的默认显示(除了启用十六进制).
目标是创建显示字符串,其中针对与点,几何向量等对应的类型扩展了更少的数字,但在扩展类型时仍然显示所有精度.因此,例如,我可能有一个点类型显示的变量,(0.000, 1.234, 2.429)
而不是m_x = 0.00000000, m_y = 1.234245213...
在Autos窗口的中间列中.
我查看了此页面上的格式说明符,但没有看到控制浮点精度的方法.
我正在尝试在我的项目中使用新的调试可视化工具,但是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文件的位置,但我在ProcessMonitor
s日志中找不到任何引用.
昨天我发现了MSVC 的“Natvis”工具,它允许您调整调试器以智能方式呈现您的类型。我很快着手美化我的数学图书馆。
这是我的 3*3 矩阵类的外观(未初始化的数据):
华丽,对吧?我的下午没有后悔。
但是,现在我们要处理一个稍微复杂的案例:
如您所见,数字不对齐。我想出了一个办法 讨厌缸与正数得到负数对齐,但我的方法没有接近这个(这是我的基本轮廓)的方式:
<Type ...>
<DisplayString>...</DisplayString>
<Expand ...>
<Synthetic ...>
<DisplayString ...>...</DisplayString>
</Synthetic>
...
</Expand>
</Type>
Run Code Online (Sandbox Code Playgroud)
发生的事情是打印的数字数量因数字而异。
因此我的问题是:我可以将 Natvis 配置为打印明确定义的位数以进行调试吗?或者,也许您有一个聪明的解决方法?
PS:如果我能成功,我很乐意上传生成“.natvis”文件的 Python 脚本,供你们玩自己的类型。
我正在尝试.natvis
为 Visual Studio创建一个文件。根据此页面,我可以使用等引用模板参数$T1, $T2
。所以在MyClass<A>
$T1
will 引用类型的情况下A
。这有效。但在我的情况下A
是一个模板本身,我需要引用它的参数,某种$T1<$T1>
- 但这显然不起作用。
我正在使用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)
实际问题要复杂得多,包括奇怪的重复模板模式以创建更好的枚举对象,所以请不要评论这个有点人为的场景的无用性.
我目前正在为 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) 与这个问题类似,我尝试将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_data
is a …