Makra ladění a hlášení chyb
Tato makra poskytují užitečné možnosti ladění a trasování.
Název | Popis |
---|---|
_ATL_DEBUG_INTERFACES | Zapíše do výstupního okna všechny nevracení rozhraní, které se zjistí při _Module.Term zavolání. |
_ATL_DEBUG_QI | Zapíše všechna volání do QueryInterface okna výstupu. |
ATLASSERT | Provádí stejné funkce jako makro _ASSERTE nalezené v knihovně runtime jazyka C. |
ATLENSURE | Provede ověření parametrů. Volání AtlThrow v případě potřeby |
ATLTRACENOTIMPL | Odešle zprávu do zařízení s výpisem paměti, že zadaná funkce není implementována. |
ATLTRACE | Hlásí upozornění na výstupní zařízení, jako je například okno ladicího programu, podle označených příznaků a úrovní. Součástí je zpětná kompatibilita. |
ATLTRACE2 | Hlásí upozornění na výstupní zařízení, jako je například okno ladicího programu, podle označených příznaků a úrovní. |
_ATL_DEBUG_INTERFACES
Definujte toto makro před zahrnutím všech souborů hlaviček ATL, abyste mohli trasovat všechna AddRef
rozhraní komponent a Release
volat je do okna výstupu.
#define _ATL_DEBUG_INTERFACES
Poznámky
Výstup trasování se zobrazí, jak je znázorněno níže:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
První část každého trasování bude vždy ATL: QIThunk
. Dále je hodnota identifikující konkrétní použitý blok pro rozhraní. Thunk rozhraní je objekt, který slouží k udržování referenčního počtu a poskytnutí možnosti trasování použité zde. Při každém volání QueryInterface
s výjimkou požadavků na IUnknown
rozhraní se vytvoří nový blok rozhraní (v tomto případě se vrátí stejný blok dat pokaždé, když bude v souladu s pravidly identity modelu COM).
Dále uvidíte AddRef
nebo Release
označíte, která metoda byla volána. Za tímto účelem uvidíte hodnotu identifikující objekt, jehož počet odkazů rozhraní byl změněn. Hodnota je this
ukazatel objektu.
Počet odkazů, který je trasován, je počet odkazů na daný blok po AddRef
nebo Release
byl volán. Všimněte si, že tento počet odkazů nemusí odpovídat počtu odkazů pro objekt. Každý thunk udržuje svůj vlastní referenční počet, který vám pomůže plně dodržovat pravidla pro počítání odkazů modelu COM.
Poslední informace trasované jsou název objektu a rozhraní ovlivněné voláním AddRef
nebo Release
voláním.
Jakékoli nevracení rozhraní, které se zjistí při vypnutí serveru a _Module.Term
je voláno, se zaprotokoluje takto:
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
Zde uvedené informace se mapují přímo na informace uvedené v předchozích příkazech trasování, takže můžete prozkoumat počty odkazů po celou dobu životnosti thúčet rozhraní. Kromě toho získáte indikaci maximálního počtu odkazů na tento útržek rozhraní.
Poznámka:
_ATL_DEBUG_INTERFACES lze použít v maloobchodních buildech.
_ATL_DEBUG_QI
Zapíše všechna volání do QueryInterface
okna výstupu.
#define _ATL_DEBUG_QI
Poznámky
Pokud volání QueryInterface
selhalo, zobrazí se okno výstupu:
název rozhraní - failed
ATLASSERT
Makro ATLASSERT provádí stejné funkce jako _ASSERTE makro nalezené v knihovně runtime jazyka C.
ATLASSERT(booleanExpression);
Parametry
booleanExpression
Výraz (včetně ukazatelů), který se vyhodnotí jako nenulový nebo 0
Poznámky
V sestaveních ladění vyhodnotí ATLASSERT logoleanExpression a vygeneruje ladicí sestavu, pokud je výsledek false.
Požadavky
Hlavička: atldef.h
ATLENSURE
Toto makro slouží k ověření parametrů předaných funkci.
ATLENSURE(booleanExpression);
ATLENSURE_THROW(booleanExpression, hr);
Parametry
booleanExpression
Určuje logický výraz, který se má testovat.
Hr
Určuje kód chyby, který se má vrátit.
Poznámky
Tato makra poskytují mechanismus pro detekci a upozorňovat uživatele na nesprávné použití parametrů.
Makro volá ATLASSERT a pokud podmínka selže volání AtlThrow
.
V případě ATLENSURE se AtlThrow
volá s E_FAIL.
V ATLENSURE_THROW případě AtlThrow
je volána se zadaným HRESULT.
Rozdíl mezi ATLENSURE a ATLASSERT spočívá v tom, že ATLENSURE vyvolá výjimku v buildech vydaných verzí i v buildech Debug.
Příklad
void MyImportantFunction(char* psz)
{
ATLENSURE(NULL != psz);
char mysz[64];
strcpy_s(mysz, sizeof(mysz), psz);
}
Požadavky
Hlavička: afx.h
ATLTRACENOTIMPL
V ladění sestavení ATL odešle řetězec " funcname není implementován" do zařízení s výpisem paměti a vrátí E_NOTIMPL.
ATLTRACENOTIMPL(funcname);
Parametry
funcname
[v] Řetězec obsahující název funkce, která není implementována.
Poznámky
V buildech vydaných verzí jednoduše vrátí E_NOTIMPL.
Příklad
ATLTRACENOTIMPL(_T("IOleControl::GetControlInfo"));
Požadavky
Hlavička: atltrace.h
ATLTRACE
Hlásí upozornění na výstupní zařízení, jako je například okno ladicího programu, podle označených příznaků a úrovní. Součástí je zpětná kompatibilita.
ATLTRACE(exp);
ATLTRACE(
DWORD category,
UINT level,
LPCSTR lpszFormat, ...);
Parametry
Exp
[v] Řetězec a proměnné, které se mají odeslat do okna výstupu nebo do jakékoli aplikace, která tyto zprávy schytí.
kategorie
[v] Typ události nebo metody, pro kterou se má hlásit. Seznam kategorií najdete v poznámkách.
úroveň
[v] Úroveň trasování pro sestavu. Podrobnosti najdete v poznámkách.
lpszFormat
[v] Formátovaný řetězec, který se má odeslat do zařízení s výpisem paměti.
Poznámky
Popis ATLTRACE najdete v ATLTRACE2 . ATLTRACE a ATLTRACE2 mají stejné chování, ATLTRACE je součástí zpětné kompatibility.
ATLTRACE2
Hlásí upozornění na výstupní zařízení, jako je například okno ladicího programu, podle označených příznaků a úrovní.
ATLTRACE2(exp);
ATLTRACE2(
DWORD category,
UINT level,
LPCSTR lpszFormat, ...);
Parametry
Exp
[v] Řetězec pro odeslání do výstupního okna nebo jakékoli aplikace, která tyto zprávy schytí.
kategorie
[v] Typ události nebo metody, pro kterou se má hlásit. Seznam kategorií najdete v poznámkách.
úroveň
[v] Úroveň trasování pro sestavu. Podrobnosti najdete v poznámkách.
lpszFormat
[v] Řetězec printf
formátu -style, který se použije k vytvoření řetězce pro odeslání do zařízení s výpisem paměti.
Poznámky
Krátká forma ATLTRACE2 zapíše řetězec do výstupního okna ladicího programu. Druhá forma ATLTRACE2 také zapisuje výstup do výstupního okna ladicího programu, ale podléhá nastavení nástroje ATL/MFC Trace Tool (viz ukázka ATLTraceTool). Pokud například nastavíte úroveň 4 a atl/MFC Trace Tool na úroveň 0, nezobrazí se zpráva. úroveň může být 0, 1, 2, 3 nebo 4. Výchozí hodnota 0 hlásí pouze ty nejvýraznější problémy.
Parametr kategorie obsahuje seznam příznaků trasování, které chcete nastavit. Tyto příznaky odpovídají typům metod, pro které chcete hlásit. Následující tabulky uvádějí platné příznaky trasování, které můžete použít pro parametr kategorie .
Příznaky trasování ATL
Kategorie ATL | Popis |
---|---|
atlTraceGeneral |
Sestavy pro všechny aplikace ATL Výchozí nastavení |
atlTraceCOM |
Sestavy metod MODELU COM. |
atlTraceQI |
Sestavy volání QueryInterface |
atlTraceRegistrar |
Zaznamenává registraci objektů. |
atlTraceRefcount |
Sestavy o změně počtu odkazů |
atlTraceWindowing |
Sestavy metod systému Windows; Například hlásí neplatné ID mapy zpráv. |
atlTraceControls |
Zprávy o ovládacích prvcích; Například sestavy, když je ovládací prvek nebo jeho okno zničeno. |
atlTraceHosting |
Zprávy hostující zprávy; Například sestavy při aktivaci klienta v kontejneru. |
atlTraceDBClient |
Sestavy o šabloně příjemce OLE DB; Například když volání GetData selže, výstup může obsahovat HRESULT. |
atlTraceDBProvider |
Sestavy o šabloně zprostředkovatele OLE DB; Například sestavy, pokud vytvoření sloupce selhalo. |
atlTraceSnapin |
Sestavy pro aplikaci SNAPIn konzoly MMC. |
atlTraceNotImpl |
Zaznamenává, že uvedená funkce není implementována. |
atlTraceAllocation |
Zaznamenává zprávy vytištěné nástroji pro ladění paměti v atldbgmem.h. |
Příznaky trasování MFC
MFC – kategorie | Popis |
---|---|
traceAppMsg |
Obecné účely, zprávy MFC. Vždy se doporučuje. |
traceDumpContext |
Zprávy z CDumpContext. |
traceWinMsg |
Zprávy z kódu zpracování zpráv mfc. |
traceMemory |
Zprávy z kódu pro správu paměti MFC |
traceCmdRouting |
Zprávy z kódu směrování příkazů prostředí MFC systému Windows |
traceHtml |
Zprávy z dialogového okna DHTML knihovny MFC podporují. |
traceSocket |
Zprávy z podpory soketu MFC |
traceOle |
Zprávy z podpory OLE knihovny MFC |
traceDatabase |
Zprávy z podpory databáze MFC |
traceInternet |
Zprávy z internetové podpory mfc. |
Pokud chcete deklarovat vlastní kategorii trasování, deklarujte globální instanci CTraceCategory
třídy následujícím způsobem:
CTraceCategory MY_CATEGORY(_T("MyCategoryName"), 1);
Název kategorie, MY_CATEGORY v tomto příkladu, je název, který zadáte parametru kategorie . Prvním parametrem je název kategorie, který se zobrazí v nástroji trasování ATL/MFC. Druhým parametrem je výchozí úroveň trasování. Tento parametr je volitelný a výchozí úroveň trasování je 0.
Použití uživatelem definované kategorie:
ATLTRACE2(MY_CATEGORY, 2, _T("a message in a custom category"));
Chcete-li určit, že chcete filtrovat trasovací zprávy, vložte definice těchto maker do Stdafx.h před #include <atlbase.h>
příkaz.
Případně můžete nastavit filtr v direktivách preprocesoru v dialogovém okně Stránky vlastností. Klikněte na kartu Preprocesor a vložte globální do textového pole Definice preprocesoru.
Atlbase.h obsahuje výchozí definice maker ATLTRACE2 a tyto definice se použijí, pokud tyto symboly před zpracováním atlbase.h nedefinujete.
V buildech vydaných verzí ATLTRACE2 kompilace do (void) 0
.
ATLTRACE2 omezuje obsah řetězce, který se má po formátování odeslat do zařízení s výpisem paměti na maximálně 1023 znaků.
ATLTRACE a ATLTRACE2 mají stejné chování, ATLTRACE je součástí zpětné kompatibility.
Příklad
int i = 1;
ATLTRACE2(atlTraceGeneral, 4, "Integer = %d\n", i);
// Output: 'Integer = 1'