2010-09-27 23 views
0

J'ai dû définir un nouvel ensemble de wrappers pour les méthodes existantes. Ces nouveaux wrappers ont pour but d'aider au débogage en incluant certaines informations de suivi.Liaison d'appels de méthode

Code Source d'origine:

Sample.c ::

Caller{ 

void functionA(){ 
    funcB(); 
} 

} 

Callee{ 

void funcB(){ 
} 
} 

modifié Code avec fonctionnalité traditionnelle Wrapper:

Sample.h ::

#define funcB wrapperFuncB //not visible to Callee 

Caller{ 

void functionA(){ //this gets redirected to wrapperFuncB cos of #define 
    funcB(); 
} 
} 
Callee{ 

void wrapperFuncB(){ 
    if(DEBUG){ //value of DEBUG is set at runtime 
     //COLLECT Trace data 


    }else{ 
     funcB(); 
    } 
} 
void funcB(){ 
} 
} 

Ce mécanisme a le surcoût supplémentaire de: 1] Tous les appels à funcB est ro bué à wrapperFuncB, irrespecitve de DEBUG activé ou non 2] Une trame de procédé supplémentaire [wrapperFuncB] doit être créé, irrespecitve de DEBUG activé ou non 3] Une tête d'un contrôle conditionnel

+2

Bon pour vous. As-tu une question ? – ereOn

+0

Cela ne ressemble pas à C. Balise supprimée. – pmg

Répondre

1

Si les méthodes sont identiques, vous pouvez utiliser quelque chose comme ceci:

#ifdef __DEBUGING 
#define myClass debug_class 
#else 
#define myClass actual_class 
#endif 

de cette façon, vous pouvez choisir de manière sélective quelle classe vous utilisez dans votre code, l'un ou l'une enveloppe réelle. Il y a peut-être quelques problèmes, car ce n'était que la première idée qui me venait à l'esprit.

1

Sinon, vous pouvez mettre vos instructions de débogage comme celui-ci

#ifdef DEBUG_ENABLE 
DEBUG_LOG(X) printf(x) 
#else 
DEBUG_LOG(X) do{}while(0) 

void FunctionA() 
{ 
DEBUG_LOG("\n Debugging function",__func__); 
} 

Vous pouvez utiliser la même routine sans emballage. L'avantage serait que les logs rendraient le code un peu plus facile à comprendre et vous pouvez les activer et les désactiver en utilisant les options du compilateur.

+0

Vous devez utiliser un bloc do/while pour le cas #ifdef ainsi que le #else. Vous pourriez avoir répondu alors que la balise C était encore sur la question, si juste en utilisant printf() mais avec une chaîne de caractères, c'est difficile à utiliser. En C++, vous pouvez utiliser 'std :: cerr << __FILE__ << ':' << __LINE << '<< X <<' \ n ';' ou similaire, puis 'DEBUG_LOG (" x "<< x) "etc. –

+0

Mais le problème ici est que "DEBUG_ENABLE" est défini lors de l'exécution, pendant l'exécution du programme. Au moment de la compilation, nous ne savons pas si le programme sera exécuté en mode débogage ou non. – user170008

+0

Dans ce cas, vous savez si debug_enable est défini ou non, la macro peut avoir une instruction if (debug_enable) conditionnelle et exécuter l'action. Cela évite d'utiliser les fonctions d'encapsulation. –

0

Comme la fonction wrapperFuncB aura la même signature que funcB, vous pouvez simplement le faire sans avoir besoin d'une nouvelle classe.

#ifdef __DEBUG__ 
#define funcB wrapperFuncB 
#else 
#define funcB actualFuncB 
#end 

donc quand vous n'êtes pas mise au point ou la collecte d'informations de trace, vous pouvez simplement le désactiver en ne définissant pas DEBUG et il n'y aura pas de frais généraux

Edit: Mise à jour après avoir reçu les commentaires de user170008

Je ne pense pas #ifdef __DEBUG__ un type de chose peut être utilisé lors de l'exécution. Vous devrez probablement compter sur les paramètres de la ligne de commande pour différencier un débogage de l'exécution normale. Mais quelle que soit la façon que vous utilisez simplement créer un pointeur de fonction et réglez en fonction de ce genre de course que vous faites par exemple

void (*funcB)(void); 
if(debug) 
    funcB=debugFuncB; 
else 
    funcB=actualFuncB; 

après cela, vous pouvez simplement utiliser FoncB que vous utilisez actuellement i.e. FoncB();

+0

Mais le problème ici est que "__DEBUG__" est défini au moment de l'exécution, pendant l'exécution du programme. Au moment de la compilation, nous ne savons pas si le programme sera exécuté en mode débogage ou non. – user170008

+0

alors je suppose que vous pouvez utiliser des pointeurs de fonction. Je vais ajouter à ma réponse – binW