使用Natvis框架观察指针指向的值
Use of Natvis framework to observe value pointed by pointer
我的目标是观察指针指向的值容器。为此,我建议使用 natvis
。我正在使用 VSCode
在 Linux 系统中开发我的项目。不幸的是,我没有成功获得所需的值。只能看到指针指向的first address
和value
我在这里给出的示例代码。
foo.h
#include <iostream>
class FOO
{
public:
FOO(uint32_t a_, uint32_t b_) : a{a_}, b{b_}
{}
void Print_Value();
uint32_t *pointer_array;
protected:
uint32_t a, b;
};
foo.cpp
#include "foo.h"
void FOO :: Print_Value()
{
std::cout << "a: " << a << std::endl
<< "b: " << b << std::endl;
}
main.cpp
#include "foo.h"
int main()
{
FOO obj_1(58,9);
obj_1.Print_Value();
uint32_t foo_array[5] = {5,15,96,8,77};
obj_1.pointer_array = foo_array;
return 0;
}
natvis file
我尝试创建
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="FOO">
<DisplayString>Test</DisplayString>
<Expand>
<Item Name="[pointer_array]">pointer_array</Item>
</Expand>
</Type>
</AutoVisualizer>
- 我也试过以下但失败了。此外,在这里我不明白如何包含其他项目 (
a,b
)。我不清楚语法。
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="FOO::pointer_array">
<DisplayString>Test</DisplayString>
<Expand>
<CustomListItems>
<Variable Name="pointer_array" InitialValue="0" />
<Size>5</Size>
<Loop Condition="pointer_array < 5">
<Item Name="{pointer_array}"> 1 </Item>
<Exec> ++pointer_array </Exec>
</Loop>
</CustomListItems>
</Expand>
</Type>
</AutoVisualizer>
- 在
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": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/foo_example",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/bin/",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"visualizerFile": "${workspaceFolder}/natvis_file/file.natvis",
"showDisplayString": true,
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
我期待的
- 在我的调试 window 中,我可以看到带有索引的
foo_array
的值。
- 我也想用class成员
pointer_array
观察值
- 我建议使用
natvis
来实现这个目标。我尝试关注 1 但失败了。
- 我对
natvis
的想法/理解不是很清楚。我想我必须使用 CustomListItems
来实现起诉 Loop
我可以显示指针指向的值但发现 this, this 告诉它使用 VSCode
的目标不可能。虽然,我不确定我是否走在正确的轨道上。
我的查询
- 如果我想在调试window中显示指针指向的值,what/how我必须写我的
natvis
文件吗?如果给出一个工作示例将非常有助于理解。
- 如果不可以,请问在
VSCode
有什么办法可以实现吗?
最后,找到了 solution,虽然还有很多其他问题会 post 在新的 post 中。我错误地解释了语法。
file.natvis
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="FOO">
<DisplayString>Test</DisplayString>
<Expand>
<Item Name="[a]">a</Item>
<ArrayItems>
<Size>5</Size>
<ValuePointer>pointer_array</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>
- 指针指向数组。因此,遍历数组将显示指针指向的值。为此,
natvis
具有 ArrayItems
元素。
我的目标是观察指针指向的值容器。为此,我建议使用 natvis
。我正在使用 VSCode
在 Linux 系统中开发我的项目。不幸的是,我没有成功获得所需的值。只能看到指针指向的first address
和value
我在这里给出的示例代码。
foo.h
#include <iostream>
class FOO
{
public:
FOO(uint32_t a_, uint32_t b_) : a{a_}, b{b_}
{}
void Print_Value();
uint32_t *pointer_array;
protected:
uint32_t a, b;
};
foo.cpp
#include "foo.h"
void FOO :: Print_Value()
{
std::cout << "a: " << a << std::endl
<< "b: " << b << std::endl;
}
main.cpp
#include "foo.h"
int main()
{
FOO obj_1(58,9);
obj_1.Print_Value();
uint32_t foo_array[5] = {5,15,96,8,77};
obj_1.pointer_array = foo_array;
return 0;
}
natvis file
我尝试创建
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="FOO">
<DisplayString>Test</DisplayString>
<Expand>
<Item Name="[pointer_array]">pointer_array</Item>
</Expand>
</Type>
</AutoVisualizer>
- 我也试过以下但失败了。此外,在这里我不明白如何包含其他项目 (
a,b
)。我不清楚语法。
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="FOO::pointer_array">
<DisplayString>Test</DisplayString>
<Expand>
<CustomListItems>
<Variable Name="pointer_array" InitialValue="0" />
<Size>5</Size>
<Loop Condition="pointer_array < 5">
<Item Name="{pointer_array}"> 1 </Item>
<Exec> ++pointer_array </Exec>
</Loop>
</CustomListItems>
</Expand>
</Type>
</AutoVisualizer>
- 在
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": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/foo_example",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/bin/",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"visualizerFile": "${workspaceFolder}/natvis_file/file.natvis",
"showDisplayString": true,
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
我期待的
- 在我的调试 window 中,我可以看到带有索引的
foo_array
的值。 - 我也想用class成员
pointer_array
观察值
- 我建议使用
natvis
来实现这个目标。我尝试关注 1 但失败了。 - 我对
natvis
的想法/理解不是很清楚。我想我必须使用CustomListItems
来实现起诉Loop
我可以显示指针指向的值但发现 this, this 告诉它使用VSCode
的目标不可能。虽然,我不确定我是否走在正确的轨道上。
我的查询
- 如果我想在调试window中显示指针指向的值,what/how我必须写我的
natvis
文件吗?如果给出一个工作示例将非常有助于理解。 - 如果不可以,请问在
VSCode
有什么办法可以实现吗?
最后,找到了 solution,虽然还有很多其他问题会 post 在新的 post 中。我错误地解释了语法。
file.natvis
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="FOO">
<DisplayString>Test</DisplayString>
<Expand>
<Item Name="[a]">a</Item>
<ArrayItems>
<Size>5</Size>
<ValuePointer>pointer_array</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>
- 指针指向数组。因此,遍历数组将显示指针指向的值。为此,
natvis
具有ArrayItems
元素。