c - 如何从C语言的natvis表达式中引用变量本身?

标签 c visual-studio-code natvis

是否有 C++ this 关键字的类似物,可以在调试 C 代码时在 natvis 表达式中使用?

我想执行以下操作,但不知道如何在没有this 的情况下执行此操作。

考虑我们在 C 中有一些结构:

typedef struct
{
  int state;
  //other fields follow
}TCB;

还有全局变量:

TCB* Running;

我想制定 natvis 规则,根据 state 字段和 Running 变量显示对象的状态。如果是 C++,我会写:

<Type Name="TCB">
  <DisplayString Condition="state==0">Empty</DisplayString>
  <DisplayString Condition="state==0x80 && Running!=this">Ready</DisplayString>
  <DisplayString Condition="state==0x80 && Running==this">Running</DisplayString>
</Type>

如何在 C 中完成?

谢谢!
附言natvis 文件在带有 gdb 调试器的 VSCode 中使用。

最佳答案

好的。我找到了问题的答案。我们可以使用 hack 引用结构 - 结构地址与其第一个字段的地址相同,并且所有字段在 Natvis 规则的条件表达式中的条件表达式中可用。所以现在我有了规则:

<Type Name="TCB">
    <DisplayString Condition="state==0">Empty</DisplayString>
    <DisplayString Condition="state==0x80 &amp;&amp; 'Kernel.c'::Running==&amp;state">Running</DisplayString>
    <DisplayString Condition="state==0x80">Ready</DisplayString>
    <DisplayString Condition="state==0x81">Suspended</DisplayString>
    <DisplayString Condition="state==0x84">Waiting any ev {psp.r1_0,x}</DisplayString>
    <DisplayString Condition="state==0x82">Waiting all ev {psp.r1_0,x}</DisplayString>
    <DisplayString Condition="state==0x88">Blocked by {(cs_t*)psp.r0}</DisplayString>
    <DisplayString Condition="state==0x90">Waiting for {(semaphore_t*)psp.r0}</DisplayString>
</Type>

第二条规则完全符合我的需要(以及我之前提出的要求)。它将当前显示对象的地址与位于 Kernel.c 文件中的全局变量 Running 进行比较。

@DYZ 这是图片 ( picture of the VSCode watch window ) VS Code 如何使用与上述规则类似的规则显示 RTOS 任务信息(抱歉,我现在享有直接在答案中张贴图片的声誉)。我想现在您明白了为什么我需要这样的功能以及为什么在这种情况下使用“this”指针会很有用。

关于c - 如何从C语言的natvis表达式中引用变量本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42572997/

相关文章:

python - VScode - Python 扩展 - 更改默认语言

git-bash - 如何从 Visual Studio Code 集成终端在 Windows 上使用 Bash?

MCrypt 可以检查创建的哈希是否被修改吗?

c - Linux/Linux 中的文件和 F_TLOCK 问题

c - libcjson.so : cannot open shared object file: No such file or directory

c++ - Visual Studio natvis 语句的局部变量

visual-studio-2012 - NatVis:允许使用 typedef?

c - 如何修复 mupdf 中的 "cannot find ExtGState dictionary"?

docker - 使用 VSCode 远程连接到 Docker 容器时, "code"命令不起作用

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