Dela via


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 DebugBreakfö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 newoch 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 afxDumpfinns 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 anropar AfxCheckMemory 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 AfxEnableMemoryTrackingfinns 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

Se även

makron och globala
CObject::D ump