Sdílet prostřednictvím


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 printfformá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'

Viz také

Makra
Globální funkce ladění a hlášení chyb