是否有 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 && 'Kernel.c'::Running==&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/