Diagnostiktjänster
Microsoft Foundation-klassbiblioteket tillhandahåller många diagnostiktjänster som gör det enklare att felsöka dina program. Dessa diagnostiktjänster omfattar makron och globala funktioner som gör att du kan spåra programmets minnesallokeringar, dumpa innehållet i objekt under körningstiden och skriva ut felsökningsmeddelanden under körningen. Makron och globala funktioner för diagnostiktjänster grupperas i följande kategorier:
Allmänna diagnostikmakron
Allmänna diagnostikfunktioner och variabler
Objektdiagnostikfunktioner
Dessa makron och funktioner är tillgängliga för alla klasser som härleds från CObject
i felsöknings- och versionsversionerna av MFC. Alla utom DEBUG_NEW och VERIFY gör dock ingenting i versionsversionen.
I felsökningsbiblioteket är alla allokerade minnesblock hakparenteserade med en serie "skyddsbyte". Om dessa byte störs av en felaktig minnesskrivning kan diagnostikrutinerna rapportera ett problem. Om du inkluderar raden:
#define new DEBUG_NEW
I implementeringsfilen lagrar alla anrop till new
filnamnet och radnumret där minnesallokeringen ägde rum. Funktionen CMemoryState::D umpAllObjectsSince visar den här extra informationen så att du kan identifiera minnesläckor. Mer information om diagnostikutdata finns i klassen CDumpContext.
Dessutom stöder C-körningsbiblioteket även en uppsättning diagnostikfunktioner som du kan använda för att felsöka dina program. Mer information finns i Felsökningsrutiner i referensen för Run-Time-bibliotek.
Allmänna MFC-diagnostikmakro
Namn | Beskrivning |
---|---|
ASSERT | Skriver ut ett meddelande och avbryter sedan programmet om det angivna uttrycket utvärderas till FALSE i felsökningsversionen av biblioteket. |
ASSERT_KINDOF | Testar att ett objekt är ett objekt i den angivna klassen eller för en klass som härletts från den angivna klassen. |
ASSERT_VALID | Testar ett objekts interna giltighet genom att anropa dess AssertValid medlemsfunktion. åsidosättas vanligtvis från CObject . |
DEBUG_NEW | Tillhandahåller ett filnamn och radnummer för alla objektallokeringar i felsökningsläge för att hitta minnesläckor. |
DEBUG_ONLY | Liknar ASSERT men testar inte uttryckets värde. användbart för kod som endast ska köras i felsökningsläge. |
SE TILL och ENSURE_VALID | Använd för att verifiera data korrekthet. |
THIS_FILE | Expanderar till namnet på filen som kompileras. |
TRACE | Tillhandahåller printf -like-funktion i felsökningsversionen av biblioteket. |
VERIFIERA | Liknar ASSERT men utvärderar uttrycket i versionsversionen av biblioteket samt i felsökningsversionen. |
Allmänna diagnostikvariabler och funktioner för MFC
Namn | Beskrivning |
---|---|
afxDump | Global variabel som skickar CDumpContext information till felsökningsprogrammets utdatafönster eller till felsökningsterminalen. |
afxMemDF | Global variabel som styr beteendet för felsökaren för minnesallokering. |
AfxCheckError | Global variabel som används för att testa godkänd SCODE för att se om det är ett fel och i så fall genererar lämpligt fel. |
AfxCheckMemory | Kontrollerar integriteten för allt allokerat minne. |
AfxDebugBreak | Orsakar ett avbrott i körningen. |
AfxDump | Om det anropas i felsökningsprogrammet dumpar tillståndet för ett objekt vid felsökning. |
AfxDump | Intern funktion som dumpar tillståndet för ett objekt vid felsökning. |
AfxDumpStack | Generera en bild av den aktuella stacken. Den här funktionen är alltid länkad statiskt. |
AfxEnableMemoryLeakDump | Aktiverar minnesläckans dump. |
AfxEnableMemoryTracking | Aktiverar och inaktiverar minnesspårning. |
AfxIsMemoryBlock | Verifierar att ett minnesblock har allokerats korrekt. |
AfxIsValidAddress | Verifierar att ett minnesadressintervall ligger inom programmets gränser. |
AfxIsValidString | Avgör om en pekare till en sträng är giltig. |
AfxSetAllocHook | Aktiverar anrop av en funktion för varje minnesallokering. |
Diagnostikfunktioner för MFC-objekt
Namn | Beskrivning |
---|---|
AfxDoForAllClasses | Utför en angiven funktion på alla CObject -härledda klasser som stöder körningstypkontroll. |
AfxDoForAllObjects | Utför en angiven funktion på alla CObject -härledda objekt som allokerats med new . |
MFC-kompileringsmakron
Namn | Beskrivning |
---|---|
_AFX_SECURE_NO_WARNINGS | Undertrycker kompilatorvarningar för användning av inaktuella MFC-funktioner. |
_AFX_SECURE_NO_WARNINGS
Undertrycker kompilatorvarningar för användning av inaktuella MFC-funktioner.
Syntax
_AFX_SECURE_NO_WARNINGS
Exempel
Det här kodexemplet orsakar en kompilatorvarning om _AFX_SECURE_NO_WARNINGS
inte har definierats.
// 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
Anropa den här funktionen för att orsaka ett avbrott (på platsen för anropet till AfxDebugBreak
) i körningen av felsökningsversionen av ditt MFC-program.
Syntax
void AfxDebugBreak();
Anmärkningar
AfxDebugBreak
har ingen effekt i versionsversioner av ett MFC-program och bör tas bort. Den här funktionen ska endast användas i MFC-program. Använd Win32 API-versionen DebugBreak
för att orsaka ett avbrott i icke-MFC-program.
Krav
rubrik: afxver_.h
HÄVDA
Utvärderar argumentet.
ASSERT(booleanExpression)
Parametrar
booleskExpression
Anger ett uttryck (inklusive pekarvärden) som utvärderas till nonzero eller 0.
Anmärkningar
Om resultatet är 0 skriver makrot ut ett diagnostikmeddelande och avbryter programmet. Om villkoret inte är noll gör det ingenting.
Diagnostikmeddelandet har formuläret
assertion failed in file <name> in line <num>
där namn är namnet på källfilen och num är radnumret för försäkran som misslyckades i källfilen.
I versionsversionen av MFC utvärderar ASSERT inte uttrycket och avbryter därför inte programmet. Om uttrycket måste utvärderas oavsett miljö använder du VERIFY-makrot i stället för ASSERT.
Not
Den här funktionen är endast tillgänglig i felsökningsversionen av MFC.
Exempel
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*.
Krav
rubrik: afx.h
ASSERT_KINDOF
Det här makrot hävdar att objektet som pekar på är ett objekt i den angivna klassen, eller är ett objekt i en klass som härletts från den angivna klassen.
ASSERT_KINDOF(classname, pobject)
Parametrar
Namnet på en CObject
-derived-klass.
pobject
En pekare till ett klassobjekt.
Anmärkningar
Parametern pobject ska vara en pekare till ett objekt och kan const
. Objektet som pekar på och klassen måste ha stöd för CObject
körningsklassinformation. Om du till exempel vill se till att pDocument
är en pekare till ett objekt i klassen CMyDoc
, eller något av dess derivat, kan du koda:
ASSERT_KINDOF(CMyDoc, pDocument);
Att använda ASSERT_KINDOF
makro är exakt detsamma som kodning:
ASSERT(pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
Den här funktionen fungerar endast för klasser som deklarerats med makrot DECLARE_DYNAMIC eller DECLARE_SERIAL.
Not
Den här funktionen är endast tillgänglig i felsökningsversionen av MFC.
Krav
rubrik: afx.h
ASSERT_VALID
Använd för att testa dina antaganden om giltigheten för ett objekts interna tillstånd.
ASSERT_VALID(pObject)
Parametrar
pObject
Anger ett objekt i en klass som härleds från CObject
som har en övergripande version av AssertValid
medlemsfunktion.
Anmärkningar
ASSERT_VALID anropar AssertValid
medlemsfunktionen för objektet som skickas som argument.
I versionen av MFC gör ASSERT_VALID ingenting. I felsökningsversionen validerar den pekaren, kontrollerar mot NULL och anropar objektets egna AssertValid
medlemsfunktioner. Om något av dessa tester misslyckas visas ett aviseringsmeddelande på samma sätt som ASSERT-.
Not
Den här funktionen är endast tillgänglig i felsökningsversionen av MFC.
Mer information och exempel finns i Felsökning av MFC-program.
Exempel
// Assure that pMyObject is a valid pointer to an
// object derived from CObject.
ASSERT_VALID(pMyObject);
Krav
rubrik: afx.h
DEBUG_NEW
Hjälper dig att hitta minnesläckor.
#define new DEBUG_NEW
Anmärkningar
Du kan använda DEBUG_NEW överallt i programmet som du normalt använder new
-operatorn för att allokera heaplagring.
I felsökningsläge (när _DEBUG-symbolen har definierats) håller DEBUG_NEW reda på filnamnet och radnumret för varje objekt som det allokerar. När du sedan använder funktionen CMemoryState::D umpAllObjectsSince medlem visas varje objekt som allokerats med DEBUG_NEW med filnamnet och radnumret där det allokerades.
Om du vill använda DEBUG_NEW infogar du följande direktiv i källfilerna:
#define new DEBUG_NEW
När du har infogat det här direktivet infogar förprocessorn DEBUG_NEW var du än använder new
och MFC gör resten. När du kompilerar en versionsversion av programmet löser DEBUG_NEW en enkel new
åtgärd, och informationen om filnamn och radnummer genereras inte.
Not
I tidigare versioner av MFC (4.1 och tidigare) behövde du placera #define
-instruktionen efter alla instruktioner som anropade IMPLEMENT_DYNCREATE eller IMPLEMENT_SERIAL makron. Detta är inte längre nödvändigt.
Krav
rubrik: afx.h
DEBUG_ONLY
I felsökningsläge (när _DEBUG-symbolen har definierats) utvärderar DEBUG_ONLY argumentet.
DEBUG_ONLY(expression)
Anmärkningar
I en versionsversion utvärderar DEBUG_ONLY inte argumentet. Detta är användbart när du har kod som endast ska köras i felsökningsversioner.
Makrot DEBUG_ONLY motsvarar omgivande uttryck med #ifdef _DEBUG
och #endif
.
Exempel
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');
}
Krav
rubrik: afx.h
SE TILL och ENSURE_VALID
Använd för att verifiera data korrekthet.
Syntax
ENSURE(booleanExpression)
ENSURE_VALID(booleanExpression)
Parametrar
booleskExpression
Anger ett booleskt uttryck som ska testas.
Anmärkningar
Syftet med dessa makron är att förbättra valideringen av parametrar. Makrona förhindrar ytterligare bearbetning av felaktiga parametrar i koden. Till skillnad från ASSERT-makron utlöser ENSURE-makrona ett undantag förutom att generera ett påstående.
Makrona fungerar på två sätt, enligt projektkonfigurationen. Makrona anropar ASSERT och utlöser sedan ett undantag om försäkran misslyckas. I Felsökningskonfigurationer (d.v.s. där _DEBUG definieras) skapar makrona därför ett påstående och undantag medan makrona i Versionskonfigurationer endast genererar undantaget (ASSERT utvärderar inte uttrycket i versionskonfigurationer).
Makrot ENSURE_ARG fungerar som ENSURE-makrot.
ENSURE_VALID anropar makrot ASSERT_VALID (som endast har en effekt i felsökningsversioner). Dessutom utlöser ENSURE_VALID ett undantag om pekaren är NULL. NULL-testet utförs i både felsöknings- och versionskonfigurationer.
Om något av dessa tester misslyckas visas ett aviseringsmeddelande på samma sätt som ASSERT. Makrot genererar ett ogiltigt argumentfel om det behövs.
Krav
rubrik: afx.h
THIS_FILE
Expanderar till namnet på filen som kompileras.
Syntax
THIS_FILE
Anmärkningar
Informationen används av makrona ASSERT och VERIFY. Programguiden och kodguiderna placerar makrot i de källkodsfiler som de skapar.
Exempel
#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.
Krav
rubrik: afx.h
SPÅRA
Skickar den angivna strängen till felsökaren för det aktuella programmet.
TRACE(exp)
TRACE(DWORD category, UINT level, LPCSTR lpszFormat, ...)
Anmärkningar
En beskrivning av TRACE finns i ATLTRACE2. TRACE och ATLTRACE2 har samma beteende.
I felsökningsversionen av MFC skickar det här makrot den angivna strängen till felsökningsprogrammet för det aktuella programmet. I en versionsversion kompileras makrot till ingenting (ingen kod genereras alls).
Mer information finns i Felsökning av MFC-program.
Krav
rubrik: afx.h
KONTROLLERA
I felsökningsversionen av MFC utvärderar dess argument.
VERIFY(booleanExpression)
Parametrar
booleskExpression
Anger ett uttryck (inklusive pekarvärden) som utvärderas till nonzero eller 0.
Anmärkningar
Om resultatet är 0 skriver makrot ut ett diagnostikmeddelande och stoppar programmet. Om villkoret inte är noll gör det ingenting.
Diagnostikmeddelandet har formuläret
assertion failed in file <name> in line <num>
där namn är namnet på källfilen och num är radnumret för försäkran som misslyckades i källfilen.
I versionsversionen av MFC utvärderar VERIFY uttrycket men skriver inte ut eller avbryter inte programmet. Om uttrycket till exempel är ett funktionsanrop görs anropet.
Exempel
// 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);
Krav
rubrik: afx.h
afxDump (CDumpContext i MFC)
Ger grundläggande funktioner för objektdumpning i ditt program.
CDumpContext afxDump;
Anmärkningar
afxDump
är en fördefinierad CDumpContext- objekt som gör att du kan skicka CDumpContext
information till felsökningsprogrammets utdatafönster eller till en felsökningsterminal. Vanligtvis anger du afxDump
som en parameter för att CObject::Dump
.
Under Windows NT och alla versioner av Windows skickas afxDump
utdata till Output-Debug-fönstret i Visual C++ när du felsöker ditt program.
Den här variabeln definieras endast i felsökningsversionen av MFC. Mer information om afxDump
finns i Felsökning av MFC-program.
Exempel
// 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
Krav
rubrik: afx.h
AfxDump (intern)
Intern funktion som MFC använder för att dumpa tillståndet för ett objekt vid felsökning.
Syntax
void AfxDump(const CObject* pOb);
Parametrar
pOb
En pekare till ett objekt i en klass som härletts från CObject
.
Anmärkningar
AfxDump
anropar ett objekts Dump
medlemsfunktion och skickar informationen till den plats som anges av variabeln afxDump
.
AfxDump
är endast tillgängligt i felsökningsversionen av MFC.
Programkoden ska inte anropa AfxDump
, utan anropa i stället Dump
medlemsfunktion för lämpligt objekt.
Krav
rubrik: afx.h
afxMemDF
Den här variabeln är tillgänglig från ett felsökningsprogram eller ditt program och gör att du kan justera allokeringsdiagnostik.
int afxMemDF;
Anmärkningar
afxMemDF
kan ha följande värden enligt uppräkningen afxMemDF
:
allocMemDF
Aktiverar felsökning av allokerare (standardinställning i felsökningsbiblioteket).delayFreeMemDF
Fördröjningar som frigör minne. Programmet frigör ett minnesblock, men allokeraren returnerar inte det minnet till det underliggande operativsystemet. Detta kommer att ge programmet maximal minnesbelastning.checkAlwaysMemDF
anroparAfxCheckMemory
varje gång minnet allokeras eller frigörs. Detta kommer att göra minnesallokeringar och frigöringar avsevärt långsammare.
Exempel
afxMemDF = allocMemDF | checkAlwaysMemDF;
Krav
rubrik: afx.h
AfxCheckError
Den här funktionen testar godkänd SCODE för att se om det är ett fel.
void AFXAPI AfxCheckError(SCODE sc);
throw CMemoryException*
throw COleException*
Anmärkningar
Om det är ett fel utlöser funktionen ett undantag. Om den skickade SCODE-koden är E_OUTOFMEMORY genererar funktionen en CMemoryException- genom att anropa AfxThrowMemoryException. Annars genererar funktionen en COleException- genom att anropa AfxThrowOleException.
Den här funktionen kan användas för att kontrollera returvärdena för anrop till OLE-funktioner i ditt program. Genom att testa returvärdet med den här funktionen i ditt program kan du reagera korrekt på feltillstånd med en minimal mängd kod.
Not
Den här funktionen har samma effekt i felsöknings- och icke-felsökningsversioner.
Exempel
AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_INPROC_SERVER,
IID_IDispatch, (LPVOID*)& pWMPDispatch));
oddWMP.AttachDispatch(pWMPDispatch, TRUE);
Krav
rubrik: afx.h
AfxCheckMemory
Den här funktionen validerar den kostnadsfria minnespoolen och skriver ut felmeddelanden efter behov.
BOOL AfxCheckMemory();
Returvärde
Nonzero om inga minnesfel; annars 0.
Anmärkningar
Om funktionen inte upptäcker någon minnesskada skrivs ingenting ut.
Alla minnesblock som för närvarande allokeras på heapen kontrolleras, inklusive de som allokeras av new
men inte de som allokeras av direkta anrop till underliggande minnesallokerare, till exempel funktionen malloc eller funktionen GlobalAlloc
Windows. Om något block visar sig vara skadat skrivs ett meddelande ut till felsökningsprogrammets utdata.
Om du inkluderar raden
#define new DEBUG_NEW
i en programmodul visar efterföljande anrop till AfxCheckMemory
filnamnet och radnumret där minnet allokerades.
Not
Om modulen innehåller en eller flera implementeringar av serialiserbara klasser måste du placera #define
rad efter det senaste IMPLEMENT_SERIAL makroanropet.
Den här funktionen fungerar bara i felsökningsversionen av MFC.
Exempel
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();
Krav
rubrik: afx.h
AfxDump (MFC)
Anropa den här funktionen i felsökningsprogrammet för att dumpa tillståndet för ett objekt vid felsökning.
void AfxDump(const CObject* pOb);
Parametrar
pOb
En pekare till ett objekt i en klass som härletts från CObject
.
Anmärkningar
AfxDump
anropar ett objekts Dump
medlemsfunktion och skickar informationen till den plats som anges av variabeln afxDump
.
AfxDump
är endast tillgängligt i felsökningsversionen av MFC.
Programkoden ska inte anropa AfxDump
, utan anropa i stället Dump
medlemsfunktion för lämpligt objekt.
Krav
rubrik: afx.h
AfxDumpStack
Den här globala funktionen kan användas för att generera en bild av den aktuella stacken.
void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);
Parametrar
dwTarget
Anger målet för dumputdata. Möjliga värden, som kan kombineras med operatorn bitwise-OR (|
) är följande:
AFX_STACK_DUMP_TARGET_TRACE Skickar utdata med hjälp av makrot TRACE. Trace-makrot genererar endast utdata i felsökningsversioner. det genererar inga utdata i versionsversioner. Dessutom kan TRACE omdirigeras till andra mål förutom felsökningsprogrammet.
AFX_STACK_DUMP_TARGET_DEFAULT Skickar dumputdata till standardmålet. För en felsökningsversion går utdata till TRACE-makrot. I en versionsversion går utdata till Urklipp.
AFX_STACK_DUMP_TARGET_CLIPBOARD Skickar endast utdata till Urklipp. Data placeras i Urklipp som oformaterad text med hjälp av CF_TEXT Urklippsformat.
AFX_STACK_DUMP_TARGET_BOTH Skickar utdata till Urklipp och till TRACE-makrot samtidigt.
AFX_STACK_DUMP_TARGET_ODS Skickar utdata direkt till felsökningsprogrammet med hjälp av funktionen Win32
OutputDebugString()
. Det här alternativet genererar felsökningsutdata i både felsöknings- och versionsversioner när ett felsökningsprogram är kopplat till processen. AFX_STACK_DUMP_TARGET_ODS når alltid felsökningsprogrammet (om det är kopplat) och kan inte omdirigeras.
Anmärkningar
Exemplet nedan visar en enda rad med utdata som genererats från att anropa AfxDumpStack
från en knapphanterare i ett MFC-dialogprogram:
=== 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 ===
Varje rad i utdata ovan anger adressen för det senaste funktionsanropet, det fullständiga sökvägsnamnet för modulen som innehåller funktionsanropet och funktionsprototypen anropad. Om funktionsanropet på stacken inte sker på den exakta adressen för funktionen visas en förskjutning av byte.
I följande tabell beskrivs till exempel den första raden i ovanstående utdata:
Utdata | Beskrivning |
---|---|
00427D55: |
Returadressen för det senaste funktionsanropet. |
DUMP2\DEBUG\DUMP2.EXE! |
Det fullständiga sökvägsnamnet för modulen som innehåller funktionsanropet. |
void AfxDumpStack(unsigned long) |
Funktionsprototypen anropas. |
+ 181 bytes |
Förskjutningen i byte från adressen för funktionsprototypen (i det här fallet void AfxDumpStack(unsigned long) ) till returadressen (i det här fallet 00427D55 ). |
AfxDumpStack
är tillgängligt i felsöknings- och nondebug-versioner av MFC-biblioteken. Funktionen länkas dock alltid statiskt, även när den körbara filen använder MFC i en delad DLL. I implementeringar av delat bibliotek finns funktionen i MFCS42. LIB-bibliotek (och dess varianter).
Så här använder du den här funktionen:
Filen IMAGEHLP.DLL måste finnas på sökvägen. Om du inte har den här DLL-filen visas ett felmeddelande för funktionen. Mer information om funktionsuppsättningen som tillhandahålls av IMAGEHLP finns i Image Help Library.
Modulerna som har ramar i stacken måste innehålla felsökningsinformation. Om de inte innehåller felsökningsinformation genererar funktionen fortfarande en stackspårning, men spårningen blir mindre detaljerad.
Krav
rubrik: afx.h
AfxEnableMemoryLeakDump
Aktiverar och inaktiverar minnesläckagedumpen i AFX_DEBUG_STATE destruktor.
BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);
Parametrar
bDump
[i] TRUE anger att minnesläckagedumpen är aktiverad. FALSE anger att minnesläckans dump är inaktiverad.
Returvärde
Föregående värde för den här flaggan.
Anmärkningar
När ett program tar bort MFC-biblioteket söker MFC-biblioteket efter minnesläckor. I det här läget rapporteras eventuella minnesläckor till användaren via Felsökning fönstret i Visual Studio.
Om programmet läser in ett annat bibliotek före MFC-biblioteket rapporteras vissa minnesallokeringar i biblioteket felaktigt som minnesläckor. Falska minnesläckor kan göra att programmet stängs långsamt när MFC-biblioteket rapporterar dem. I det här fallet använder du AfxEnableMemoryLeakDump
för att inaktivera minnesläckagedumpen.
Not
Om du använder den här metoden för att stänga av minnesläckagedumpen får du inga rapporter om giltiga minnesläckor i programmet. Du bör bara använda den här metoden om du är säker på att rapporten med minnesläckage innehåller falska minnesläckor.
Krav
rubrik: afx.h
AfxEnableMemoryTracking
Spårning av diagnostiskt minne är normalt aktiverat i felsökningsversionen av MFC.
BOOL AfxEnableMemoryTracking(BOOL bTrack);
Parametrar
bTrack
Om du ställer in det här värdet på TRUE aktiveras minnesspårning. FALSE inaktiverar det.
Returvärde
Föregående inställning för flaggan tracking-enable.
Anmärkningar
Använd den här funktionen om du vill inaktivera spårning i delar av koden som du vet allokerar block korrekt.
Mer information om AfxEnableMemoryTracking
finns i Felsökning av MFC-program.
Not
Den här funktionen fungerar bara i felsökningsversionen av MFC.
Exempel
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;
}
Krav
rubrik: afx.h
AfxIsMemoryBlock
Testar en minnesadress för att se till att den representerar ett aktivt minnesblock som allokerats av diagnostikversionen av new
.
BOOL AfxIsMemoryBlock(
const void* p,
UINT nBytes,
LONG* plRequestNumber = NULL);
Parametrar
p
Pekar på det minnesblock som ska testas.
nBytes
Innehåller längden på minnesblocket i byte.
plRequestNumber
Pekar på ett long
heltal som fylls i med minnesblockets allokeringssekvensnummer eller noll om det inte representerar ett aktivt minnesblock.
Returvärde
Nonzero om minnesblocket för närvarande är allokerat och längden är korrekt. annars 0.
Anmärkningar
Den kontrollerar också den angivna storleken mot den ursprungliga allokerade storleken. Om funktionen returnerar nonzero returneras allokeringssekvensnumret i plRequestNumber. Det här talet representerar den ordning i vilken blocket allokerades i förhållande till alla andra new
allokeringar.
Exempel
CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(AfxIsMemoryBlock(pcage, sizeof(CAge)));
Krav
rubrik: afx.h
AfxIsValidAddress
Testar alla minnesadresser för att säkerställa att den finns helt i programmets minnesutrymme.
BOOL AfxIsValidAddress(
const void* lp,
UINT nBytes,
BOOL bReadWrite = TRUE);
Parametrar
lp
Pekar på den minnesadress som ska testas.
nBytes
Innehåller antalet byte minne som ska testas.
bReadWrite
Anger om minnet både ska läsas och skrivas (TRUE) eller bara läsa (FALSE).
Returvärde
I felsökningsversioner går det inte att nollkoppla om det angivna minnesblocket helt och hållet finns i programmets minnesutrymme. annars 0.
I icke-felsökningsversioner är icke-noll om lp- inte är NULL; annars 0.
Anmärkningar
Adressen är inte begränsad till block som allokeras av new
.
Exempel
// 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));
Krav
rubrik: afx.h
AfxIsValidString
Använd den här funktionen för att avgöra om en pekare till en sträng är giltig.
BOOL AfxIsValidString(
LPCSTR lpsz,
int nLength = -1);
Parametrar
lpsz
Pekaren som ska testas.
nLength
Anger längden på strängen som ska testas i byte. Värdet -1 anger att strängen kommer att vara null-avslutad.
Returvärde
I felsökningsversioner går det inte att nolla om den angivna pekaren pekar på en sträng med den angivna storleken. annars 0.
I icke-felsökningsversioner är icke-noll om lpsz inte är NULL; annars 0.
Exempel
// 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));
Krav
rubrik: afx.h
AfxSetAllocHook
Anger en krok som möjliggör anrop av den angivna funktionen innan varje minnesblock allokeras.
AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);
Parametrar
pfnAllocHook
Anger namnet på den funktion som ska anropas. Se Anmärkningar för prototypen av en allokeringsfunktion.
Returvärde
Nonzero om du vill tillåta allokeringen; annars 0.
Anmärkningar
Microsoft Foundation-klassbibliotekets allokering av felsökningsminne kan anropa en användardefinierad hook-funktion så att användaren kan övervaka en minnesallokering och kontrollera om allokeringen är tillåten. Allokeringskrokfunktioner är prototyper enligt följande:
BOOL AFXAPI AllocHook( size_tnSize
, BOOLbObject
, LONGlRequestNumber
);
nSize
Storleken på den föreslagna minnesallokeringen.
bObject
SANT om allokeringen gäller för ett CObject
-derived-objekt; annars FALSKT.
lRequestNumber
Minnesallokeringens sekvensnummer.
Observera att AFXAPI-anropskonventionen innebär att anropare måste ta bort parametrarna från stacken.
Krav
rubrik: afx.h
AfxDoForAllClasses
Anropar den angivna iterationsfunktionen för alla serialiserbara CObject
-härledda klasser i programmets minnesutrymme.
void
AFXAPI AfxDoForAllClasses(
void (* pfn)(const CRuntimeClass* pClass, void* pContext),
void* pContext);
Parametrar
pfn
Pekar på en iterationsfunktion som ska anropas för varje klass. Funktionsargumenten är en pekare till ett CRuntimeClass
-objekt och en tomrumspekare till extra data som anroparen levererar till funktionen.
pContext
Pekar på valfria data som anroparen kan ange till iterationsfunktionen. Den här pekaren kan vara NULL.
Anmärkningar
Serialiserbara CObject
-härledda klasser är klasser som härleds med hjälp av DECLARE_SERIAL makro. Pekaren som skickas till AfxDoForAllClasses
i pContext skickas till den angivna iterationsfunktionen varje gång den anropas.
Not
Den här funktionen fungerar bara i felsökningsversionen av MFC.
Exempel
#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
Krav
rubrik: afx.h
AfxDoForAllObjects
Kör den angivna iterationsfunktionen för alla objekt som härletts från CObject
som har allokerats med new
.
void AfxDoForAllObjects(
void (* pfn)(CObject* pObject, void* pContext),
void* pContext);
Parametrar
pfn
Pekar på en iterationsfunktion som ska köras för varje objekt. Funktionsargumenten är en pekare till en CObject
och en tomrumspekare till extra data som anroparen levererar till funktionen.
pContext
Pekar på valfria data som anroparen kan ange till iterationsfunktionen. Den här pekaren kan vara NULL.
Anmärkningar
Stack-, globala eller inbäddade objekt räknas inte upp. Pekaren som skickas till AfxDoForAllObjects
i pContext skickas till den angivna iterationsfunktionen varje gång den anropas.
Not
Den här funktionen fungerar bara i felsökningsversionen av MFC.
Exempel
#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