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.
kategoria
[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.
kategoria
[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 printf
formatu -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'