Megosztás a következőn keresztül:


Diagnosztikai szolgáltatások

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

A Microsoft Foundation osztálykönyvtár számos diagnosztikai szolgáltatást biztosít, amelyek megkönnyítik a programok hibakeresését. Ezek a diagnosztikai szolgáltatások olyan makrókat és globális függvényeket tartalmaznak, amelyek lehetővé teszik a program memóriafoglalásainak nyomon követését, az objektumok tartalmának kiírását a futási idő alatt, valamint hibakeresési üzenetek nyomtatását a futási idő alatt. A diagnosztikai szolgáltatások makrói és globális függvényei a következő kategóriákba vannak csoportosítva:

  • Általános diagnosztikai makrók

  • Általános diagnosztikai függvények és változók

  • Objektumdiagnosztikai függvények

Ezek a makrók és függvények az MFC hibakeresési és kiadási verzióiból CObject származó összes osztályhoz elérhetők. A DEBUG_NEW és a VERIFY kivételével azonban a kiadási verzióban semmit sem tehet.

A hibakeresési kódtárban az összes lefoglalt memóriablokk zárójelbe van állítva egy sor "védőbájttal". Ha ezeket a bájtokat egy hibás memória írása zavarja, akkor a diagnosztikai rutinok jelenthetnek problémát. Ha a sort is belefoglalja:

#define new DEBUG_NEW

a implementációs fájlban minden hívás new tárolja a fájlnevet és a sorszámot, ahol a memóriafoglalás történt. A CMemoryState::D umpAllObjectsSince függvény megjeleníti ezt a további információt, így azonosíthatja a memóriavesztéseket. A diagnosztikai kimenettel kapcsolatos további információkért tekintse meg a CDumpContext osztályt is.

A C futásidejű kódtár emellett az alkalmazások hibakereséséhez használható diagnosztikai függvények készletét is támogatja. További információ: Hibakeresési rutinok a Run-Time könyvtár referenciájában.

Általános MFC diagnosztikai makrók

Név Description
AZT ÁLLÍTJÁK Kinyomtat egy üzenetet, majd megszakítja a programot, ha a megadott kifejezés HAMIS értéket ad vissza a kódtár hibakeresési verziójában.
ASSERT_KINDOF Ellenőrzi, hogy egy objektum a megadott osztály vagy a megadott osztályból származtatott osztály objektuma-e.
ASSERT_VALID Egy objektum belső érvényességét a tagfüggvény meghívásával teszteli AssertValid , amely általában felül van bírálva a függvénytől CObject.
DEBUG_NEW A hibakeresési módban lévő összes objektumfoglaláshoz megadja a fájlnevet és a sorszámot a memóriavesztések megkereséséhez.
DEBUG_ONLY Hasonló az ASSERT függvényhez, de nem teszteli a kifejezés értékét; olyan kód esetén hasznos, amelyet csak hibakeresési módban kell végrehajtani.
ENSURE és ENSURE_VALID Az adatok helyességének ellenőrzésére használható.
THIS_FILE Kibontja a lefordított fájl nevét.
TRACE -like képességet biztosít printfa kódtár hibakeresési verziójában.
ELLENŐRIZZE Hasonló az ASSERT függvényhez, de kiértékeli a kifejezést a kódtár kiadási és hibakeresési verziójában.

MFC általános diagnosztikai változók és függvények

Név Description
afxDump Globális változó, amely CDumpContext-információkat küld a hibakereső kimeneti ablakába vagy a hibakereső terminálba.
afxMemDF A hibakeresési memóriaelosztó viselkedését vezérlő globális változó.
AfxCheckError Az átadott SCODE tesztelésére használt globális változó ellenőrzi, hogy hiba-e, és ha igen, akkor a megfelelő hibát adja vissza.
AfxCheckMemory Ellenőrzi az összes jelenleg lefoglalt memória integritását.
AfxDebugBreak A végrehajtás megszakadását okozza.
AfxDump Ha a hibakeresőben meghívja őket, a hibakeresés során egy objektum állapotát adja vissza.
AfxDump Belső függvény, amely hibakeresés közben törli az objektum állapotát.
AfxDumpStack Hozzon létre egy képet az aktuális veremről. Ez a függvény mindig statikusan van összekapcsolva.
AfxEnableMemoryLeakDump Engedélyezi a memóriaszivárgási memóriaképet.
AfxEnableMemoryTracking Be- és kikapcsolja a memóriakövetést.
AfxIsMemoryBlock Ellenőrzi, hogy a memóriablokk megfelelően lett-e lefoglalva.
AfxIsValidAddress Ellenőrzi, hogy egy memóriacímtartomány a program határain belül van-e.
AfxIsValidString Meghatározza, hogy a sztringre mutató mutató érvényes-e.
AfxSetAllocHook Lehetővé teszi egy függvény hívását az egyes memóriafoglalásokon.

MFC objektumdiagnosztikai függvények

Név Description
AfxDoForAllClasses Egy megadott függvényt hajt végre az összes CObjectolyan származtatott osztályon, amely támogatja a futásidejű típusellenőrzést.
AfxDoForAllObjects Egy megadott függvényt hajt végre az összes CObjectolyan -származtatott objektumon, amely a rendszer által newlefoglalt.

MFC-fordítási makrók

Név Description
_AFX_SECURE_NO_WARNINGS Letiltja az elavult MFC-függvények használatára vonatkozó fordítói figyelmeztetéseket.

_AFX_SECURE_NO_WARNINGS

Letiltja az elavult MFC-függvények használatára vonatkozó fordítói figyelmeztetéseket.

Szemantika

_AFX_SECURE_NO_WARNINGS

Example

Ez a kódminta fordítási figyelmeztetést okoz, ha _AFX_SECURE_NO_WARNINGS nincs definiálva.

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

Hívja meg ezt a függvényt úgy, hogy az MFC-alkalmazás hibakeresési verziójának végrehajtása során (a hívás AfxDebugBreakhelyén) szünetet okozzon.

Szemantika

void AfxDebugBreak();

Megjegyzések

AfxDebugBreak nincs hatása az MFC-alkalmazások kiadási verzióira, ezért el kell távolítani. Ez a függvény csak MFC-alkalmazásokban használható. A Win32 API-verzióval DebugBreakmegszakíthatja a nem MFC-alkalmazások használatát.

Requirements

Fejléc: afxver_.h

AZT ÁLLÍTJÁK

Kiértékeli az argumentumát.

ASSERT(booleanExpression)

Paraméterek

booleanExpression
Olyan kifejezést ad meg (a mutatóértékeket is beleértve), amely nem aero vagy 0 értéket ad vissza.

Megjegyzések

Ha az eredmény 0, a makró kinyomtat egy diagnosztikai üzenetet, és megszakítja a programot. Ha a feltétel nonzero, akkor nem tesz semmit.

A diagnosztikai üzenet űrlapja

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

ahol a név a forrásfájl neve, a szám pedig annak az állításnak a sorszáma, amely a forrásfájlban meghiúsult.

Az MFC kiadási verziójában az ASSERT nem értékeli ki a kifejezést, így nem szakítja meg a programot. Ha a kifejezést a környezettől függetlenül kell kiértékelni, használja a VERIFY makrót a HELYESSÉG helyett.

Megjegyzés:

Ez a függvény csak az MFC hibakeresési verziójában érhető el.

Example

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

Requirements

Fejléc: afx.h

ASSERT_KINDOF

Ez a makró azt állítja, hogy a mutatott objektum a megadott osztály objektuma, vagy a megadott osztályból származtatott osztály objektuma.

ASSERT_KINDOF(classname, pobject)

Paraméterek

Osztálynév
-származtatott osztály neve CObject.

pobject
Egy osztályobjektumra mutató mutató.

Megjegyzések

A pobject paraméternek egy objektumra mutató mutatónak kell lennie, és lehet const. A kijelölt objektumnak és az osztálynak támogatnia CObject kell a futásidejű osztály adatait. Ha például azt szeretné, hogy pDocument az osztály egy objektumára CMyDoc vagy annak bármely származékára mutató mutató legyen, a következő kóddal rendelkezhet:

ASSERT_KINDOF(CMyDoc, pDocument);

ASSERT_KINDOF A makró használata pontosan megegyezik a kódolással:

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

Ez a függvény csak a DECLARE_DYNAMIC vagy DECLARE_SERIAL makróval deklarált osztályok esetében működik.

Megjegyzés:

Ez a függvény csak az MFC hibakeresési verziójában érhető el.

Requirements

Fejléc: afx.h

ASSERT_VALID

Az objektum belső állapotának érvényességére vonatkozó feltételezések tesztelésére használható.

ASSERT_VALID(pObject)

Paraméterek

pObject
Egy olyan osztály objektumát adja meg, amely a CObject tagfüggvény felülíró verziójával AssertValid rendelkezik.

Megjegyzések

ASSERT_VALID argumentumként AssertValid az átadott objektum tagfüggvényét hívja meg.

Az MFC kiadási verziójában ASSERT_VALID nem tesz semmit. A hibakeresési verzióban ellenőrzi az egérmutatót, ellenőrzi a NULL értéket, és meghívja az objektum saját AssertValid tagfüggvényeit. Ha a tesztek bármelyike sikertelen, a riasztási üzenet ugyanúgy jelenik meg, mint az ASSERT.

Megjegyzés:

Ez a függvény csak az MFC hibakeresési verziójában érhető el.

További információkért és példákért lásd az MFC-alkalmazások hibakeresését.

Example

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

Requirements

Fejléc: afx.h

DEBUG_NEW

Segít megtalálni a memóriavesztéseket.

#define new DEBUG_NEW

Megjegyzések

A programban mindenhol használhat DEBUG_NEW, amelyet általában az new operátorral osztana ki a halomtárhelyhez.

Hibakeresési módban (a _DEBUG szimbólum definiálásakor) DEBUG_NEW nyomon követi az egyes lefoglalt objektumok fájlnevét és sorszámát. Ezután a CMemoryState::D umpAllObjectsSince tagfüggvény használatakor a DEBUG_NEW lefoglalt összes objektum megjelenik a fájlnévvel és a sorszámmal, ahol lefoglalták.

A DEBUG_NEW használatához szúrja be a következő irányelveket a forrásfájlokba:

#define new DEBUG_NEW

Az irányelv beszúrása után az előfeldolgozó mindenhol newbeszúrja DEBUG_NEW, a többit pedig az MFC végzi. Amikor lefordítja a program kiadási verzióját, DEBUG_NEW egy egyszerű new művelettel oldja fel, és a fájlnév és a sorszám adatai nem jönnek létre.

Megjegyzés:

Az MFC korábbi verzióiban (4.1 és korábbi verziókban) az #define utasítást az IMPLEMENT_DYNCREATE vagy IMPLEMENT_SERIAL makróknak nevezett összes utasítás után kellett elhelyezni. Erre már nincs szükség.

Requirements

Fejléc: afx.h

DEBUG_ONLY

Hibakeresési módban (a _DEBUG szimbólum definiálásakor) DEBUG_ONLY kiértékeli annak argumentumát.

DEBUG_ONLY(expression)

Megjegyzések

Egy kiadási buildben DEBUG_ONLY nem értékeli ki az argumentumát. Ez akkor hasznos, ha olyan kóddal rendelkezik, amelyet csak hibakeresési buildekben kell végrehajtani.

A DEBUG_ONLY makró egyenértékű az és #ifdef _DEBUG#endif .

Example

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

Requirements

Fejléc: afx.h

ENSURE és ENSURE_VALID

Az adatok helyességének ellenőrzésére használható.

Szemantika

ENSURE(booleanExpression)
ENSURE_VALID(booleanExpression)

Paraméterek

booleanExpression
A tesztelni kívánt logikai kifejezést adja meg.

Megjegyzések

Ezeknek a makróknak a célja a paraméterek ellenőrzésének javítása. A makrók megakadályozzák a kód helytelen paramétereinek további feldolgozását. Az ASSERT makrókkal ellentétben a ENSURE makrók kivételt képeznek az állítás létrehozása mellett.

A makrók kétféleképpen viselkednek a projektkonfigurációnak megfelelően. A makrók meghívják az ASSERT függvényt, majd kivételt adnak, ha az állítás meghiúsul. Így a hibakeresési konfigurációkban (vagyis ahol a _DEBUG definiálva van) a makrók állítást és kivételt eredményeznek, míg a Kiadási konfigurációkban a makrók csak a kivételt állítják elő (az ASSERT nem értékeli ki a kifejezést a Kiadási konfigurációkban).

A makró ENSURE_ARG a ENSURE makróhoz hasonlóan működik.

ENSURE_VALID meghívja a ASSERT_VALID makrót (amelynek csak hibakeresési buildekben van hatása). Emellett ENSURE_VALID kivételt is jelez, ha az egérmutató NULL értékű. A NULL-tesztet hibakeresési és kiadási konfigurációkban is végrehajtja a rendszer.

Ha a tesztek bármelyike sikertelen, a riasztási üzenet ugyanúgy jelenik meg, mint az ASSERT. A makró érvénytelen argumentumkivételt eredményez, ha szükséges.

Requirements

Fejléc: afx.h

THIS_FILE

Kibontja a lefordított fájl nevét.

Szemantika

THIS_FILE

Megjegyzések

Az adatokat az ASSERT és a VERIFY makrók használják. Az alkalmazásvarázsló és a kódvarázslók a makrót az általuk létrehozott forráskódfájlokba helyezik.

Example

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

Requirements

Fejléc: afx.h

NYOM

Elküldi a megadott sztringet az aktuális alkalmazás hibakeresőjének.

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

Megjegyzések

A TRACE leírását lásd a ATLTRACE2 . A TRACE és a ATLTRACE2 ugyanaz a viselkedésük.

Az MFC hibakeresési verziójában ez a makró elküldi a megadott sztringet az aktuális alkalmazás hibakeresőjének. Egy kiadási buildben ez a makró semmire nem fordítható (a rendszer egyáltalán nem hoz létre kódot).

További információ: MFC-alkalmazások hibakeresése.

Requirements

Fejléc: afx.h

ELLENŐRIZZE

Az MFC hibakeresési verziójában kiértékeli annak argumentumát.

VERIFY(booleanExpression)

Paraméterek

booleanExpression
Olyan kifejezést ad meg (a mutatóértékeket is beleértve), amely nem aero vagy 0 értéket ad vissza.

Megjegyzések

Ha az eredmény 0, a makró diagnosztikai üzenetet nyomtat ki, és leállítja a programot. Ha a feltétel nonzero, akkor nem tesz semmit.

A diagnosztikai üzenet űrlapja

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

ahol a név a forrásfájl neve, a szám pedig a forrásfájlban meghiúsult állítás sorszáma.

Az MFC kiadási verziójában a VERIFY kiértékeli a kifejezést, de nem nyomtatja ki vagy szakítja meg a programot. Ha például a kifejezés függvényhívás, a rendszer meghívja a hívást.

Example

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

Requirements

Fejléc: afx.h

afxDump (CDumpContext in MFC)

Alapvető objektum-memóriaképezési képességet biztosít az alkalmazásban.

CDumpContext afxDump;

Megjegyzések

afxDump Egy előre definiált CDumpContext objektum, amely lehetővé teszi, hogy adatokat küldjön CDumpContext a hibakereső kimeneti ablakába vagy egy hibakereső terminálba. Általában paraméterként adja meg afxDump a következőt: CObject::Dump.

A Windows NT és a Windows afxDump összes verziója alatt a kimenet a Visual Studio Output-Debug ablakába lesz küldve az alkalmazás hibakeresésekor.

Ez a változó csak az MFC hibakeresési verziójában van definiálva. További információ: afxDumpMFC-alkalmazások hibakeresése.

Example

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

Requirements

Fejléc: afx.h

AfxDump (belső)

Belső függvény, amelyet az MFC használ egy objektum állapotának hibakeresés közbeni memóriaképéhez.

Szemantika

void AfxDump(const CObject* pOb);

Paraméterek

Pob
Egy osztály objektumára mutató mutató, amely a forrásból CObjectszármazik.

Megjegyzések

AfxDump meghívja egy objektum tagfüggvényét Dump , és elküldi az információt a afxDump változó által megadott helyre. AfxDump csak az MFC hibakeresési verziójában érhető el.

A programkód nem hívhatja meg AfxDump, hanem a Dump megfelelő objektum tagfüggvényét kell meghívnia.

Requirements

Fejléc: afx.h

afxMemDF

Ez a változó elérhető egy hibakeresőtől vagy a programtól, és lehetővé teszi a foglalási diagnosztikák hangolását.

int afxMemDF;

Megjegyzések

afxMemDF az enumerálás afxMemDFáltal megadott alábbi értékekkel rendelkezhet:

  • allocMemDF Bekapcsolja a hibakeresési kiosztót (alapértelmezett beállítás a Hibakeresési kódtárban).

  • delayFreeMemDF Késlelteti a memória felszabadítását. Bár a program felszabadít egy memóriablokkot, a kiosztó nem adja vissza a memóriát a mögöttes operációs rendszernek. Ez maximális memóriaterhelést helyez el a programon.

  • checkAlwaysMemDF Minden alkalommal meghívja AfxCheckMemory a memóriát, amikor a rendszer lefoglalja vagy felszabadítja a memóriát. Ez jelentősen lelassítja a memóriafoglalásokat és felszabadításokat.

Example

afxMemDF = allocMemDF | checkAlwaysMemDF;

Requirements

Fejléc: afx.h

AfxCheckError

Ez a függvény teszteli az átadott SCODE-t, és ellenőrzi, hogy hiba-e.

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

Megjegyzések

Hiba esetén a függvény kivételt jelez. Ha az átadott SCODE E_OUTOFMEMORY, a függvény AfxThrowMemoryException meghívásával CMemoryException értéket ad. Ellenkező esetben a függvény AfxThrowOleException meghívásával COleException értéket ad.

Ez a függvény az OLE-függvények hívásainak visszaadott értékeinek ellenőrzésére használható az alkalmazásban. Ha teszteli a visszatérési értéket ezzel a függvénnyel az alkalmazásban, minimális kódmennyiséggel megfelelően reagálhat a hibafeltételekre.

Megjegyzés:

Ez a függvény ugyanolyan hatással van a hibakeresési és a nem hibakeresési buildekre.

Example

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

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

Requirements

Fejléc: afx.h

AfxCheckMemory

Ez a függvény ellenőrzi az ingyenes memóriakészletet, és szükség szerint kinyomtatja a hibaüzeneteket.

BOOL AfxCheckMemory();

Visszaadott érték

Nonzero, ha nincs memóriahiba; egyéb esetben 0.

Megjegyzések

Ha a függvény nem észlel memóriasérülést, semmit sem nyomtat ki.

A rendszer ellenőrzi a halomon jelenleg lefoglalt memóriablokkokat, beleértve azokat is, amelyeket new az alapul szolgáló memóriaelosztók közvetlen hívásai, például a malloc függvény vagy a GlobalAlloc Windows függvény foglal le, de nem. Ha valamelyik blokk sérült, a rendszer egy üzenetet nyomtat a hibakereső kimenetére.

Ha belefoglalja a sort

#define new DEBUG_NEW

egy programmodulban, majd az azt követő hívásokat, hogy megjelenítse AfxCheckMemory a fájlnevet és a sorszámot, ahol a memóriát lefoglalták.

Megjegyzés:

Ha a modul egy vagy több szerializálható osztály implementációját tartalmazza, akkor az utolsó IMPLEMENT_SERIAL makróhívás után kell megadnia a #define sort.

Ez a függvény csak az MFC hibakeresési verziójában működik.

Example

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

Requirements

Fejléc: afx.h

AfxDump (MFC)

Hívja meg ezt a függvényt a hibakeresőben egy objektum állapotának hibakeresés közbeni memóriaképéhez.

void AfxDump(const CObject* pOb);

Paraméterek

Pob
Egy osztály objektumára mutató mutató, amely a forrásból CObjectszármazik.

Megjegyzések

AfxDump meghívja egy objektum tagfüggvényét Dump , és elküldi az információt a afxDump változó által megadott helyre. AfxDump csak az MFC hibakeresési verziójában érhető el.

A programkód nem hívhatja meg AfxDump, hanem a Dump megfelelő objektum tagfüggvényét kell meghívnia.

Requirements

Fejléc: afx.h

AfxDumpStack

Ez a globális függvény az aktuális verem képének létrehozására használható.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

Paraméterek

dwTarget
A memóriakép kimenetének célját jelzi. A bitenkénti VAGY (|) operátorral kombinálható lehetséges értékek a következők:

  • AFX_STACK_DUMP_TARGET_TRACE Kimenet küldése a TRACE makróval. A TRACE makró csak hibakeresési buildekben hoz létre kimenetet; a kiadási buildekben nem hoz létre kimenetet. A TRACE a hibakeresőn kívül más célokra is átirányítható.

  • AFX_STACK_DUMP_TARGET_DEFAULT A memóriakép kimenetét az alapértelmezett célnak küldi el. Hibakeresési build esetén a kimenet a TRACE makróra kerül. Egy kiadási buildben a kimenet a vágólapra kerül.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD Csak a vágólapra küld kimenetet. Az adatok egyszerű szövegként kerülnek a vágólapra a CF_TEXT Vágólap formátum használatával.

  • AFX_STACK_DUMP_TARGET_BOTH Egyszerre küldi el a kimenetet a vágólapra és a TRACE makróba.

  • AFX_STACK_DUMP_TARGET_ODS A kimenetet közvetlenül a hibakeresőnek küldi el a Win32 függvény OutputDebugString()használatával. Ez a beállítás hibakereső kimenetet hoz létre a hibakeresési és kiadási buildekben is, ha egy hibakereső csatlakozik a folyamathoz. AFX_STACK_DUMP_TARGET_ODS mindig eléri a hibakeresőt (ha csatlakoztatva van), és nem irányítható át.

Megjegyzések

Az alábbi példa egyetlen sornyi kimenetet tükröz, amely egy MFC-párbeszédpanel-alkalmazás gombkezelőjéből történő hívásból AfxDumpStack jön létre:

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

A fenti kimenet minden sora az utolsó függvényhívás címét, a függvényhívást tartalmazó modul teljes elérési útját és a függvény prototípusának nevét jelzi. Ha a függvény hívása a veremen nem a függvény pontos címén történik, a függvény bájtok eltolása jelenik meg.

A következő táblázat például a fenti kimenet első sorát írja le:

Kimenet Description
00427D55: Az utolsó függvényhívás visszatérési címe.
DUMP2\DEBUG\DUMP2.EXE! A függvényhívást tartalmazó modul teljes elérési útja.
void AfxDumpStack(unsigned long) A függvény prototípusa hívott.
+ 181 bytes Az eltolás bájtban a függvény prototípusának címétől (ebben az esetben void AfxDumpStack(unsigned long)) a visszatérési címig (ebben az esetben 00427D55).

AfxDumpStack az MFC-kódtárak hibakeresési és nem hibakeresési verzióiban érhető el; A függvény azonban mindig statikusan van csatolva, még akkor is, ha a végrehajtható fájl MFC-t használ egy megosztott DLL-ben. A megosztott kódtár-implementációkban a függvény az MFCS42-ben található. LIB-kódtár (és annak változatai).

A függvény sikeres használatához:

  • A IMAGEHLP.DLL fájlnak az elérési úton kell lennie. Ha nem rendelkezik ezzel a DLL-sel, a függvény hibaüzenetet jelenít meg. Az IMAGEHLP által biztosított függvénykészlettel kapcsolatos információkért tekintse meg a Kép súgótárat .

  • A veremen keretekkel rendelkező moduloknak hibakeresési információkat kell tartalmazniuk. Ha nem tartalmaznak hibakeresési információkat, a függvény továbbra is létrehoz egy veremkövetést, de a nyomkövetés kevésbé lesz részletes.

Requirements

Fejléc: afx.h

AfxEnableMemoryLeakDump

Engedélyezi és letiltja a memóriaszivárgási memóriaképet a AFX_DEBUG_STATE destruktorban.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

Paraméterek

bDump
[in] A TRUE azt jelzi, hogy a memóriaszivárgási memóriakép engedélyezve van; A HAMIS azt jelzi, hogy a memóriaszivárgási memóriakép le van tiltva.

Visszaadott érték

A jelölő előző értéke.

Megjegyzések

Amikor egy alkalmazás eltávolítja az MFC-kódtárat, az MFC-kódtár ellenőrzi a memóriavesztéseket. Ezen a ponton a rendszer a Visual Studio hibakeresési ablakán keresztül jelenti a felhasználónak a memóriavesztéseket.

Ha az alkalmazás egy másik tárat tölt be az MFC-kódtár előtt, a rendszer helytelenül számol be memóriavesztésként a tárban lévő memórialefoglalásokról. A hamis memóriavesztések miatt az alkalmazás lassan bezárulhat, amikor az MFC-kódtár jelenti őket. Ebben az esetben tiltsa AfxEnableMemoryLeakDump le a memóriaszivárgási memóriaképet.

Megjegyzés:

Ha ezzel a módszerrel kikapcsolja a memóriaszivárgási memóriaképet, akkor nem fog jelentést kapni az alkalmazásban érvényes memóriaszivárgásokról. Ezt a módszert csak akkor érdemes használni, ha biztos abban, hogy a memóriaszivárgási jelentés hamis memóriaszivárgást tartalmaz.

Requirements

Fejléc: afx.h

AfxEnableMemoryTracking

A diagnosztikai memóriakövetés általában engedélyezve van az MFC hibakeresési verziójában.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

Paraméterek

bTrack
Ha igaz értékre állítja ezt az értéket, bekapcsolja a memóriakövetést; A FALSE kikapcsolja.

Visszaadott érték

A nyomkövetés-engedélyező jelző előző beállítása.

Megjegyzések

Ezzel a függvénnyel letilthatja a kód azon szakaszainak nyomon követését, amelyekről tudja, hogy helyesen osztják ki a blokkokat.

További információ: AfxEnableMemoryTrackingMFC-alkalmazások hibakeresése.

Megjegyzés:

Ez a függvény csak az MFC hibakeresési verziójában működik.

Example

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

Requirements

Fejléc: afx.h

AfxIsMemoryBlock

Teszteli a memóriacímet, hogy az egy jelenleg aktív memóriablokkot jelöljön, amelyet a diagnosztikai verzió newfoglalt le.

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

Paraméterek

p
A tesztelni kívánt memóriablokkra mutat.

nBytes
A memóriablokk bájtban megadott hosszát tartalmazza.

plRequestNumber
Olyan egész számra long mutat, amely a memóriablokk foglalási sorszámával lesz kitöltve, vagy nullára, ha nem egy jelenleg aktív memóriablokkot jelöl.

Visszaadott érték

Nemzero, ha a memóriablokk jelenleg lefoglalva van, és a hossz helyes; egyéb esetben 0.

Megjegyzések

A megadott méretet az eredeti lefoglalt méretre is ellenőrzi. Ha a függvény nemzero értéket ad vissza, a foglalási sorszám a plRequestNumber függvényben lesz visszaadva. Ez a szám azt a sorrendet jelöli, amelyben a blokk le lett foglalva az összes többi new foglaláshoz képest.

Example

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

Requirements

Fejléc: afx.h

AfxIsValidAddress

Teszteli a memóriacímeket, hogy azok teljes mértékben a program memóriaterületén belül legyenek.

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

Paraméterek

Lp
A tesztelni kívánt memóriacímre mutat.

nBytes
A tesztelni kívánt memória bájtjainak számát tartalmazza.

bReadWrite
Meghatározza, hogy a memória írásra és olvasásra (IGAZ) vagy csak olvasásra (HAMIS) is használható-e.

Visszaadott érték

Hibakeresési buildek esetén nem, ha a megadott memóriablokk teljes egészében a program memóriaterületén belül található; egyéb esetben 0.

Nem hibakeresési buildekben a nonzero, ha az lp értéke nem NULL; egyéb esetben 0.

Megjegyzések

A cím nem korlátozódik az általa lefoglalt newblokkokra.

Example

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

Requirements

Fejléc: afx.h

AfxIsValidString

Ezzel a függvénnyel megállapíthatja, hogy egy sztringre mutató mutató érvényes-e.

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

Paraméterek

lpsz
A tesztelni kívánt mutató.

nLength
A tesztelni kívánt sztring hosszát adja meg bájtban. A -1 értéke azt jelzi, hogy a sztring null értékű lesz.

Visszaadott érték

Hibakeresési buildek esetén nem, ha a megadott mutató a megadott méretű sztringre mutat; egyéb esetben 0.

Nem hibakeresési buildekben a nonzero, ha az lpsz nem NULL; egyéb esetben 0.

Example

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

Requirements

Fejléc: afx.h

AfxSetAllocHook

Beállít egy horogot, amely lehetővé teszi a megadott függvény meghívását az egyes memóriablokkok lefoglalása előtt.

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

Paraméterek

pfnAllocHook
Megadja a meghívandó függvény nevét. Lásd a foglalási függvény prototípusára vonatkozó megjegyzéseket.

Visszaadott érték

Nonzero, ha engedélyezni szeretné a foglalást; egyéb esetben 0.

Megjegyzések

A Microsoft Foundation osztálykönyvtár hibakeresési memória-kiosztója meghívhat egy felhasználó által definiált horogfüggvényt, amely lehetővé teszi a felhasználó számára a memóriafoglalás monitorozását és annak szabályozását, hogy a lefoglalás engedélyezett-e. A kiosztási horogfüggvények prototípusa az alábbiak szerint történik:

BOOL AFXAPI AllocHook( size_tnSize, BOOLbObject, LONGlRequestNumber);

nSize
A javasolt memóriafoglalás mérete.

bObject
IGAZ, ha a foglalás - CObjectszármaztatott objektumhoz tartozik, ellenkező esetben HAMIS.

lRequestNumber
A memóriafoglalás sorszáma.

Vegye figyelembe, hogy az AFXAPI hívási konvenció azt jelenti, hogy a hívónak el kell távolítania a paramétereket a veremből.

Requirements

Fejléc: afx.h

AfxDoForAllClasses

Meghívja a megadott iterációs függvényt az alkalmazás memóriájában lévő összes szerializálható CObject-származtatott osztályhoz.

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

Paraméterek

Pfn
Az egyes osztályokhoz meghívandó iterációs függvényre mutat. A függvényargumentumok egy CRuntimeClass objektumra mutató mutató, a hívó által a függvénynek biztosított extra adatokra mutató üres mutató.

pContext
A hívó által az iterációs függvénynek szolgáltatható opcionális adatokra mutat. Ez a mutató null értékű lehet.

Megjegyzések

A szerializálható CObject-származtatott osztályok a DECLARE_SERIAL makró használatával származtatott osztályok. A AfxDoForAllClasses átadott mutató minden híváskor a megadott iterációs függvénynek lesz átadva.

Megjegyzés:

Ez a függvény csak az MFC hibakeresési verziójában működik.

Example

#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

Requirements

Fejléc: afx.h

AfxDoForAllObjects

Végrehajtja a megadott iterációs függvényt az összes olyan objektumhoz, amely a CObject következővel newlett lefoglalva: .

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

Paraméterek

Pfn
Az egyes objektumokhoz végrehajtandó iterációs függvényre mutat. A függvényargumentumok a hívó által a függvénynek biztosított extra adatokra mutató mutató CObject és üres mutató.

pContext
A hívó által az iterációs függvénynek szolgáltatható opcionális adatokra mutat. Ez a mutató null értékű lehet.

Megjegyzések

A verem, a globális vagy a beágyazott objektumok nincsenek számba adva. A AfxDoForAllObjects átadott mutató minden híváskor a megadott iterációs függvénynek lesz átadva.

Megjegyzés:

Ez a függvény csak az MFC hibakeresési verziójában működik.

Example

#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

Lásd még

Makrók és globálisak
CObject::D ump