Share via


Diagnostische services

De Microsoft Foundation Class Library biedt veel diagnostische services waarmee foutopsporing van uw programma's eenvoudiger wordt. Deze diagnostische services omvatten macro's en globale functies waarmee u de geheugentoewijzingen van uw programma kunt bijhouden, de inhoud van objecten tijdens runtime kunt dumpen en berichten over foutopsporing kunt afdrukken tijdens runtime. De macro's en globale functies voor diagnostische services zijn gegroepeerd in de volgende categorieën:

  • Algemene diagnostische macro's

  • Algemene diagnostische functies en variabelen

  • Diagnostische functies voor objecten

Deze macro's en functies zijn beschikbaar voor alle klassen die zijn afgeleid van CObject in de versies Debug en Release van MFC. Alle behalve DEBUG_NEW en VERIFY doen echter niets in de releaseversie.

In de bibliotheek Foutopsporing worden alle toegewezen geheugenblokken tussen haakjes geplaatst met een reeks 'bytes bewaken'. Als deze bytes worden gestoord door een foutieve schrijfbewerking van het geheugen, kunnen de diagnostische routines een probleem melden. Als u de regel opneemt:

#define new DEBUG_NEW

in uw implementatiebestand slaan alle aanroepen naar new de bestandsnaam en het regelnummer op waar de geheugentoewijzing plaatsvond. De functie CMemoryState::D umpAllObjectsSince geeft deze extra informatie weer, zodat u geheugenlekken kunt identificeren. Raadpleeg ook de klasse CDumpContext- voor aanvullende informatie over diagnostische uitvoer.

Daarnaast ondersteunt de C-runtimebibliotheek ook een set diagnostische functies die u kunt gebruiken om fouten in uw toepassingen op te sporen. Zie Foutopsporingsroutines in de naslaginformatie over Run-Time bibliotheek voor meer informatie.

Algemene diagnostische MFC-macro's

Naam Beschrijving
ASSERT- Hiermee wordt een bericht afgedrukt en wordt het programma afgebroken als de opgegeven expressie ONWAAR is in de foutopsporingsversie van de bibliotheek.
ASSERT_KINDOF Test of een object een object is van de opgegeven klasse of van een klasse die is afgeleid van de opgegeven klasse.
ASSERT_VALID Test de interne geldigheid van een object door de AssertValid lidfunctie aan te roepen; overschreven van CObject.
DEBUG_NEW Levert een bestandsnaam en regelnummer voor alle objecttoewijzingen in de foutopsporingsmodus om geheugenlekken te vinden.
DEBUG_ONLY Vergelijkbaar met ASSERT, maar test de waarde van de expressie niet; handig voor code die alleen moet worden uitgevoerd in de foutopsporingsmodus.
ENSURE en ENSURE_VALID Gebruik dit om de juistheid van gegevens te valideren.
THIS_FILE Breidt naar de naam van het bestand dat wordt gecompileerd.
TRACERING Biedt printf-achtige mogelijkheid in de foutopsporingsversie van de bibliotheek.
CONTROLEREN Vergelijkbaar met ASSERT, maar evalueert de expressie in de releaseversie van de bibliotheek en in de foutopsporingsversie.

Algemene diagnostische MFC-variabelen en -functies

Naam Beschrijving
afxDump- Globale variabele die CDumpContext informatie verzendt naar het uitvoervenster van het foutopsporingsprogramma of naar de terminal voor foutopsporing.
afxMemDF- Globale variabele waarmee het gedrag van de foutopsporing van geheugentoewijzing wordt bepaald.
AfxCheckError- Globale variabele die wordt gebruikt om de doorgegeven SCODE te testen om te zien of het een fout is en, indien dat het geval is, genereert de juiste fout.
AfxCheckMemory- Controleert de integriteit van alle momenteel toegewezen geheugen.
AfxDebugBreak- Veroorzaakt een onderbreking in de uitvoering.
AfxDump- Als deze wordt aangeroepen in het foutopsporingsprogramma, dumpt u de status van een object tijdens foutopsporing.
AfxDump- Interne functie die de status van een object dumpt tijdens foutopsporing.
AfxDumpStack Genereer een afbeelding van de huidige stack. Deze functie is altijd statisch gekoppeld.
AfxEnableMemoryLeakDump Hiermee schakelt u de geheugenlekdump in.
AfxEnableMemoryTracking- Hiermee schakelt u het bijhouden van geheugen in en uit.
AfxIsMemoryBlock Controleert of een geheugenblok correct is toegewezen.
AfxIsValidAddress- Controleert of een geheugenadresbereik binnen de grenzen van het programma valt.
AfxIsValidString- Bepaalt of een aanwijzer naar een tekenreeks geldig is.
AfxSetAllocHook- Hiermee schakelt u het aanroepen van een functie in op elke geheugentoewijzing.

Diagnostische functies voor MFC-objecten

Naam Beschrijving
AfxDoForAllClasses- Voert een opgegeven functie uit op alle CObject-afgeleide klassen die ondersteuning bieden voor het controleren van runtimetypen.
AfxDoForAllObjects- Voert een opgegeven functie uit op alle CObject-afgeleide objecten die zijn toegewezen met new.

MFC-compilatiemacro's

Naam Beschrijving
_AFX_SECURE_NO_WARNINGS Onderdrukt compilerwaarschuwingen voor het gebruik van afgeschafte MFC-functies.

_AFX_SECURE_NO_WARNINGS

Onderdrukt compilerwaarschuwingen voor het gebruik van afgeschafte MFC-functies.

Syntaxis

_AFX_SECURE_NO_WARNINGS

Voorbeeld

Dit codevoorbeeld veroorzaakt een compilerwaarschuwing als _AFX_SECURE_NO_WARNINGS niet is gedefinieerd.

// 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

Roep deze functie aan om een onderbreking te veroorzaken (op de locatie van de aanroep naar AfxDebugBreak) in de uitvoering van de foutopsporingsversie van uw MFC-toepassing.

Syntaxis

void AfxDebugBreak();

Opmerkingen

AfxDebugBreak heeft geen effect in releaseversies van een MFC-toepassing en moet worden verwijderd. Deze functie mag alleen worden gebruikt in MFC-toepassingen. Gebruik de Win32 API-versie, DebugBreak, om een onderbreking in niet-MFC-toepassingen te veroorzaken.

Eisen

koptekst: afxver_.h

BEWEREN

Evalueert het argument.

ASSERT(booleanExpression)

Parameters

booleanExpression-
Hiermee geeft u een expressie (inclusief aanwijzerwaarden) op die resulteert in niet-nul of 0.

Opmerkingen

Als het resultaat 0 is, drukt de macro een diagnostisch bericht af en wordt het programma afgebroken. Als de voorwaarde niet nul is, doet deze niets.

Het diagnostische bericht heeft het formulier

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

waarbij naam de naam van het bronbestand is en getal het regelnummer is van de bewering die is mislukt in het bronbestand.

In de releaseversie van MFC evalueert ASSERT de expressie niet en wordt het programma dus niet onderbroken. Als de expressie moet worden geëvalueerd, ongeacht de omgeving, gebruikt u de macro VERIFY in plaats van ASSERT.

Notitie

Deze functie is alleen beschikbaar in de foutopsporingsversie van MFC.

Voorbeeld

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*.   

Eisen

koptekst: afx.h

ASSERT_KINDOF

Deze macro geeft aan dat het object waarnaar wordt verwezen een object van de opgegeven klasse is of een object is van een klasse die is afgeleid van de opgegeven klasse.

ASSERT_KINDOF(classname, pobject)

Parameters

klassenaam
De naam van een CObject-afgeleide klasse.


Een aanwijzer naar een klasseobject.

Opmerkingen

De parameter pobject moet een aanwijzer naar een object zijn en kan worden const. Het object waarnaar wordt verwezen en de klasse moet ondersteuning bieden voor CObject runtimeklassegegevens. Als u er bijvoorbeeld voor wilt zorgen dat pDocument een aanwijzer is naar een object van de CMyDoc-klasse of een van de derivaten ervan, kunt u code schrijven:

ASSERT_KINDOF(CMyDoc, pDocument);

Het gebruik van de ASSERT_KINDOF macro is precies hetzelfde als coderen:

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

Deze functie werkt alleen voor klassen die zijn gedeclareerd met de DECLARE_DYNAMIC of DECLARE_SERIAL macro.

Notitie

Deze functie is alleen beschikbaar in de foutopsporingsversie van MFC.

Eisen

koptekst: afx.h

ASSERT_VALID

Gebruik dit om uw veronderstellingen over de geldigheid van de interne status van een object te testen.

ASSERT_VALID(pObject)

Parameters

pObject-
Hiermee geeft u een object op van een klasse die is afgeleid van CObject met een onderdrukkingsversie van de AssertValid lidfunctie.

Opmerkingen

ASSERT_VALID roept de AssertValid lidfunctie van het object aan dat als argument is doorgegeven.

In de releaseversie van MFC ASSERT_VALID niets doet. In de foutopsporingsversie wordt de aanwijzer gevalideerd, gecontroleerd op NULL en worden de eigen AssertValid lidfuncties van het object aangeroepen. Als een van deze tests mislukt, wordt een waarschuwingsbericht op dezelfde manier weergegeven als ASSERT-.

Notitie

Deze functie is alleen beschikbaar in de foutopsporingsversie van MFC.

Zie MFC-toepassingenvoor meer informatie en voorbeelden.

Voorbeeld

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

Eisen

koptekst: afx.h

DEBUG_NEW

Helpt bij het vinden van geheugenlekken.

#define new DEBUG_NEW

Opmerkingen

U kunt DEBUG_NEW overal in uw programma gebruiken die u normaal gesproken de new-operator zou gebruiken om heap-opslag toe te wijzen.

In de foutopsporingsmodus (wanneer het symbool _DEBUG is gedefinieerd), houdt DEBUG_NEW de bestandsnaam en het regelnummer bij voor elk object dat wordt toegewezen. Wanneer u vervolgens de functie CMemoryState::D umpAllObjectsSince lid gebruikt, wordt elk object dat is toegewezen met DEBUG_NEW weergegeven met de bestandsnaam en het regelnummer waar het is toegewezen.

Als u DEBUG_NEW wilt gebruiken, voegt u de volgende instructie in uw bronbestanden in:

#define new DEBUG_NEW

Zodra u deze richtlijn invoegt, wordt de preprocessor DEBUG_NEW ingevoegd waar u newgebruikt, en MFC doet de rest. Wanneer u een releaseversie van uw programma compileert, wordt DEBUG_NEW omgezet in een eenvoudige new bewerking en worden de bestandsnaam- en regelnummergegevens niet gegenereerd.

Notitie

In eerdere versies van MFC (4.1 en eerder) moest u de #define instructie plaatsen na alle instructies die de IMPLEMENT_DYNCREATE of IMPLEMENT_SERIAL macro's genoemd. Dit is niet meer nodig.

Eisen

koptekst: afx.h

DEBUG_ONLY

In de foutopsporingsmodus (wanneer het _DEBUG symbool is gedefinieerd), DEBUG_ONLY het argument evalueert.

DEBUG_ONLY(expression)

Opmerkingen

In een release-build evalueert DEBUG_ONLY het argument ervan niet. Dit is handig wanneer u code hebt die alleen moet worden uitgevoerd in builds voor foutopsporing.

De DEBUG_ONLY macro is gelijk aan expressie met #ifdef _DEBUG en #endif.

Voorbeeld

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');
}

Eisen

koptekst: afx.h

CONTROLEREN en ENSURE_VALID

Gebruik dit om de juistheid van gegevens te valideren.

Syntaxis

ENSURE(booleanExpression)
ENSURE_VALID(booleanExpression)

Parameters

booleanExpression-
Hiermee geeft u een booleaanse expressie die moet worden getest.

Opmerkingen

Het doel van deze macro's is om de validatie van parameters te verbeteren. De macro's voorkomen verdere verwerking van onjuiste parameters in uw code. In tegenstelling tot de ASSERT-macro's genereren de macro's ENSURE een uitzondering naast het genereren van een assertie.

De macro's gedragen zich op twee manieren, volgens de projectconfiguratie. De macro's roepen ASSERT aan en genereren vervolgens een uitzondering als de assertie mislukt. In configuraties voor foutopsporing (dat wil zeggen, waarbij _DEBUG is gedefinieerd) produceren de macro's dus een assertie en uitzondering terwijl in releaseconfiguraties de macro's alleen de uitzondering produceren (ASSERT evalueert de expressie niet in releaseconfiguraties).

De macro ENSURE_ARG fungeert als de macro ENSURE.

ENSURE_VALID roept de ASSERT_VALID macro aan (dit heeft alleen effect in builds voor foutopsporing). Bovendien genereert ENSURE_VALID een uitzondering als de aanwijzer NULL is. De NULL-test wordt uitgevoerd in configuraties voor foutopsporing en release.

Als een van deze tests mislukt, wordt een waarschuwingsbericht op dezelfde manier weergegeven als ASSERT. De macro genereert indien nodig een ongeldige argument-uitzondering.

Eisen

koptekst: afx.h

THIS_FILE

Breidt naar de naam van het bestand dat wordt gecompileerd.

Syntaxis

THIS_FILE

Opmerkingen

De informatie wordt gebruikt door de macro's ASSERT en VERIFY. De wizard Toepassing en codewizards plaatsen de macro in broncodebestanden die ze maken.

Voorbeeld

#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.

Eisen

koptekst: afx.h

SPOOR

Hiermee wordt de opgegeven tekenreeks verzonden naar het foutopsporingsprogramma van de huidige toepassing.

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

Opmerkingen

Zie ATLTRACE2 voor een beschrijving van TRACE. TRACE en ATLTRACE2 hetzelfde gedrag hebben.

In de foutopsporingsversie van MFC verzendt deze macro de opgegeven tekenreeks naar het foutopsporingsprogramma van de huidige toepassing. In een release-build wordt deze macro gecompileerd tot niets (helemaal geen code wordt gegenereerd).

Zie MFC-toepassingen voor foutopsporingvoor meer informatie.

Eisen

koptekst: afx.h

VERIFIËREN

Evalueert het argument in de foutopsporingsversie van MFC.

VERIFY(booleanExpression)

Parameters

booleanExpression-
Hiermee geeft u een expressie (inclusief aanwijzerwaarden) op die resulteert in niet-nul of 0.

Opmerkingen

Als het resultaat 0 is, drukt de macro een diagnostisch bericht af en stopt het programma. Als de voorwaarde niet nul is, doet deze niets.

Het diagnostische bericht heeft het formulier

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

waarbij naam de naam van het bronbestand is en getal het regelnummer is van de bewering die is mislukt in het bronbestand.

In de releaseversie van MFC evalueert VERIFY de expressie, maar wordt het programma niet afgedrukt of onderbroken. Als de expressie bijvoorbeeld een functieoproep is, wordt de aanroep uitgevoerd.

Voorbeeld

// 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);

Eisen

koptekst: afx.h

afxDump (CDumpContext in MFC)

Biedt eenvoudige objectdumpmogelijkheden in uw toepassing.

CDumpContext afxDump;

Opmerkingen

afxDump is een vooraf gedefinieerd CDumpContext--object waarmee u CDumpContext informatie kunt verzenden naar het uitvoervenster van het foutopsporingsprogramma of naar een foutopsporingsterminal. Normaal gesproken geeft u afxDump op als parameter voor CObject::Dump.

Onder Windows NT en alle versies van Windows wordt afxDump uitvoer verzonden naar het Output-Debug venster van Visual C++ wanneer u fouten in uw toepassing opsneert.

Deze variabele wordt alleen gedefinieerd in de foutopsporingsversie van MFC. Zie MFC-toepassingenvoor meer informatie over afxDump.

Voorbeeld

// 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

Eisen

koptekst: afx.h

AfxDump (intern)

Interne functie die MFC gebruikt om de status van een object te dumpen tijdens foutopsporing.

Syntaxis

void AfxDump(const CObject* pOb);

Parameters

pOb-
Een aanwijzer naar een object van een klasse die is afgeleid van CObject.

Opmerkingen

AfxDump roept de Dump lidfunctie van een object aan en verzendt de informatie naar de locatie die is opgegeven door de afxDump variabele. AfxDump is alleen beschikbaar in de foutopsporingsversie van MFC.

Uw programmacode mag geen AfxDumpaanroepen, maar moet in plaats daarvan de Dump lidfunctie van het juiste object aanroepen.

Eisen

koptekst: afx.h

afxMemDF

Deze variabele is toegankelijk vanuit een foutopsporingsprogramma of uw programma en stelt u in staat om diagnostische toewijzingen af te stemmen.

int afxMemDF;

Opmerkingen

afxMemDF kan de volgende waarden hebben zoals opgegeven door de opsomming afxMemDF:

  • allocMemDF schakelt foutopsporings allocator in (standaardinstelling in de bibliotheek voor foutopsporing).

  • delayFreeMemDF vertragingen die geheugen vrijmaken. Hoewel uw programma een geheugenblok vrij maakt, retourneert de allocator dat geheugen niet naar het onderliggende besturingssysteem. Dit zal maximale geheugenbelasting op uw programma plaatsen.

  • checkAlwaysMemDF oproepen AfxCheckMemory telkens wanneer geheugen wordt toegewezen of vrijgemaakt. Hierdoor worden geheugentoewijzingen en deallocatie aanzienlijk vertraagd.

Voorbeeld

afxMemDF = allocMemDF | checkAlwaysMemDF;

Eisen

koptekst: afx.h

AfxCheckError

Met deze functie wordt de doorgegeven SCODE getest om te zien of het een fout is.

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

Opmerkingen

Als het een fout is, genereert de functie een uitzondering. Als de doorgegeven SCODE is E_OUTOFMEMORY, genereert de functie een CMemoryException- door AfxThrowMemoryExceptionaan te roepen. Anders genereert de functie een COleException- door AfxThrowOleExceptionaan te roepen.

Deze functie kan worden gebruikt om de retourwaarden van aanroepen naar OLE-functies in uw toepassing te controleren. Door de retourwaarde te testen met deze functie in uw toepassing, kunt u op de juiste manier reageren op foutvoorwaarden met een minimale hoeveelheid code.

Notitie

Deze functie heeft hetzelfde effect in builds voor foutopsporing en niet-foutopsporing.

Voorbeeld

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

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

Eisen

koptekst: afx.h

AfxCheckMemory

Met deze functie wordt de gratis geheugengroep gevalideerd en worden foutberichten afgedrukt zoals vereist.

BOOL AfxCheckMemory();

Retourwaarde

Niet-nul als er geen geheugenfouten zijn; anders 0.

Opmerkingen

Als de functie geen geheugenbeschadiging detecteert, wordt er niets afgedrukt.

Alle geheugenblokken die momenteel op de heap zijn toegewezen, worden gecontroleerd, inclusief blokken die zijn toegewezen door new, maar niet door directe aanroepen naar onderliggende geheugentoewijzingen, zoals de malloc--functie of de GlobalAlloc Windows-functie. Als er een blok is beschadigd, wordt een bericht afgedrukt naar de uitvoer van het foutopsporingsprogramma.

Als u de regel opneemt

#define new DEBUG_NEW

in een programmamodule en vervolgens volgende aanroepen naar AfxCheckMemory de bestandsnaam en het regelnummer weergeven waar het geheugen is toegewezen.

Notitie

Als uw module een of meer implementaties van serialiseerbare klassen bevat, moet u de #define regel na de laatste IMPLEMENT_SERIAL macroaanroep plaatsen.

Deze functie werkt alleen in de foutopsporingsversie van MFC.

Voorbeeld

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();

Eisen

koptekst: afx.h

AfxDump (MFC)

Roep deze functie aan in het foutopsporingsprogramma om de status van een object te dumpen tijdens foutopsporing.

void AfxDump(const CObject* pOb);

Parameters

pOb-
Een aanwijzer naar een object van een klasse die is afgeleid van CObject.

Opmerkingen

AfxDump roept de Dump lidfunctie van een object aan en verzendt de informatie naar de locatie die is opgegeven door de afxDump variabele. AfxDump is alleen beschikbaar in de foutopsporingsversie van MFC.

Uw programmacode mag geen AfxDumpaanroepen, maar moet in plaats daarvan de Dump lidfunctie van het juiste object aanroepen.

Eisen

koptekst: afx.h

AfxDumpStack

Deze globale functie kan worden gebruikt om een afbeelding van de huidige stack te genereren.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

Parameters

dwTarget-
Geeft het doel van de dumpuitvoer aan. Mogelijke waarden, die kunnen worden gecombineerd met behulp van de operator bitwise-OR (|), zijn als volgt:

  • AFX_STACK_DUMP_TARGET_TRACE verzendt uitvoer met behulp van de MACRO TRACE. De TRACE-macro genereert alleen uitvoer in builds voor foutopsporing; er wordt geen uitvoer gegenereerd in release-builds. Trace kan ook worden omgeleid naar andere doelen naast het foutopsporingsprogramma.

  • AFX_STACK_DUMP_TARGET_DEFAULT verzendt dumpuitvoer naar het standaarddoel. Voor een foutopsporingsbuild gaat de uitvoer naar de TRACE-macro. In een release-build gaat de uitvoer naar het Klembord.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD alleen uitvoer naar het Klembord verzenden. De gegevens worden op het Klembord geplaatst als tekst zonder opmaak met behulp van de indeling CF_TEXT Klembord.

  • AFX_STACK_DUMP_TARGET_BOTH Verzendt uitvoer naar het Klembord en naar de traceringsmacro tegelijk.

  • AFX_STACK_DUMP_TARGET_ODS verzendt uitvoer rechtstreeks naar het foutopsporingsprogramma door middel van de Win32-functie OutputDebugString(). Met deze optie wordt foutopsporingsprogramma-uitvoer gegenereerd in zowel foutopsporings- als release-builds wanneer er een foutopsporingsprogramma aan het proces is gekoppeld. AFX_STACK_DUMP_TARGET_ODS altijd het foutopsporingsprogramma bereikt (als het is gekoppeld) en niet kan worden omgeleid.

Opmerkingen

In het onderstaande voorbeeld ziet u één regel van de uitvoer die is gegenereerd door het aanroepen van AfxDumpStack vanuit een knophandler in een MFC-dialoogvenstertoepassing:

=== 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 ===

Elke regel in de bovenstaande uitvoer geeft het adres aan van de laatste functie-aanroep, de volledige padnaam van de module die de functie-aanroep bevat en het prototype van de functie. Als de functieaanroep op de stack niet plaatsvindt op het exacte adres van de functie, wordt een offset van bytes weergegeven.

In de volgende tabel wordt bijvoorbeeld de eerste regel van de bovenstaande uitvoer beschreven:

Uitvoer Beschrijving
00427D55: Het retouradres van de laatste functie-aanroep.
DUMP2\DEBUG\DUMP2.EXE! De volledige padnaam van de module die de functie-aanroep bevat.
void AfxDumpStack(unsigned long) Het prototype van de functie aangeroepen.
+ 181 bytes De verschuiving in bytes van het adres van het functieprototype (in dit geval void AfxDumpStack(unsigned long)) naar het retouradres (in dit geval 00427D55).

AfxDumpStack is beschikbaar in foutopsporings- en niet-foutopsporingsversies van de MFC-bibliotheken; De functie is echter altijd statisch gekoppeld, zelfs wanneer uw uitvoerbare bestand MFC gebruikt in een gedeelde DLL. In implementaties van gedeelde bibliotheken vindt u de functie in de MFCS42. LIB-bibliotheek (en de bijbehorende varianten).

Ga als volgt te werk om deze functie te gebruiken:

  • Het bestand IMAGEHLP.DLL moet zich op het pad bevinden. Als u deze DLL niet hebt, wordt er een foutbericht weergegeven met de functie. Zie Help-bibliotheek voor afbeeldingen voor informatie over de functieset van IMAGEHLP.

  • De modules met frames op de stack moeten informatie over foutopsporing bevatten. Als ze geen foutopsporingsgegevens bevatten, genereert de functie nog steeds een stack-trace, maar wordt de tracering minder gedetailleerd.

Eisen

koptekst: afx.h

AfxEnableMemoryLeakDump

Schakelt de geheugenlekdump in en uit in de AFX_DEBUG_STATE destructor.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

Parameters

bDump-
[in] TRUE geeft aan dat de geheugenlekdump is ingeschakeld; FALSE geeft aan dat de geheugenlekdump is uitgeschakeld.

Retourwaarde

De vorige waarde voor deze vlag.

Opmerkingen

Wanneer een toepassing de MFC-bibliotheek uitpakt, controleert de MFC-bibliotheek op geheugenlekken. Op dit moment worden eventuele geheugenlekken gerapporteerd aan de gebruiker via het venster Foutopsporing van Visual Studio.

Als uw toepassing een andere bibliotheek laadt vóór de MFC-bibliotheek, worden sommige geheugentoewijzingen in die bibliotheek onjuist gerapporteerd als geheugenlekken. Foutieve geheugenlekken kunnen ertoe leiden dat uw toepassing langzaam wordt gesloten wanneer de MFC-bibliotheek deze rapporteert. In dit geval gebruikt u AfxEnableMemoryLeakDump om de geheugenlekdump uit te schakelen.

Notitie

Als u deze methode gebruikt om de geheugenlekdump uit te schakelen, ontvangt u geen rapporten over geldige geheugenlekken in uw toepassing. Gebruik deze methode alleen als u zeker weet dat het rapport over geheugenlekken foutieve geheugenlekken bevat.

Eisen

koptekst: afx.h

AfxEnableMemoryTracking

Het bijhouden van diagnostisch geheugen wordt normaal gesproken ingeschakeld in de foutopsporingsversie van MFC.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

Parameters

bTrack-
Als u deze waarde instelt op TRUE, wordt het bijhouden van geheugen ingeschakeld; FALSE schakelt het uit.

Retourwaarde

De vorige instelling van de vlag voor bijhouden inschakelen.

Opmerkingen

Gebruik deze functie om het bijhouden van secties van uw code uit te schakelen waarvan u weet dat u blokken correct toegeeft.

Zie MFC-toepassingenvoor meer informatie over AfxEnableMemoryTracking.

Notitie

Deze functie werkt alleen in de foutopsporingsversie van MFC.

Voorbeeld

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;
}

Eisen

koptekst: afx.h

AfxIsMemoryBlock

Test een geheugenadres om ervoor te zorgen dat het een momenteel actief geheugenblok vertegenwoordigt dat is toegewezen door de diagnostische versie van new.

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

Parameters

p
Verwijst naar het geheugenblok dat moet worden getest.

nBytes
Bevat de lengte van het geheugenblok in bytes.

plRequestNumber
Verwijst naar een long geheel getal dat wordt ingevuld met het toewijzingsreeksnummer van het geheugenblok of nul als dit geen actief geheugenblok vertegenwoordigt.

Retourwaarde

Niet-nul als het geheugenblok momenteel wordt toegewezen en de lengte juist is; anders 0.

Opmerkingen

Ook wordt de opgegeven grootte gecontroleerd op basis van de oorspronkelijke toegewezen grootte. Als de functie niet-nul retourneert, wordt het toewijzingsreeksnummer geretourneerd in plRequestNumber. Dit getal vertegenwoordigt de volgorde waarin het blok is toegewezen ten opzichte van alle andere new toewijzingen.

Voorbeeld

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

Eisen

koptekst: afx.h

AfxIsValidAddress

Test elk geheugenadres om ervoor te zorgen dat het zich volledig in de geheugenruimte van het programma bevindt.

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

Parameters

lp-
Verwijst naar het geheugenadres dat moet worden getest.

nBytes
Bevat het aantal bytes aan geheugen dat moet worden getest.

bReadWrite-
Hiermee geeft u op of het geheugen zowel voor lezen als schrijven (WAAR) of alleen lezen (ONWAAR) is.

Retourwaarde

In builds voor foutopsporing, niet-nul als het opgegeven geheugenblok zich volledig in de geheugenruimte van het programma bevindt; anders 0.

Niet-foutopsporingsversies als lp- niet NULL is; anders 0.

Opmerkingen

Het adres is niet beperkt tot blokken die zijn toegewezen door new.

Voorbeeld

// 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));

Eisen

koptekst: afx.h

AfxIsValidString

Gebruik deze functie om te bepalen of een aanwijzer naar een tekenreeks geldig is.

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

Parameters

lpsz-
De aanwijzer die moet worden getest.

nLength-
Hiermee geeft u de lengte op van de tekenreeks die moet worden getest, in bytes. Een waarde van -1 geeft aan dat de tekenreeks null-beëindigd wordt.

Retourwaarde

In builds voor foutopsporing, niet-nul als de opgegeven aanwijzer verwijst naar een tekenreeks van de opgegeven grootte; anders 0.

In niet-foutopsporingsversies is niet nul als lpsz- niet NULL is; anders 0.

Voorbeeld

// 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));

Eisen

koptekst: afx.h

AfxSetAllocHook

Hiermee stelt u een haak in waarmee de opgegeven functie kan worden aangeroepen voordat elk geheugenblok wordt toegewezen.

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

Parameters

pfnAllocHook-
Hiermee geeft u de naam van de functie die moet worden aangeroepen. Zie de opmerkingen voor het prototype van een toewijzingsfunctie.

Retourwaarde

Nonzero als u de toewijzing wilt toestaan; anders 0.

Opmerkingen

Met de microsoft Foundation Class Library-allocator voor foutopsporingsgeheugen kan een door de gebruiker gedefinieerde hook-functie worden aangeroepen, zodat de gebruiker een geheugentoewijzing kan bewaken en kan bepalen of de toewijzing is toegestaan. Toewijzingshookfuncties worden als volgt geproprototeerd:

BOOL AFXAPI AllocHook( size_tnSize, BOOLbObject, LONGlRequestNumber);

nSize
De grootte van de voorgestelde geheugentoewijzing.

bObject-
WAAR als de toewijzing voor een CObject-afgeleide object is; anders ONWAAR.

lRequestNumber
Het volgnummer van de geheugentoewijzing.

Houd er rekening mee dat de AFXAPI-aanroepconventie impliceert dat de aanroep de parameters uit de stack moet verwijderen.

Eisen

koptekst: afx.h

AfxDoForAllClasses

Roept de opgegeven iteratiefunctie aan voor alle serialiseerbare CObject-afgeleide klassen in de geheugenruimte van de toepassing.

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

Parameters

pfn-
Verwijst naar een iteratiefunctie die voor elke klasse moet worden aangeroepen. De functieargumenten zijn een aanwijzer naar een CRuntimeClass-object en een ongeldige aanwijzer naar extra gegevens die de aanroeper aan de functie levert.

pContext-
Verwijst naar optionele gegevens die de aanroeper kan leveren aan de iteratiefunctie. Deze aanwijzer kan NULL zijn.

Opmerkingen

Serialiseerbare CObject-afgeleide klassen zijn klassen die zijn afgeleid met behulp van de DECLARE_SERIAL macro. De aanwijzer die wordt doorgegeven aan AfxDoForAllClasses in pContext- wordt doorgegeven aan de opgegeven iteratiefunctie telkens wanneer deze wordt aangeroepen.

Notitie

Deze functie werkt alleen in de foutopsporingsversie van MFC.

Voorbeeld

#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

Eisen

koptekst: afx.h

AfxDoForAllObjects

Hiermee wordt de opgegeven iteratiefunctie uitgevoerd voor alle objecten die zijn afgeleid van CObject die zijn toegewezen met new.

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

Parameters

pfn-
Verwijst naar een iteratiefunctie die moet worden uitgevoerd voor elk object. De functieargumenten zijn een aanwijzer naar een CObject en een ongeldige aanwijzer naar extra gegevens die de aanroeper aan de functie levert.

pContext-
Verwijst naar optionele gegevens die de aanroeper kan leveren aan de iteratiefunctie. Deze aanwijzer kan NULL zijn.

Opmerkingen

Stack-, globale of ingesloten objecten worden niet opgesomd. De aanwijzer die is doorgegeven aan AfxDoForAllObjects in pContext- wordt telkens wanneer deze wordt aangeroepen, doorgegeven aan de opgegeven iteratiefunctie.

Notitie

Deze functie werkt alleen in de foutopsporingsversie van MFC.

Voorbeeld

#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

Zie ook

macro's en globale
CObject::D ump-