是否有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文件在VSCode中使用gdb调试器。
答案 0 :(得分:2)
行。我找到了一个问题的答案。我们可以使用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代码如何使用与上述规则相似的规则显示RTOS任务信息(抱歉,我现在声称直接在答案中发布图片)。我想你现在明白了为什么我需要这样的功能以及为什么要这样做呢?&#39;在这种情况下,指针会很有用。