Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
allocMemDFBekapcsolja a hibakeresési kiosztót (alapértelmezett beállítás a Hibakeresési kódtárban).delayFreeMemDFKé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.checkAlwaysMemDFMinden alkalommal meghívjaAfxCheckMemorya 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