Qu'est-ce qu'un moyen rapide de tracer l'entrée et la sortie de fonctions dans un programme multithread Visual Studio 2005 c ++?

StackOverflow https://stackoverflow.com/questions/238517

Question

J'ai des plantages intermittents dans mes bibliothèques ActiveMQ en raison de la façon dont j'utilise l'API activemq-cpp. Il serait beaucoup plus facile de résoudre le problème si je pouvais observer chaque fonction appelée menant au crash. Existe-t-il un moyen rapide de suivre l’entrée et la sortie de fonctions dans un programme multithread Visual Studio 2005 c ++?

Merci d'avance!

Était-ce utile?

La solution

Utilisez un objet Tracer. Quelque chose comme ça:


class Tracer
{
public:
  Tracer(const char *functionName) : functionName_(functionName)
  {
    cout << "Entering function " << functionName_ << endl;
  }

  ~Tracer()
  {
    cout << "Exiting function " << functionName_ << endl;
  }

  const char *functionName_;
};

Maintenant, vous pouvez simplement instancier un objet Tracer en haut de la fonction, et il imprimera automatiquement le message "sortie ...". quand la fonction se ferme et que le destructeur s'appelle:


void foo()
{
  Tracer t("foo");
   ...
}

Autres conseils

Alors que le débogueur est attaché à un processus, vous pouvez cliquer avec le bouton droit de la souris sur le code source et sélectionner "point d'arrêt-> ajouter TracePoint" avec le texte souhaité (même certaines macros sont fournies).

Le Tracepoint est en fait un point d'arrêt avec l'option "When Hit". champ sur certaines fonctionnalités de l'imprimante de messages, et cela ne rompt pas réellement le processus. Je l’ai trouvé très utile: il contient également une macro $ FUNCTION, qui fait exactement ce dont vous avez besoin: affiche la fonction dans laquelle elle se trouve (à condition qu’elle dispose des informations de débogage disponibles ...), et un $ THREADID.

Toutes les options ci-dessus sont agréables et peuvent vous aider. Mais je ne vois pas comment le réglage de TracePoing avec la souris peut vous aider si votre code contient des milliers de fonctions.
Ce genre de chose devrait faire partie de votre travail de programmation habituel. Lorsque vous écrivez une fonction, vous devriez penser au message de trace qui vous aidera à la déboguer.
Vous devez écrire / utiliser un enregistreur existant qui peut être envoyé à une section (unité d'exécution, unité d'exécution, etc.) et à différents niveaux d'enregistrement (erreur, avertissement, trace, document détaillé, etc.). Le bon enregistreur doit être conçu de manière à ne pas nuire aux performances, mais en général à la verbosité, mais les problèmes de synchronisation complexes peuvent généralement être reproduits, à moins que la journalisation soit très rapide, comme en affectant un pointeur de chaîne au tableau pouvant être vidé après incident. est reproduit. Je commence généralement le débogage avec une trace complète affichée à l'écran et, si j'ai de la chance et un bogue reproduit de cette façon, la correction du bogue est triviale, car j'ai déjà suffisamment d'informations, le plaisir commence lorsque le problème disparaît et que vous devez jouer avec la verbosité reproduire le problème.
En fait, je trouve que le débogage est plus créatif et satisfaisant que l’écriture de code, mais c’est juste moi:).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top