2017-03-03 1 views
0

Y at-il un analogue du mot-clé C++ this, qui peut être utilisé dans les expressions natvis lors du débogage du code C?Comment faire référence à une variable elle-même à partir de l'expression natvis en langage C?

Je voudrais faire ce qui suit et n'ai pas l'esprit comment le faire sans this.

Tenez compte que nous avons une struct en C:

typedef struct 
{ 
    int state; 
    //other fields follow 
}TCB; 

Il y a aussi variable globale:

TCB* Running; 

Je veux faire natvis règles qui montreront l'état de l'objet en fonction de la state champ et Running variable. Si c'était C++, j'écrirais:

<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> 

Comment cela peut-il être fait en C?

Merci!
P.S. Le fichier natvis est utilisé dans VSCode avec le débogueur gdb.

+0

Puisqu'il n'y a pas d'objets dans C, il n'y a pas besoin de 'this' non plus. En C++/Java, 'this' est utilisé pour faire référence à l'objet en utilisant une de ses méthodes. En C, toutes les fonctions sont globales et non associées aux structures. – DyZ

+0

Je sais comment 'ceci 'est utilisé en C++/Java :), et je comprends qu'il est inutile pour le langage C, mais nous parlons ici de fichiers natvis pour le débogueur, pas d'expressions en langage C. J'ai montré une partie du fichier natvis qui avait besoin du mot clé 'this'. Savez-vous comment le faire sans «ceci»? –

Répondre

1

OK. J'ai trouvé une réponse à ma question. Nous pouvons référencer la structure en utilisant un hack - l'adresse de structure est la même que l'adresse de son premier champ, et tous les champs sont disponibles en expressions conditionnelles dans les expressions conditionnelles dans les règles de Natvis. Donc maintenant j'ai les règles:

<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> 

La deuxième règle fait exactement ce dont j'ai besoin (et ce que j'ai demandé auparavant). Il compare les adresses de l'objet actuellement affiché avec la variable globale Running située dans le fichier Kernel.c.

@DYZ Voici l'image (picture of the VSCode watch window) comment VS Code affiche les informations de tâches RTOS en utilisant les règles semblables à celles ci-dessus (désolé, j'ai maintenant la réputation de publier des photos directement dans la réponse). Je pense que maintenant vous comprenez pourquoi j'avais besoin d'une telle fonctionnalité et pourquoi avoir ce pointeur serait utile dans un tel cas.