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

时间:2017-03-03 07:23:39

标签: 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文件在VSCode中使用gdb调试器。

1 个答案:

答案 0 :(得分:2)

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