Dumps d'objets
Mise à jour : novembre 2007
Cette rubrique s'applique à :
Édition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
Natif uniquement |
|||
Standard |
Natif uniquement |
|||
Pro et Team |
Natif uniquement |
Légende du tableau :
Applicable |
|
Non applicable |
|
Commande ou commandes masquées par défaut. |
Dans un programme MFC, vous pouvez utiliser CMemoryState::DumpAllObjectsSince pour faire un dump contenant la description de tous les objets sur le tas qui n'ont pas été libérés. DumpAllObjectsSince permet de faire un dump de tous les objets alloués depuis le dernier CMemoryState::Checkpoint. Si aucun appel à Checkpoint n'a eu lieu, DumpAllObjectsSince fait un dump de tous les objets et non-objets actuellement en mémoire.
Remarque : |
---|
Avant de pouvoir utiliser le dump d'objets MFC, vous devez activer Comment : activer les diagnostics de la mémoire. |
Remarque : |
---|
MFC fait automatiquement un dump de tous les objets qui ont été perdus lorsque votre programme s'arrête ; il est donc inutile de créer du code pour faire un dump des objets en ce point. |
Le code suivant recherche une fuite de mémoire en comparant deux états de mémoire et fait un dump de tous les objets si une fuite est détectée.
Exemple de code hérité (legacy)
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpAllObjectsSince();
}
Le contenu du dump a l'aspect suivant :
Dumping objects ->
{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4
Last Name: Smith
First Name: Alan
Phone #: 581-0215
{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long
Programmation fiable
Les valeurs numériques entre parenthèses au début de la plupart des lignes spécifient l'ordre dans lequel les objets ont été alloués. Le dernier objet alloué, auquel correspond le numéro le plus élevé, apparaît en au début du dump. Pour une analyse plus détaillée de cet exemple, consultez Interprétation d'un dump d'objets.
Pour obtenir la quantité d'informations maximale d'un dump d'objets, vous pouvez remplacer la fonction membre Dump de tout objet dérivé de CObject par Personnalisation d'un dump d'objets.
Vous avez la possibilité de définir un point d'arrêt sur une allocation de mémoire particulière en affectant à la variable globale _afxBreakAlloc la valeur numérique affichée entre parenthèses. Si vous réexécutez le programme, le débogueur arrêtera l'exécution lorsque cette allocation aura lieu. Vous pourrez alors examiner la pile des appels pour savoir comment votre programme est parvenu jusqu'à ce point.
La bibliothèque Runtime C possède une fonction similaire, _CrtSetBreakAlloc, que vous pouvez utiliser pour les allocations Runtime C.