Comment : définir des points d'arrêt sur un numéro d'allocation de mémoire
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. |
Remarque : |
---|
Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Paramètres Visual Studio. |
Le nom de fichier et le numéro de ligne figurant dans le rapport sur les fuites de mémoire indiquent à quel endroit la mémoire perdue est allouée, mais cette information ne suffit pas toujours à identifier le problème. Souvent, une allocation est appelée à de nombreuses reprises pendant l'exécution du programme, mais la fuite de mémoire ne se produit qu'à l'occasion de certains appels. Pour identifier le problème, vous devez savoir non seulement où la mémoire perdue est allouée, mais également dans quelles conditions la fuite a lieu. L'élément d'information qui vous permet d'obtenir ces renseignements est le numéro d'allocation de mémoire. Il s'agit de la valeur numérique qui apparaît entre accolades après le nom de fichier et le numéro de ligne, lorsque ces derniers sont affichés. Par exemple, dans le résultat suivant, le numéro d'allocation de mémoire est 18. Cela signifie que la fuite de mémoire concerne le 18e bloc de mémoire alloué dans votre programme.
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
La bibliothèque CRT compte tous les blocs de mémoire alloués pendant une exécution du programme, y compris la mémoire allouée par la bibliothèque CRT elle-même ou par d'autres bibliothèques, telles que MFC. Par conséquent, un objet avec un numéro d'allocation N sera le Nième objet alloué dans votre programme, mais il ne correspondra pas forcément au Nième objet alloué par votre code. (Ce sera même rarement le cas.)
Vous pouvez vous servir du numéro d'allocation de mémoire pour définir un point d'arrêt à l'emplacement où la mémoire est allouée. Pour ce faire, définissez un point d'arrêt d'emplacement à proximité du début du programme. Lorsque votre programme s'arrête en ce point, vous pouvez définir un tel point d'arrêt d'allocation de mémoire à partir de la boîte de dialogue Espion express ou de la fenêtre Espion.
Procédure
Pour définir un point d'arrêt d'allocation de mémoire dans la fenêtre Espion
À l'intérieur de la fenêtre Espion, tapez l'expression suivante dans la colonne Nom :
_crtBreakAlloc
Si vous utilisez la version DLL multithread de la bibliothèque CRT (l'option /MD), incluez l'opérateur de contexte, comme indiqué ci-après :
{,,msvcr71d.dll}_crtBreakAlloc
Appuyez sur RETOUR.
Le débogueur évalue l'expression et place le résultat dans la colonne Valeur. Cette valeur sera égale à –1 si vous n'avez défini aucun point d'arrêt sur les allocations de mémoire.
Remplacez la valeur dans la colonne Valeur par le numéro d'allocation de l'allocation de mémoire où vous souhaitez effectuer l'arrêt. Choisissez, par exemple, 18 pour effectuer l'arrêt à l'allocation indiquée dans la sortie ci-dessus.
Après avoir défini des points d'arrêt sur les allocations de mémoire qui vous intéressent, vous pouvez poursuivre le débogage. Veillez à exécuter le programme dans les mêmes conditions que lors de la précédente exécution pour conserver le même ordre d'allocation. Lorsque votre programme s'arrête à l'allocation de mémoire spécifiée, vous pouvez examiner la fenêtre Pile des appels et les autres informations de débogage pour déterminer dans quelles conditions la mémoire a été allouée. Si nécessaire, vous pouvez poursuivre l'exécution du programme à partir de ce point pour savoir ce que devient l'objet et, éventuellement, déterminer pourquoi sa désallocation n'est pas correcte.
Remarque : |
---|
La définition d'un point d'arrêt sur variable sur l'objet peut s'avérer utile. Pour plus d'informations, consultez Comment : définir un point d'arrêt de données (natif uniquement). |
Bien qu'il soit habituellement plus facile de définir des points d'arrêt d'allocation de mémoire dans le débogueur, vous pouvez, si vous préférez, les définir dans votre code.
Pour définir un point d'arrêt d'allocation de mémoire dans votre code
Ajoutez une ligne, telle que la suivante (pour la 18e allocation de mémoire) :
_crtBreakAlloc = 18;
Vous pouvez également utiliser la fonction _CrtSetBreakAlloc, qui a le même effet :
_CrtSetBreakAlloc(18);
Voir aussi
Tâches
Comment : utiliser la fenêtre Pile des appels
Concepts
Détection et isolement des fuites de mémoire