如何从C语言中引用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?

中完成

谢谢!
P.S.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这是图片(Vscode Watch窗口的图片)VS代码如何使用与上述规则相似的规则显示RTOS任务信息(对不起,我现在有声誉可以直接在答案中发布图片)。我想现在您明白了为什么我需要这样的功能以及为什么在这种情况下使用"此"指针会很有用。

相关内容

  • 没有找到相关文章

最新更新