Partager via


Dumps d'objets

Mise à jour : novembre 2007

Cette rubrique s'applique à :

Édition

Visual Basic

C#

C++

Web Developer

Express

La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Standard

La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Pro et Team

La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Légende du tableau :

La rubrique s'applique

Applicable

La rubrique ne s'applique pas

Non applicable

La rubrique s'applique mais la commande est masquée par défaut

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.

Voir aussi

Autres ressources

Détection de fuite de mémoire dans MFC