Partager via


Services de diagnostic

La bibliothèque Microsoft Foundation Class fournit de nombreux services de diagnostic qui simplifient le débogage de vos programmes. Elle propose notamment des macros et des fonctions globales qui vous permettent d’effectuer le suivi des allocations mémoire de votre programme, de vider le contenu des objets au moment de l’exécution et d’afficher des messages de débogage au moment de l’exécution. Les macros et les fonctions globales pour les services de diagnostic sont regroupées dans les catégories suivantes :

  • Macros de diagnostic général

  • Fonctions et variables de diagnostic général

  • Fonctions de diagnostic d’objet

Ces macros et fonctions sont disponibles pour toutes les classes dérivées de CObject dans les versions Debug et Release de MFC. Toutefois, tous, sauf DEBUG_NEW et VERIFY ne font rien dans la version release.

Dans la bibliothèque de débogage, tous les blocs de mémoire alloués sont entre crochets avec une série d’octets de protection. Si ces octets sont perturbés par une écriture de mémoire errante, les routines de diagnostic peuvent signaler un problème. Si vous incluez la ligne :

#define new DEBUG_NEW

dans votre fichier d’implémentation, tous les appels pour new stocker le nom de fichier et le numéro de ligne où l’allocation de mémoire a eu lieu. La fonction CMemoryState::DumpAllObjectsSince affiche ces informations supplémentaires, ce qui vous permet d’identifier les fuites de mémoire. Pour plus d’informations sur la sortie de diagnostic, consultez également la classe CDumpContext .

La bibliothèque Runtime C prend également en charge un ensemble de fonctions de diagnostic que vous pouvez utiliser pour déboguer vos applications. Pour plus d’informations, consultez Routines de débogage dans la Référence de la bibliothèque runtime.

Macros de diagnostic général MFC

Nom Description
ASSERT Affiche un message et interrompt le programme si l’expression spécifiée donne la valeur FALSE dans la version Debug de la bibliothèque.
ASSERT_KINDOF Vérifie qu’un objet est un objet de la classe spécifiée ou d’une classe dérivée de la classe spécifiée.
ASSERT_VALID Teste la validité interne d’un objet en appelant sa fonction membre AssertValid ; généralement substituée à partir de CObject.
DEBUG_NEW Fournit un nom de fichier et un numéro de ligne pour toutes les allocations d’objets en mode débogage, pour faciliter la recherche des fuites de mémoire.
DEBUG_ONLY Semblable à ASSERT , mais ne teste pas la valeur de l’expression. Utile pour le code qui doit s’exécuter uniquement en mode débogage.
VÉRIFIER et ENSURE_VALID Permet de valider la correction des données.
THIS_FILE Développe le nom du fichier en cours de compilation.
TRACE Fournit des fonctionnalités semblables à printfdans la version Debug de la bibliothèque.
VERIFY Semblable à ASSERT , mais évalue l’expression dans la versions Release et Debug de la bibliothèque.

Fonctions et variables de diagnostic général MFC

Nom Description
afxDump Variable globale qui envoie des informations CDumpContext à la fenêtre de sortie du débogueur ou au terminal de débogage.
afxMemDF Variable globale qui contrôle le comportement de l’allocateur de mémoire de débogage.
AfxCheckError Variable globale qui sert à tester le SCODE passé pour voir s’il s’agit d’une erreur et, si c’est le cas, génère l’erreur appropriée.
AfxCheckMemory Vérifie l’intégrité de toute la mémoire allouée actuellement.
AfxDebugBreak Provoque un arrêt dans l’exécution.
AfxDump En cas d’appel dans le débogueur, vide l’état d’un objet pendant le débogage.
AfxDump Fonction interne qui vide l’état d’un objet lors du débogage.
AfxDumpStack Génère une image de la pile actuelle. Cette fonction est toujours liée de manière statique.
AfxEnableMemoryLeakDump Active le vidage de fuite de mémoire.
AfxEnableMemoryTracking Active et désactive le suivi de la mémoire.
AfxIsMemoryBlock Vérifie qu’un bloc de mémoire a été alloué correctement.
AfxIsValidAddress Vérifie qu’une plage d’adresses mémoire est dans les limites du programme.
AfxIsValidString Détermine si un pointeur vers une chaîne est valide.
AfxSetAllocHook Permet l’appel d’une fonction lors de chaque allocation de mémoire.

Fonctions de diagnostic d’objet MFC

Nom Description
AfxDoForAllClasses Exécute une fonction spécifiée sur toutes les classes dérivées de CObjectqui prennent en charge la vérification du type au moment de l’exécution.
AfxDoForAllObjects Exécute une fonction spécifiée sur tous les CObjectobjets dérivés alloués avec new.

MFC Compilation Macros

Nom Description
_AFX_SECURE_NO_WARNINGS Supprime les avertissements du compilateur pour l’utilisation des fonctions MFC déconseillées.

_AFX_SECURE_NO_WARNINGS

Supprime les avertissements du compilateur pour l’utilisation des fonctions MFC déconseillées.

Syntaxe

_AFX_SECURE_NO_WARNINGS

Exemple

Cet exemple de code provoque un avertissement du compilateur s’il _AFX_SECURE_NO_WARNINGS n’est pas défini.

// define this before including any afx files in *pch.h* (*stdafx.h* in Visual Studio 2017 and earlier)
#define _AFX_SECURE_NO_WARNINGS

// . . .

CRichEditCtrl* pRichEdit = new CRichEditCtrl;
pRichEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE,
   CRect(10,10,100,200), pParentWnd, 1);
char sz[256];
pRichEdit->GetSelText(sz);

AfxDebugBreak

Appelez cette fonction pour provoquer un arrêt (à l’emplacement de l’appel ) AfxDebugBreakdans l’exécution de la version de débogage de votre application MFC.

Syntaxe

void AfxDebugBreak( );

Notes

AfxDebugBreak n’a aucun effet dans les versions de version d’une application MFC et doit être supprimé. Cette fonction ne doit être utilisée que dans les applications MFC. Utilisez la version de l’API Win32, DebugBreakpour provoquer une rupture dans les applications non MFC.

Spécifications

En-tête : afxver_.h

ASSERT

Évalue son argument.

ASSERT(booleanExpression)

Paramètres

booleanExpression
Spécifie une expression (y compris les valeurs de pointeur) qui prend la valeur différente de zéro ou 0.

Notes

Si le résultat est 0, la macro imprime un message de diagnostic et abandonne le programme. Si la condition n’est pas nulle, elle ne fait rien.

Le message de diagnostic se présente sous la forme

assertion failed in file <name> in line <num>

le nom est le nom du fichier source et num correspond au numéro de ligne de l’assertion qui a échoué dans le fichier source.

Dans la version Release de MFC, ASSERT n’évalue pas l’expression et n’interrompt donc pas le programme. Si l’expression doit être évaluée indépendamment de l’environnement, utilisez la macro VERIFY à la place de ASSERT.

Remarque

Cette fonction est disponible uniquement dans la version de débogage de MFC.

Exemple

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(pcage != NULL);
ASSERT(pcage->IsKindOf(RUNTIME_CLASS(CAge)));
// Terminates program only if pcage is NOT a CAge*.   

Spécifications

En-tête : afx.h

ASSERT_KINDOF

Cette macro affirme que l’objet pointé est un objet de la classe spécifiée ou est un objet d’une classe dérivée de la classe spécifiée.

ASSERT_KINDOF(classname, pobject)

Paramètres

classname
Nom d’une CObjectclasse dérivée -.

pobject
Pointeur vers un objet de classe.

Notes

Le paramètre pobject doit être un pointeur vers un objet et peut être const. L’objet pointé vers la classe et la classe doivent prendre en charge CObject les informations de classe d’exécution. Par exemple, pour vous assurer qu’il pDocument s’agit d’un pointeur vers un objet de la CMyDoc classe ou de l’un de ses dérivés, vous pouvez coder :

ASSERT_KINDOF(CMyDoc, pDocument);

L’utilisation de la macro est exactement la même que le ASSERT_KINDOF codage :

ASSERT(pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));

Cette fonction fonctionne uniquement pour les classes déclarées avec la macro [DECLARE_DYNAMIC](run-time-object-model-services.md#declare_dynamic ou DECLARE_SERIAL .

Remarque

Cette fonction est disponible uniquement dans la version de débogage de MFC.

Spécifications

En-tête : afx.h

ASSERT_VALID

Permet de tester vos hypothèses sur la validité de l’état interne d’un objet.

ASSERT_VALID(pObject)

Paramètres

pObject
Spécifie un objet d’une classe dérivée de CObject celle qui a une version substituée de la AssertValid fonction membre.

Notes

ASSERT_VALID appelle la AssertValid fonction membre de l’objet passé en tant qu’argument.

Dans la version Release de MFC, ASSERT_VALID ne fait rien. Dans la version de débogage, il valide le pointeur, case activée s par rapport à NULL et appelle les fonctions membres AssertValid de l’objet. Si l’un de ces tests échoue, un message d’alerte s’affiche de la même manière que ASSERT.

Remarque

Cette fonction est disponible uniquement dans la version de débogage de MFC.

Pour plus d’informations et d’exemples, consultez Débogage d’applications MFC.

Exemple

// Assure that pMyObject is a valid pointer to an
// object derived from CObject.
ASSERT_VALID(pMyObject);

Spécifications

En-tête : afx.h

DEBUG_NEW

Aide à trouver des fuites de mémoire.

#define  new DEBUG_NEW

Notes

Vous pouvez utiliser DEBUG_NEW partout dans votre programme que vous utilisez généralement l’opérateur pour allouer le new stockage de tas.

En mode débogage (lorsque le symbole _DEBUG est défini), DEBUG_NEW effectue le suivi du nom de fichier et du numéro de ligne pour chaque objet qu’il alloue. Ensuite, lorsque vous utilisez la fonction membre CMemoryState ::D umpAllObjectsSince , chaque objet alloué avec DEBUG_NEW est affiché avec le nom de fichier et le numéro de ligne où il a été alloué.

Pour utiliser DEBUG_NEW, insérez la directive suivante dans vos fichiers sources :

#define new DEBUG_NEW

Une fois que vous avez inséré cette directive, le préprocesseur insère DEBUG_NEW où que vous utilisiez new, et MFC effectue le reste. Lorsque vous compilez une version de version de votre programme, DEBUG_NEW se résout en une opération simple new , et les informations de nom de fichier et de numéro de ligne ne sont pas générées.

Remarque

Dans les versions précédentes de MFC (4.1 et versions antérieures), vous devez placer l’instruction #define après toutes les instructions qui ont appelé les macros IMPLEMENT_DYNCREATE ou IMPLEMENT_SERIAL. Cela n’est plus nécessaire.

Spécifications

En-tête : afx.h

DEBUG_ONLY

En mode débogage (lorsque le symbole _DEBUG est défini), DEBUG_ONLY évalue son argument.

DEBUG_ONLY(expression)

Notes

Dans une build de mise en production, DEBUG_ONLY n’évalue pas son argument. Cela est utile lorsque vous avez du code qui doit être exécuté uniquement dans les builds de débogage.

La macro DEBUG_ONLY équivaut à l’expression environnante avec #ifdef _DEBUG et #endif.

Exemple

void ExampleFunc(char* p, int size, char fill)
{
   char* q;               // working copy of pointer 
   VERIFY(q = p);         // copy buffer pointer and validate
   ASSERT(size >= 100);   // make sure buffer is at least 100 bytes
   ASSERT(isalpha(fill)); // make sure fill character is alphabetic
   // if fill character is invalid, substitute 'X' so we can continue
   // debugging after the preceding ASSERT fails.
   DEBUG_ONLY(fill = (isalpha(fill)) ? fill : 'X');
}

Spécifications

En-tête : afx.h

VÉRIFIER et ENSURE_VALID

Permet de valider la correction des données.

Syntaxe

ENSURE(  booleanExpression )
ENSURE_VALID( booleanExpression  )

Paramètres

booleanExpression
Spécifie une expression booléenne à tester.

Notes

L’objectif de ces macros est d’améliorer la validation des paramètres. Les macros empêchent le traitement supplémentaire des paramètres incorrects dans votre code. Contrairement aux macros ASSERT, les macros ENSURE lèvent une exception en plus de générer une assertion.

Les macros se comportent de deux manières, en fonction de la configuration du projet. Les macros appellent ASSERT, puis lèvent une exception si l’assertion échoue. Par conséquent, dans les configurations de débogage (autrement dit, où _DEBUG est défini) les macros produisent une assertion et une exception alors que dans les configurations Release, les macros produisent uniquement l’exception (ASSERT n’évalue pas l’expression dans les configurations release).

La macro ENSURE_ARG agit comme la macro ENSURE.

ENSURE_VALID appelle la macro ASSERT_VALID (qui a un effet uniquement dans les builds de débogage). En outre, ENSURE_VALID lève une exception si le pointeur a la valeur NULL. Le test NULL est effectué dans les configurations Debug et Release.

Si l’un de ces tests échoue, un message d’alerte s’affiche de la même manière que ASSERT. La macro lève une exception d’argument non valide si nécessaire.

Spécifications

En-tête : afx.h

THIS_FILE

Développe le nom du fichier en cours de compilation.

Syntaxe

THIS_FILE

Notes

Les informations sont utilisées par les macros ASSERT et VERIFY. L’Assistant Application et les Assistants code placent la macro dans les fichiers de code source qu’ils créent.

Exemple

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// __FILE__ is one of the six predefined ANSI C macros that the
// compiler recognizes.

Spécifications

En-tête : afx.h

TRACE

Envoie la chaîne spécifiée au débogueur de l’application active.

TRACE(exp)
TRACE(DWORD  category,  UINT  level, LPCSTR lpszFormat, ...)

Notes

Consultez ATLTRACE2 pour obtenir une description de TRACE. TRACE et ATLTRACE2 ont le même comportement.

Dans la version de débogage de MFC, cette macro envoie la chaîne spécifiée au débogueur de l’application actuelle. Dans une build de version, cette macro est compilée en rien (aucun code n’est généré du tout).

Pour plus d’informations, consultez Débogage d’applications MFC.

Spécifications

En-tête : afx.h

VERIFY

Dans la version de débogage de MFC, évalue son argument.

VERIFY(booleanExpression)

Paramètres

booleanExpression
Spécifie une expression (y compris les valeurs de pointeur) qui prend la valeur différente de zéro ou 0.

Notes

Si le résultat est 0, la macro imprime un message de diagnostic et arrête le programme. Si la condition n’est pas nulle, elle ne fait rien.

Le message de diagnostic se présente sous la forme

assertion failed in file <name> in line <num>

le nom est le nom du fichier source et num est le numéro de ligne de l’assertion qui a échoué dans le fichier source.

Dans la version Release de MFC, VERIFY évalue l’expression, mais n’imprime pas ou n’interrompt pas le programme. Par exemple, si l’expression est un appel de fonction, l’appel est effectué.

Exemple

// VERIFY can be used for things that should never fail, though
// you may want to make sure you can provide better error recovery
// if the error can actually cause a crash in a production system.

// It _is_ possible that GetDC() may fail, but the out-of-memory
// condition that causes it isn't likely. For a test application,
// this use of VERIFY() is fine. For any production code, this
// usage is dubious.

// get the display device context
HDC hdc;
VERIFY((hdc = ::GetDC(hwnd)) != NULL);

// give the display context back
::ReleaseDC(hwnd, hdc);

Spécifications

En-tête : afx.h

afxDump (CDumpContext dans MFC)

Fournit une fonctionnalité de vidage d’objets de base dans votre application.

CDumpContext  afxDump;

Notes

afxDumpest un objet CDumpContext prédéfini qui vous permet d’envoyer CDumpContext des informations à la fenêtre de sortie du débogueur ou à un terminal de débogage. En règle générale, vous fournissez afxDump en tant que paramètre à CObject::Dump.

Sous Windows NT et toutes les versions de Windows, afxDump la sortie est envoyée à la fenêtre Output-Debug de Visual C++ lorsque vous déboguez votre application.

Cette variable est définie uniquement dans la version de débogage de MFC. Pour plus d’informations sur , consultez Débogage d’applications afxDumpMFC.

Exemple

// example for afxDump
CPerson* pMyPerson = new CPerson;
// set some fields of the CPerson object...
//..
// now dump the contents
#ifdef _DEBUG
afxDump << _T("Dumping myPerson:\n");
pMyPerson->Dump(afxDump);
afxDump << _T("\n");
#endif

Spécifications

En-tête : afx.h

AfxDump (interne)

Fonction interne utilisée par MFC pour vider l’état d’un objet lors du débogage.

Syntaxe

void AfxDump(const CObject* pOb);

Paramètres

Pob
Pointeur vers un objet d’une classe dérivée de CObject.

Notes

AfxDump appelle la fonction membre d’un Dump objet et envoie les informations à l’emplacement spécifié par la afxDump variable. AfxDump est disponible uniquement dans la version de débogage de MFC.

Votre code de programme ne doit pas appeler AfxDump, mais doit plutôt appeler la Dump fonction membre de l’objet approprié.

Spécifications

En-tête : afx.h

afxMemDF

Cette variable est accessible à partir d’un débogueur ou de votre programme et vous permet de paramétrer les diagnostics d’allocation.

int  afxMemDF;

Notes

afxMemDF peut avoir les valeurs suivantes comme spécifié par l’énumération afxMemDF:

  • allocMemDF Active le débogage de l’allocateur (paramètre par défaut dans la bibliothèque de débogage).

  • delayFreeMemDF Retarde la mémoire. Bien que votre programme libère un bloc de mémoire, l’allocateur ne retourne pas cette mémoire au système d’exploitation sous-jacent. Cela placera le stress maximal de la mémoire sur votre programme.

  • checkAlwaysMemDF Appels AfxCheckMemory chaque fois que la mémoire est allouée ou libérée. Cela ralentit considérablement les allocations de mémoire et les désallocations.

Exemple

afxMemDF = allocMemDF | checkAlwaysMemDF;

Spécifications

En-tête : afx.h

AfxCheckError

Cette fonction teste le SCODE passé pour voir s’il s’agit d’une erreur.

void AFXAPI AfxCheckError(SCODE sc);
throw CMemoryException*
throw COleException*

Notes

S’il s’agit d’une erreur, la fonction lève une exception. Si le SCODE passé est E_OUTOFMEMORY, la fonction lève une exception CMemoryException en appelant AfxThrowMemoryException. Sinon, la fonction lève une exception COleException en appelant AfxThrowOleException.

Cette fonction peut être utilisée pour case activée les valeurs de retour des appels aux fonctions OLE dans votre application. En testant la valeur de retour avec cette fonction dans votre application, vous pouvez réagir correctement aux conditions d’erreur avec une quantité minimale de code.

Remarque

Cette fonction a le même effet dans les builds de débogage et non de débogage.

Exemple

AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_INPROC_SERVER,
   IID_IDispatch, (LPVOID*)& pWMPDispatch));

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

Spécifications

En-tête : afx.h

AfxCheckMemory

Cette fonction valide le pool de mémoire libre et imprime les messages d’erreur selon les besoins.

BOOL  AfxCheckMemory();

Valeur de retour

Différent de zéro si aucune erreur de mémoire ; sinon 0.

Notes

Si la fonction détecte aucune altération de la mémoire, elle n’affiche rien.

Tous les blocs de mémoire actuellement alloués sur le tas sont case activée ed, y compris ceux alloués par new mais pas ceux alloués par des appels directs à des allocateurs de mémoire sous-jacents, tels que la fonction malloc ou la GlobalAlloc fonction Windows. Si un bloc est endommagé, un message est imprimé dans la sortie du débogueur.

Si vous incluez la ligne

#define new DEBUG_NEW

dans un module de programme, puis les appels suivants pour AfxCheckMemory afficher le nom de fichier et le numéro de ligne où la mémoire a été allouée.

Remarque

Si votre module contient une ou plusieurs implémentations de classes sérialisables, vous devez placer la #define ligne après le dernier appel de macro IMPLEMENT_SERIAL.

Cette fonction fonctionne uniquement dans la version de débogage de MFC.

Exemple

CAge* pcage = new CAge(21);  // CAge is derived from CObject.
Age* page = new Age(22);     // Age is NOT derived from CObject.
*(((char*)pcage) - 1) = 99;   // Corrupt preceding guard byte
*(((char*)page) - 1) = 99;    // Corrupt preceding guard byte
AfxCheckMemory();

Spécifications

En-tête : afx.h

AfxDump (MFC)

Appelez cette fonction dans le débogueur pour vider l’état d’un objet lors du débogage.

void AfxDump(const CObject* pOb);

Paramètres

Pob
Pointeur vers un objet d’une classe dérivée de CObject.

Notes

AfxDump appelle la fonction membre d’un Dump objet et envoie les informations à l’emplacement spécifié par la afxDump variable. AfxDump est disponible uniquement dans la version de débogage de MFC.

Votre code de programme ne doit pas appeler AfxDump, mais doit plutôt appeler la Dump fonction membre de l’objet approprié.

Spécifications

En-tête : afx.h

AfxDumpStack

Cette fonction globale peut être utilisée pour générer une image de la pile actuelle.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

Paramètres

dwTarget
Indique la cible de la sortie de vidage. Les valeurs possibles, qui peuvent être combinées à l’aide de l’opérateur BITwise-OR (|) sont les suivantes :

  • AFX_STACK_DUMP_TARGET_TRACE Envoie la sortie au moyen de la macro TRACE . La macro TRACE génère uniquement la sortie dans les builds de débogage ; elle ne génère aucune sortie dans les builds de mise en production. De plus, TRACE peut être redirigé vers d’autres cibles en plus du débogueur.

  • AFX_STACK_DUMP_TARGET_DEFAULT Envoie la sortie de vidage à la cible par défaut. Pour une build de débogage, la sortie accède à la macro TRACE. Dans une build de mise en production, la sortie est envoyée au Presse-papiers.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD Envoie la sortie au Presse-papiers uniquement. Les données sont placées dans le Presse-papiers sous forme de texte brut à l’aide du format CF_TEXT Presse-papiers.

  • AFX_STACK_DUMP_TARGET_BOTH Envoie la sortie au Presse-papiers et à la macro TRACE simultanément.

  • AFX_STACK_DUMP_TARGET_ODS envoie la sortie directement au débogueur au moyen de la fonction OutputDebugString()Win32. Cette option génère la sortie du débogueur dans les builds de débogage et de mise en production lorsqu’un débogueur est attaché au processus. AFX_STACK_DUMP_TARGET_ODS atteint toujours le débogueur (s’il est attaché) et ne peut pas être redirigé.

Notes

L’exemple ci-dessous reflète une seule ligne de la sortie générée à partir d’un AfxDumpStack gestionnaire de boutons dans une application de boîte de dialogue MFC :

=== begin AfxDumpStack output ===
00427D55: DUMP2\DEBUG\DUMP2.EXE! void AfxDumpStack(unsigned long) + 181 bytes
0040160B: DUMP2\DEBUG\DUMP2.EXE! void CDump2Dlg::OnClipboard(void) + 14 bytes
0044F884: DUMP2\DEBUG\DUMP2.EXE! int _AfxDispatchCmdMsg(class CCmdTarget *,
unsigned int,int,void ( CCmdTarget::*)(void),void *,unsigned int,struct
AFX_CMDHANDLE
0044FF7B: DUMP2\DEBUG\DUMP2.EXE! virtual int CCmdTarget::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 626 bytes
00450C71: DUMP2\DEBUG\DUMP2.EXE! virtual int CDialog::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 36 bytes
00455B27: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnCommand(unsigned
int,long) + 312 bytes
00454D3D: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnWndMsg(unsigned
int,unsigned int,long,long *) + 83 bytes
00454CC0: DUMP2\DEBUG\DUMP2.EXE! virtual long CWnd::WindowProc(unsigned
int,unsigned int,long) + 46 bytes
004528D9: DUMP2\DEBUG\DUMP2.EXE! long AfxCallWndProc(class CWnd *,struct
HWND__ *,unsigned int,unsigned int,long) + 237 bytes
00452D34: DUMP2\DEBUG\DUMP2.EXE! long AfxWndProc(struct HWND__ *,unsigned
int,unsigned int,long) + 129 bytes
BFF73663: WINDOWS\SYSTEM\KERNEL32.DLL! ThunkConnect32 + 2148 bytes
BFF928E0: WINDOWS\SYSTEM\KERNEL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===

Chaque ligne de la sortie ci-dessus indique l’adresse du dernier appel de fonction, le nom complet du chemin d’accès du module qui contient l’appel de fonction et le prototype de fonction appelé. Si l’appel de fonction sur la pile ne se produit pas à l’adresse exacte de la fonction, un décalage d’octets est affiché.

Par exemple, le tableau suivant décrit la première ligne de la sortie ci-dessus :

Sortie Description
00427D55: Adresse de retour du dernier appel de fonction.
DUMP2\DEBUG\DUMP2.EXE! Nom complet du chemin d’accès du module qui contient l’appel de fonction.
void AfxDumpStack(unsigned long) Prototype de fonction appelé.
+ 181 bytes Décalage en octets de l’adresse du prototype de fonction (dans ce cas, void AfxDumpStack(unsigned long)) à l’adresse de retour (dans ce cas, 00427D55).

AfxDumpStack est disponible dans les versions de débogage et non de débogage des bibliothèques MFC ; Toutefois, la fonction est toujours liée statiquement, même lorsque votre fichier exécutable utilise MFC dans une DLL partagée. Dans les implémentations de bibliothèque partagée, la fonction se trouve dans le MFCS42. Bibliothèque LIB (et ses variantes).

Pour utiliser cette fonction avec succès :

  • Le fichier IMAGEHLP.DLL doit se trouver sur votre chemin d’accès. Si vous n’avez pas cette DLL, la fonction affiche un message d’erreur. Pour plus d’informations sur le jeu de fonctions fourni par IMAGEHLP, consultez la bibliothèque d’aide sur l’image.

  • Les modules qui ont des images sur la pile doivent inclure des informations de débogage. S’ils ne contiennent pas d’informations de débogage, la fonction génère toujours une trace de pile, mais la trace sera moins détaillée.

Spécifications

En-tête : afx.h

AfxEnableMemoryLeakDump

Active et désactive le vidage de fuite de mémoire dans le destructeur AFX_DEBUG_STATE.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

Paramètres

bDump
[in] TRUE indique que le vidage de fuite de mémoire est activé ; FALSE indique que le vidage de fuite de mémoire est désactivé.

Valeur de retour

La valeur précédente pour cet indicateur.

Notes

Quand une application décharge la bibliothèque MFC, cette bibliothèque recherche les fuites de mémoire. À ce stade, toutes les fuites de mémoire sont signalées à l’utilisateur via la fenêtre débogage de Visual Studio.

Si votre application charge une autre bibliothèque avant la bibliothèque MFC, certaines allocations de mémoire dans cette bibliothèque sont considérées incorrectement comme des fuites de mémoire. Les fausses fuites de mémoire peuvent provoquer la fermeture lente de votre application car la bibliothèque MFC les signale. Dans ce cas, utilisez AfxEnableMemoryLeakDump pour désactiver l’image des fuites de mémoire.

Remarque

Si vous utilisez cette méthode pour désactiver l’image des fuites de mémoire, vous ne recevez pas d’indication des fuites de mémoire valides dans votre application. Vous devez utiliser cette méthode seulement si vous êtes certain que le rapport sur les fuites de mémoire contient des fausses fuites de mémoire.

Spécifications

En-tête : afx.h

AfxEnableMemoryTracking

Le suivi de la mémoire de diagnostic est normalement activé dans la version de débogage de MFC.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

Paramètres

bTrack
La définition de cette valeur sur TRUE active le suivi de la mémoire ; FALSE le désactive.

Valeur de retour

Paramètre précédent de l’indicateur d’activation du suivi.

Notes

Utilisez cette fonction pour désactiver le suivi sur les sections de votre code que vous savez allouer correctement des blocs.

Pour plus d’informations sur , consultez Débogage d’applications AfxEnableMemoryTrackingMFC.

Remarque

Cette fonction fonctionne uniquement dans la version de débogage de MFC.

Exemple

BOOL CMyWinApp::InitInstance()
{
#ifdef _DEBUG
   // Disable tracking of memory for the scope of the InitInstance()
   AfxEnableMemoryTracking(FALSE);
#endif  // _DEBUG

   // ...

#ifdef _DEBUG
   // Re-enable tracking of memory
   AfxEnableMemoryTracking(TRUE);
#endif  // _DEBUG

   return TRUE;
}

Spécifications

En-tête : afx.h

AfxIsMemoryBlock

Teste une adresse mémoire pour vous assurer qu’elle représente un bloc de mémoire actif actuellement alloué par la version de diagnostic de new.

BOOL AfxIsMemoryBlock(
    const void* p,
    UINT nBytes,
    LONG* plRequestNumber = NULL);

Paramètres

p
Pointe vers le bloc de mémoire à tester.

octets
Contient la longueur du bloc de mémoire en octets.

plRequestNumber
Pointe vers un long entier qui sera rempli avec le numéro de séquence d’allocation du bloc de mémoire, ou zéro s’il ne représente pas un bloc de mémoire actif.

Valeur de retour

Différent de zéro si le bloc de mémoire est actuellement alloué et que la longueur est correcte ; sinon 0.

Notes

Il case activée également la taille spécifiée par rapport à la taille allouée d’origine. Si la fonction retourne un nombre différent de zéro, le numéro de séquence d’allocation est retourné dans plRequestNumber. Ce nombre représente l’ordre dans lequel le bloc a été alloué par rapport à toutes les autres new allocations.

Exemple

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(AfxIsMemoryBlock(pcage, sizeof(CAge)));

Spécifications

En-tête : afx.h

AfxIsValidAddress

Teste toute adresse mémoire pour vous assurer qu’elle est entièrement contenue dans l’espace mémoire du programme.

BOOL AfxIsValidAddress(
    const void* lp,
    UINT nBytes,
    BOOL bReadWrite = TRUE);

Paramètres

Lp
Pointe vers l’adresse mémoire à tester.

octets
Contient le nombre d’octets de mémoire à tester.

bReadWrite
Spécifie si la mémoire est à la fois pour la lecture et l’écriture (TRUE) ou simplement la lecture (FALSE).

Valeur de retour

Dans les builds de débogage, non zéro si le bloc de mémoire spécifié est entièrement contenu dans l’espace mémoire du programme ; sinon 0.

Dans les builds non debug, non zéro si lp n’est pas NULL ; sinon, 0.

Notes

L’adresse n’est pas limitée aux blocs alloués par new.

Exemple

// Allocate a 5 character array, which should have a valid memory address.
char* arr = new char[5];

// Create a null pointer, which should be an invalid memory address.
char* null = (char*)0x0;

ASSERT(AfxIsValidAddress(arr, 5));
ASSERT(!AfxIsValidAddress(null, 5));

Spécifications

En-tête : afx.h

AfxIsValidString

Utilisez cette fonction pour déterminer si un pointeur vers une chaîne est valide.

BOOL  AfxIsValidString(
    LPCSTR lpsz,
    int nLength = -1);

Paramètres

lpsz
Pointeur à tester.

nLength
Spécifie la longueur de la chaîne à tester, en octets. La valeur -1 indique que la chaîne sera terminée par null.

Valeur de retour

Dans les builds de débogage, non zéro si le pointeur spécifié pointe vers une chaîne de la taille spécifiée ; sinon 0.

Dans les builds non debug, non zéro si lpsz n’est pas NULL ; sinon, 0.

Exemple

// Create a character string which should be valid.
char str[12] = "hello world";

// Create a null pointer, which should be an invalid string.
char* null = (char*)0x0;

ASSERT(AfxIsValidString(str, 12));
ASSERT(!AfxIsValidString(null, 5));

Spécifications

En-tête : afx.h

AfxSetAllocHook

Définit un hook qui active l’appel de la fonction spécifiée avant l’allocation de chaque bloc de mémoire.

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

Paramètres

pfnAllocHook
Spécifie le nom de la fonction à appeler. Consultez les remarques relatives au prototype d’une fonction d’allocation.

Valeur de retour

Différent de zéro si vous souhaitez autoriser l’allocation ; sinon 0.

Notes

L’allocateur de mémoire de la bibliothèque de classes Microsoft Foundation peut appeler une fonction de hook définie par l’utilisateur pour permettre à l’utilisateur de surveiller une allocation de mémoire et de contrôler si l’allocation est autorisée. Les fonctions de raccordement d’allocation sont prototypes comme suit :

BOOL AFXAPI AllocHook( size_tnSize, BOOLbObject, LONG) ;lRequestNumber

nSize
Taille de l’allocation de mémoire proposée.

bObject
TRUE si l’allocation concerne un CObjectobjet dérivé ; sinon FALSE.

lRequestNumber
Numéro de séquence de l’allocation de mémoire.

Notez que la convention d’appel AFXAPI implique que l’appelé doit supprimer les paramètres de la pile.

Spécifications

En-tête : afx.h

AfxDoForAllClasses

Appelle la fonction d’itération spécifiée pour toutes les classes dérivées sérialisables CObjectdans l’espace mémoire de l’application.

void
AFXAPI AfxDoForAllClasses(
    void (* pfn)(const CRuntimeClass* pClass, void* pContext),
    void* pContext);

Paramètres

pfn
Pointe vers une fonction d’itération à appeler pour chaque classe. Les arguments de fonction sont un pointeur vers un CRuntimeClass objet et un pointeur void vers des données supplémentaires que l’appelant fournit à la fonction.

pContext
Pointe vers des données facultatives que l’appelant peut fournir à la fonction d’itération. Ce pointeur peut être NULL.

Notes

Les classes dérivées sérialisables CObjectsont des classes dérivées à l’aide de la macro DECLARE_SERIAL. Le pointeur passé dans AfxDoForAllClassespContext est passé à la fonction d’itération spécifiée chaque fois qu’il est appelé.

Remarque

Cette fonction fonctionne uniquement dans la version de débogage de MFC.

Exemple

#ifdef _DEBUG
void DoForAllClasses(const CRuntimeClass* pClass, void* pContext)
{
   ASSERT(pContext != NULL);
   CString* pStr = (CString*)pContext;

   *pStr += pClass->m_lpszClassName;
   *pStr += _T("\n");
}
#endif

 

#ifdef _DEBUG
CString cStr;
AfxDoForAllClasses(DoForAllClasses, &cStr);
AfxMessageBox(cStr);
#endif

Spécifications

En-tête : afx.h

AfxDoForAllObjects

Exécute la fonction d’itération spécifiée pour tous les objets dérivés de CObject ceux qui ont été alloués avec new.

void AfxDoForAllObjects(
    void (* pfn)(CObject* pObject, void* pContext),
    void* pContext);

Paramètres

pfn
Pointe vers une fonction d’itération à exécuter pour chaque objet. Les arguments de fonction sont un pointeur vers un CObject pointeur et un pointeur void vers des données supplémentaires que l’appelant fournit à la fonction.

pContext
Pointe vers des données facultatives que l’appelant peut fournir à la fonction d’itération. Ce pointeur peut être NULL.

Notes

Les objets stack, globaux ou incorporés ne sont pas énumérés. Le pointeur passé dans AfxDoForAllObjectspContext est transmis à la fonction d’itération spécifiée chaque fois qu’il est appelé.

Remarque

Cette fonction fonctionne uniquement dans la version de débogage de MFC.

Exemple

#ifdef _DEBUG
void DoForAllObjects(CObject* pObject, void* pContext)
{
   int* pnCount = (int*)pContext;

   pObject->AssertValid();
   if (pnCount != NULL)
      (*pnCount)++;
}
#endif // _DEBUG

 

#ifdef _DEBUG
//AfxDoForAllObjects will call the function DoForAllObjects 
//For each CObject-derived object that is allocated on the heap
int nCount = 0;
AfxDoForAllObjects(DoForAllObjects, &nCount);
TRACE("%d Objects Checked\n", nCount);
#endif

Voir aussi

Macros et globals
CObject ::D ump