如何从 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 &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 这是 VS Code 如何使用与上述规则类似的规则显示 RTOS 任务信息的图片 (picture of the VSCode watch window)(抱歉,我现在享有直接在答案中发布图片的声誉)。我想你现在明白了我为什么需要这样的功能,以及为什么在这种情况下使用“this”指针会有用。

【讨论】:

以上是关于如何从 C 语言中的 natvis 表达式中引用变量本身?的主要内容,如果未能解决你的问题,请参考以下文章

.natvis - 如何引用模板模板参数?

如何将单个字符的 natvis 限制为仅 Visual Studio 中的字符

c 中的引用类型在delphi中如何使用

如下:为啥C语言读取文件中的数据并输出时有乱码出现?本来输入的是数字,然后从文件中读取后就变汉字

用C语言怎么编写一个从1加到10的程序...新手求解

c语言在头文件中如何引用另一个头文件中的函数