1

是否有任何 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 中完成?

谢谢!
PS natvis 文件在 VSCode 中与 gdb 调试器一起使用。

4

1 回答 1

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>

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

@DYZ 这是图片(VSCode 监视窗口的图片)VS Code 如何使用与上述规则类似的规则显示 RTOS 任务信息(对不起,我现在享有直接在答案中发布图片的声誉)。我想你现在明白了为什么我需要这样的功能以及为什么在这种情况下拥有“this”指针会很有用。

于 2017-03-26T09:29:51.087 回答