Udostępnij za pośrednictwem


Makra debugowania i raportowania błędów

Te makra udostępniają przydatne funkcje debugowania i śledzenia.

Nazwa/nazwisko opis
_ATL_DEBUG_INTERFACES Zapisuje w oknie danych wyjściowych wszelkie przecieki interfejsu, które są wykrywane po _Module.Term wywołaniu.
_ATL_DEBUG_QI Zapisuje wszystkie wywołania do QueryInterface okna danych wyjściowych.
ATLASSERT Wykonuje te same funkcje co makro _ASSERTE znalezione w bibliotece środowiska uruchomieniowego języka C.
ATLENSURE Przeprowadza walidację parametrów. W razie potrzeby zadzwoń AtlThrow
ATLTRACENOTIMPL Wysyła komunikat do urządzenia zrzutu, że określona funkcja nie jest zaimplementowana.
ATLTRACE Zgłasza ostrzeżenia do urządzenia wyjściowego, takiego jak okno debugera, zgodnie ze wskazanymi flagami i poziomami. Uwzględnione w celu zapewnienia zgodności z poprzednimi wersjami.
ATLTRACE2 Zgłasza ostrzeżenia do urządzenia wyjściowego, takiego jak okno debugera, zgodnie ze wskazanymi flagami i poziomami.

_ATL_DEBUG_INTERFACES

Zdefiniuj to makro przed dołączeniem wszystkich plików nagłówków ATL do śledzenia wszystkich AddRef i Release wywołań interfejsów składników do okna danych wyjściowych.

#define _ATL_DEBUG_INTERFACES

Uwagi

Dane wyjściowe śledzenia zostaną wyświetlone, jak pokazano poniżej:

ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug

Pierwszą częścią każdego śledzenia będzie zawsze ATL: QIThunk. Następnie jest wartością identyfikującą używany interfejs thunk . Interfejs thunk jest obiektem używanym do utrzymania liczby odwołań i zapewnienia możliwości śledzenia używanych tutaj. Nowy interfejs thunk jest tworzony na każdym wywołaniu QueryInterface z wyjątkiem żądań interfejsu IUnknown (w tym przypadku ten sam thunk jest zwracany za każdym razem, aby zachować zgodność z regułami tożsamości MODELU COM).

Następnie zobaczysz AddRef lub Release wskazasz, która metoda została wywołana. Następnie zobaczysz wartość identyfikującą obiekt, którego liczba odwołań interfejsu została zmieniona. Śledzona wartość jest wskaźnikiem this obiektu.

Liczba odwołań, która jest śledzona, to liczba odwołań dla tego thunk po AddRef wywołaniu lub Release została wywołana. Należy pamiętać, że ta liczba odwołań może nie być zgodna z liczbą odwołań dla obiektu. Każdy thunk utrzymuje własną liczbę odwołań, aby pomóc w pełni przestrzegać reguł zliczania odwołań COM.

Ostatni element śledzenia informacji jest nazwą obiektu i interfejsem, którego dotyczy AddRef wywołanie lub Release .

Wszelkie przecieki interfejsu, które są wykrywane po zamknięciu serwera i _Module.Term jest wywoływany, zostaną zarejestrowane w następujący sposób:

ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug

Informacje podane tutaj mapuje bezpośrednio na informacje podane w poprzednich instrukcjach śledzenia, dzięki czemu można sprawdzić liczbę odwołań przez cały okres istnienia interfejsu thunk. Ponadto uzyskasz wskazanie maksymalnej liczby odwołań dla tego interfejsu thunk.

Uwaga

_ATL_DEBUG_INTERFACES można używać w kompilacjach detalicznych.

_ATL_DEBUG_QI

Zapisuje wszystkie wywołania do QueryInterface okna danych wyjściowych.

#define _ATL_DEBUG_QI

Uwagi

Jeśli wywołanie nie QueryInterface powiedzie się, zostanie wyświetlone okno danych wyjściowych:

nazwa interfejsu - failed

ATLASSERT

Makro ATLASSERT wykonuje te same funkcje co makro _ASSERTE znalezione w bibliotece środowiska uruchomieniowego języka C.

ATLASSERT(booleanExpression);

Parametry

wartość logicznaExpression
Wyrażenie (w tym wskaźniki), które daje wyliczenie wartości nonzero lub 0.

Uwagi

W kompilacjach debugowania usługa ATLASSERT ocenia wartość logicznąExpression i generuje raport debugowania, gdy wynik jest fałszywy.

Wymagania

Nagłówek: atldef.h

ATLENSURE

To makro służy do sprawdzania poprawności parametrów przekazywanych do funkcji.

ATLENSURE(booleanExpression);
ATLENSURE_THROW(booleanExpression, hr);

Parametry

wartość logicznaExpression
Określa wyrażenie logiczne do przetestowania.

Hr
Określa kod błędu do zwrócenia.

Uwagi

Te makra udostępniają mechanizm wykrywania i powiadamiania użytkownika o nieprawidłowym użyciu parametrów.

Makro wywołuje usługę ATLASSERT i jeśli warunek zakończy się niepowodzeniem, wywoła metodę AtlThrow.

W przypadku AtlThrow ATLENSURE jest wywoływana z E_FAIL.

W przypadku ATLENSURE_THROW AtlThrow jest wywoływana z określonym HRESULT.

Różnica między ATLENSURE i ATLASSERT polega na tym, że usługa ATLENSURE zgłasza wyjątek w kompilacjach wydania, a także w kompilacjach debugowania.

Przykład

void MyImportantFunction(char* psz)
{
   ATLENSURE(NULL != psz);

   char mysz[64];
   strcpy_s(mysz, sizeof(mysz), psz);
}

Wymagania

Nagłówek: afx.h

ATLTRACENOTIMPL

W kompilacjach debugowania atl wysyła ciąg " funcname is not implement" do urządzenia zrzutu i zwraca E_NOTIMPL.

ATLTRACENOTIMPL(funcname);

Parametry

funcname
[in] Ciąg zawierający nazwę funkcji, która nie jest zaimplementowana.

Uwagi

W kompilacjach wersji po prostu zwraca E_NOTIMPL.

Przykład

ATLTRACENOTIMPL(_T("IOleControl::GetControlInfo"));   

Wymagania

Nagłówek: atltrace.h

ATLTRACE

Zgłasza ostrzeżenia do urządzenia wyjściowego, takiego jak okno debugera, zgodnie ze wskazanymi flagami i poziomami. Uwzględnione w celu zapewnienia zgodności z poprzednimi wersjami.

ATLTRACE(exp);

ATLTRACE(
    DWORD category,
    UINT  level,
    LPCSTR lpszFormat, ...);

Parametry

Exp
[in] Ciąg i zmienne do wysłania do okna danych wyjściowych lub dowolnej aplikacji, która wychwyci te komunikaty.

Kategorii
[in] Typ zdarzenia lub metody, na której ma być raport. Zobacz uwagi, aby zapoznać się z listą kategorii.

Poziom
[in] Poziom śledzenia do raportu. Zobacz uwagi, aby uzyskać szczegółowe informacje.

lpszFormat
[in] Sformatowany ciąg do wysłania do urządzenia zrzutu.

Uwagi

Aby uzyskać opis ATLTRACE, zobacz ATLTRACE2 . ATLTRACE i ATLTRACE2 mają takie samo zachowanie, usługa ATLTRACE jest uwzględniona w celu zapewnienia zgodności z poprzednimi wersjami.

ATLTRACE2

Zgłasza ostrzeżenia do urządzenia wyjściowego, takiego jak okno debugera, zgodnie ze wskazanymi flagami i poziomami.

ATLTRACE2(exp);

ATLTRACE2(
    DWORD category,
    UINT level,
    LPCSTR lpszFormat,  ...);

Parametry

Exp
[in] Ciąg do wysłania do okna danych wyjściowych lub dowolnej aplikacji, która wychwyci te komunikaty.

Kategorii
[in] Typ zdarzenia lub metody, na której ma być raport. Zobacz uwagi, aby zapoznać się z listą kategorii.

Poziom
[in] Poziom śledzenia do raportu. Zobacz uwagi, aby uzyskać szczegółowe informacje.

lpszFormat
[in] Ciąg printfformatu -style używany do utworzenia ciągu do wysłania do urządzenia zrzutu.

Uwagi

Krótka forma ATLTRACE2 zapisuje ciąg w oknie danych wyjściowych debugera. Druga forma ATLTRACE2 również zapisuje dane wyjściowe w oknie danych wyjściowych debugera, ale podlega ustawieniom narzędzia śledzenia ATL/MFC (zobacz przykład ATLTraceTool). Jeśli na przykład ustawisz poziom 4, a narzędzie śledzenia ATL/MFC na poziom 0, komunikat nie będzie widoczny. poziom może być 0, 1, 2, 3 lub 4. Wartość domyślna 0 zgłasza tylko najpoważniejsze problemy.

Parametr category wyświetla flagi śledzenia do ustawienia. Te flagi odpowiadają typom metod, dla których chcesz zgłosić. W poniższych tabelach wymieniono prawidłowe flagi śledzenia, których można użyć dla parametru kategorii .

Flagi śledzenia ATL

Kategoria ATL opis
atlTraceGeneral Raporty dotyczące wszystkich aplikacji ATL. Domyślnie.
atlTraceCOM Raporty dotyczące metod COM.
atlTraceQI Raporty dotyczące wywołań QueryInterface.
atlTraceRegistrar Raporty dotyczące rejestracji obiektów.
atlTraceRefcount Raporty dotyczące zmiany liczby odwołań.
atlTraceWindowing Raporty dotyczące metod systemu Windows; na przykład raportuje nieprawidłowy identyfikator mapy komunikatów.
atlTraceControls Raporty dotyczące kontrolek; na przykład raporty, gdy kontrolka lub jego okno zostanie zniszczone.
atlTraceHosting Raporty hostowania wiadomości; na przykład raporty, gdy klient w kontenerze jest aktywowany.
atlTraceDBClient Raporty dotyczące szablonu użytkownika OLE DB; na przykład gdy wywołanie metody GetData zakończy się niepowodzeniem, dane wyjściowe mogą zawierać wartość HRESULT.
atlTraceDBProvider Raporty dotyczące szablonu dostawcy OLE DB; na przykład raporty, jeśli tworzenie kolumny nie powiodło się.
atlTraceSnapin Raporty dotyczące aplikacji MMC SnapIn.
atlTraceNotImpl Zgłasza, że wskazana funkcja nie jest zaimplementowana.
atlTraceAllocation Raporty komunikaty drukowane przez narzędzia debugowania pamięci w atldbgmem.h.

Flagi śledzenia MFC

Kategoria MFC opis
traceAppMsg Ogólnego przeznaczenia, komunikaty MFC. Zawsze zalecane.
traceDumpContext Komunikaty z CDumpContext.
traceWinMsg Komunikaty z kodu obsługi komunikatów MFC.
traceMemory Komunikaty z kodu zarządzania pamięcią MFC.
traceCmdRouting Komunikaty z kodu routingu poleceń systemu Windows MFC.
traceHtml Obsługa komunikatów z okna dialogowego DHTML MFC.
traceSocket Komunikaty z obsługi gniazd MFC.
traceOle Komunikaty z obsługi OLE MFC.
traceDatabase Komunikaty z obsługi bazy danych MFC.
traceInternet Wiadomości z pomocy technicznej internetowej MFC.

Aby zadeklarować niestandardową kategorię śledzenia, zadeklaruj wystąpienie CTraceCategory globalne klasy w następujący sposób:

CTraceCategory MY_CATEGORY(_T("MyCategoryName"), 1);

Nazwa kategorii, MY_CATEGORY w tym przykładzie, to nazwa określona dla parametru kategorii . Pierwszy parametr to nazwa kategorii, która będzie wyświetlana w narzędziu śledzenia ATL/MFC. Drugi parametr jest domyślnym poziomem śledzenia. Ten parametr jest opcjonalny, a domyślny poziom śledzenia to 0.

Aby użyć kategorii zdefiniowanej przez użytkownika:

ATLTRACE2(MY_CATEGORY, 2, _T("a message in a custom category"));

Aby określić, że chcesz filtrować komunikaty śledzenia, przed instrukcją #include <atlbase.h> wstaw definicje tych makr do pliku Stdafx.h.

Alternatywnie można ustawić filtr w dyrektywach preprocesora w oknie dialogowym Strony właściwości. Kliknij kartę Preprocesor , a następnie wstaw globalny do pola edycji Definicje preprocesora.

Plik Atlbase.h zawiera domyślne definicje makr ATLTRACE2, a te definicje będą używane, jeśli te symbole nie zostaną zdefiniowane przed przetworzeniem pliku atlbase.h.

W kompilacjach wydań ATLTRACE2 kompiluje się na .(void) 0

ATLTRACE2 ogranicza zawartość ciągu do wysłania do urządzenia zrzutu do nie więcej niż 1023 znaków po sformatowaniu.

ATLTRACE i ATLTRACE2 mają takie samo zachowanie, usługa ATLTRACE jest uwzględniona w celu zapewnienia zgodności z poprzednimi wersjami.

Przykład

int i = 1;
ATLTRACE2(atlTraceGeneral, 4, "Integer = %d\n", i);
// Output: 'Integer = 1'

Zobacz też

Makra
Funkcje globalne debugowania i raportowania błędów