Contents Up Previous Next

Vue d'ensemble du débogage

Classes, fonctions et macros: wxDebugContext, wxObject, wxLog, Fonctions de journalisation, Macros de débogage

Différentes classes, fonctions et macros sont fournies dans wxWidgets pour vous aider à déboguer votre application. La majorité d'entre-elles ne sont disponibles que si vous compilez à la fois wxWidgets, votre application et toutes les bibliothèques qui utilisent wxWidgets avec le symbole __WXDEBUG__ défini. Vous pouvez également tester le symbole __WXDEBUG__ dans votre application pour éxécuter du code qui ne doit être actif qu'un mode debug.

wxDebugContext

wxDebugContext est une classe qui n'est jamais instanciée, mais qui rassemble différentes variables et fonctions statiques. Elle vous permet de 'dumper' tous les objets dans un flux, d'écrire des statistiques à propos de l'allocation d'objets, et de vérifier les erreurs de mémoire.

Il est de bon ton de définir une fonction membre wxObject::Dump pour chaque classe que vous dérivez à partir d'une classe wxWidgets, ainsi wxDebugContext::Dump peut toutes les appeler et donner des informations précieuses à propos de l'état de l'application.

Si vous avez des difficultés à retrouver une fuite mémoire, recompilez en mode debug et appelez wxDebugContext::Dump et wxDebugContext::PrintStatistics aux endroits appropriés. Cela pour permettra de savoir quels sont les objets qui n'ont pas été détruits, et de quel type d'objets il s'agit. dn plus, en mode debug, wxWidgets détectera automatiquement les fuites mémoires quand votre application est sur le point de se terminer, et s'il y en a, vous obtiendrez des informations au sujet du problème (la quantité d'informations dépend du système et du compilateur -- certains systèmes n'autorisent pas l'activation de toute la journalisation de la mémoire). Voyez l'exemple memcheck pour connaitre le mode d'emploi.

Pour que wxDebugContext puisse faire son travail, les opérateurs new et delete pour les wxObject on été redéfinis afin de stocker des informations supplémentaires sur l'allocation dynamique d'objets (mais non sur les objets déclarés statiquement). Cela ralenti l'éxécution d'une version débogage d'une application, mais peut aider à identifier des fuites mémoires (des objets quine sont pas désalloués), des 'sur-écritures' (écritures après la fin de l'objet), et des 'sous-écritures' (écritures avant l'objet).

Si le mode débogage est actif et que les symboles wxUSE_GLOBAL_MEMORY_OPERATORS et wxUSE_DEBUG_NEW_ALWAYS sont mis à 1 dans setup.h, 'new' est défini pour être:

#define new new(__FILE__,__LINE__)
Toutes les occurences de 'new' dans wxWidgets et dans votre application utiliseront la forme redéfinie de l'opérateur avec deux arguments supplémentaires. Cela signifie que la sortie de débogage (et les messages rapportant les erreurs mémoires) vous indiqueront quel fichier et sur quelle ligne vous avez alloué l'objet concerné. Malheureusement, tous les compilateurs ne permettent pas à cette redéfinition de fonctionner correctement, mais la majorité oui.

Macros de débogage

Vous devez également utiliser les macros de débogage comme faisant partie d'une stratégie de 'programmation défensive', en dispersant les wxASSERTs pour tester les éventuels problèmes dans votre code le plus tôt possible. Une réflexion préventive vous permettra d'économiser beaucoup de temps au fil des jours.

wxASSERT est utilisé pour afficher une boite de dialogue contenant un message d'erreur quand une condition n'est pas vrais. Vous pouvez utiliser wxASSERT_MSG pour fournir vos propres messages d'erreur. Par exemple:

  void MyClass::MyFunction(wxObject* object)
  {
      wxASSERT_MSG( (object != NULL), "object should not be NULL in MyFunction!" );

      ...
  };

La boite de message vous permet de continer l'éxécution ou d'abandonner le programme. Si vous êtes en train d'éxécuter l'application depuis un débogueur, vous pourrez voir exactement où était le problème.

Fonctions de journalisation

Vous pouvez utiliser les fonctions wxLogDebug et wxLogTrace pour afficher les informations de débogage en mode debug; cela ne fera rien du tout en mode non-debug.

Vue d'ensemble de wxDebugContext


Vue d'ensemble de wxDebugContext

Vue d'ensemble du débogage

Classe: wxDebugContext

wxDebugContext est une classe pour effectuer diverses opérations de traçage mémoire et de débogage

Cette classe n'a que des fonctions et données membres statiques, et il de doit pas y en avoir d'instance. Les fonctions membres les plus utiles sont sans doute SetFile (pour écrire directement dans un fichier, au lieu des sorties erreurs standards ou sortie du débogueur); Dump (pour afficher les objets alloués dynamiquement) et PrintStatistics (pour afficher des informations sur l'allocation d'objets). Vous pouvez également appeler Check pour vérifier l'intégrité de blocks mémoire.

Voici un exemple d'utilisation. SetCheckPoint permet de s'assurer que seulement les allocations faites après le point de vérification seront affichées.

  wxDebugContext::SetCheckpoint();

  wxDebugContext::SetFile("c:\\temp\\debug.log");

  wxString *thing = new wxString;

  char *ordinaryNonObject = new char[1000];

  wxDebugContext::Dump();
  wxDebugContext::PrintStatistics();
Vous pouvez utiliser wxDebugContext si __WXDEBUG__ est défini, ou vous pouvez l'utiliser à n'importe quel autre moment (si wxUSE_DEBUG_CONTEXT est mis à un dans setup.h). wxDebugContext n'est pas désactivé en mode non-debug car vous pouvez ne pas vouloir recompiler wxWidgets et toute votre application simplement pour utiliser cette aide à la journalisation.

Notez: wxDebugContext::SetFile a un problème pour l'instant, utilisez le flux par défaut. Eventuellement, la journalisation sera faite à travers les fonctions wxLog.