2017-03-03 56 views
0

是否有C++ this關鍵字的任何模擬,可以在調試C代碼時用於natvis表達式?如何從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。

+0

由於C中沒有對象,所以也沒有(需要)'this'。在C++/Java中,'this'用於使用其中一種方法來引用對象。在C中,所有函數都是全局函數,並且不與結構關聯。 – DyZ

+0

我知道'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這是圖片(picture of the VSCode watch window)VS Code如何使用上述規則模擬器顯示RTOS任務信息(抱歉,我現在有聲望直接在答案中發佈圖片)。我想現在你明白爲什麼我需要這樣的功能,爲什麼在這種情況下使用'this'指針會很有用。