如何从 C 语言中的 natvis 表达式中引用变量本身?
Posted
技术标签:
【中文标题】如何从 C 语言中的 natvis 表达式中引用变量本身?【英文标题】:How to reference variable itself from the natvis expression in C language? 【发布时间】:2017-03-03 07:23:39 【问题描述】:是否有任何 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 调试器一起使用。
【问题讨论】:
由于 C 中没有对象,所以也没有(需要)this
。在 C++/Java 中,this
用于使用其方法之一来引用对象。在 C 中,所有函数都是全局的,并且与结构无关。
我知道this
在 C++/Java 中是如何使用的 :),我知道它对 C 语言没用,但我们在这里谈论的是用于调试器的 natvis 文件,而不是 C 语言表达式。我已经展示了需要 this
关键字的 natvis 文件的一部分。你知道没有this
怎么办吗?
【参考方案1】:
好的。我找到了我的问题的答案。我们可以使用 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 这是 VS Code 如何使用与上述规则类似的规则显示 RTOS 任务信息的图片 (picture of the VSCode watch window)(抱歉,我现在享有直接在答案中发布图片的声誉)。我想你现在明白了我为什么需要这样的功能,以及为什么在这种情况下使用“this”指针会有用。
【讨论】:
以上是关于如何从 C 语言中的 natvis 表达式中引用变量本身?的主要内容,如果未能解决你的问题,请参考以下文章
如何将单个字符的 natvis 限制为仅 Visual Studio 中的字符