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 new
gebruikt, 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 AfxDump
aanroepen, 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
oproepenAfxCheckMemory
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 AfxDump
aanroepen, 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