Śledzenie i instrumentowanie aplikacji

Śledzenie służy do monitorowania wykonywania aplikacji w trakcie jej działania. Instrumentację śledzenia i debugowania można dodać do aplikacji .NET Framework podczas jej opracowywania, a instrumentację można użyć zarówno podczas opracowywania aplikacji, jak i po jej wdrożeniu. Klasy , System.Diagnostics.Debugi System.Diagnostics.TraceSource umożliwiają System.Diagnostics.Tracerejestrowanie informacji o błędach i wykonywaniu aplikacji w dziennikach, plikach tekstowych lub innych urządzeniach do późniejszej analizy.

Termin instrumentacja odnosi się do możliwości monitorowania lub mierzenia poziomu wydajności produktu oraz diagnozowania błędów. W programowaniu oznacza to możliwość uwzględnienia aplikacji:

  • Śledzenie kodu — odbieranie komunikatów informacyjnych dotyczących wykonywania aplikacji w czasie wykonywania.

  • Debugowanie — śledzenie i naprawianie błędów programowania w aplikacji opracowywanej. Aby uzyskać więcej informacji, zobacz Debugowanie.

  • Liczniki wydajności — składniki, które umożliwiają śledzenie wydajności aplikacji. Aby uzyskać więcej informacji, zobacz Liczniki wydajności.

  • Dzienniki zdarzeń — składniki, które umożliwiają odbieranie i śledzenie głównych zdarzeń podczas wykonywania aplikacji. Aby uzyskać więcej informacji, zobacz klasę EventLog .

Instrumentacja aplikacji przez umieszczenie instrukcji śledzenia w strategicznych lokalizacjach w kodzie jest szczególnie przydatna w przypadku aplikacji rozproszonych. Korzystając z instrukcji śledzenia, można instrumentować aplikację nie tylko do wyświetlania informacji, gdy coś pójdzie nie tak, ale także monitorować, jak dobrze działa aplikacja.

Klasa TraceSource udostępnia ulepszone funkcje śledzenia i może być używana zamiast statycznych metod starszych Trace i Debug klas śledzenia. Znane i Debug klasy Trace są nadal powszechnie używane, ale klasa jest zalecana TraceSource w przypadku nowych poleceń śledzenia, takich jak TraceEvent i TraceData.

Klasy Trace i Debug są identyczne, z tą różnicą, że procedury i funkcje Trace klasy są domyślnie kompilowane w kompilacjach wydania, ale te z Debug klasy nie są.

Klasy Trace i Debug zapewniają środki do monitorowania i badania wydajności aplikacji podczas programowania lub po wdrożeniu. Na przykład można użyć Trace klasy do śledzenia określonych typów akcji w wdrożonej aplikacji w miarę ich występowania (na przykład tworzenia nowych połączeń bazy danych) i w związku z tym może monitorować wydajność aplikacji.

Śledzenie kodu i debugowanie

Podczas programowania można użyć metod wyjściowych Debug klasy do wyświetlania komunikatów w oknie Dane wyjściowe zintegrowanego środowiska projektowego (IDE) programu Visual Studio. Na przykład:

Trace.WriteLine("Hello World!")  
Debug.WriteLine("Hello World!")  
System.Diagnostics.Trace.WriteLine("Hello World!");  
System.Diagnostics.Debug.WriteLine("Hello World!");  

W każdym z tych przykładów zostanie wyświetlony komunikat "Hello World!" w oknie Dane wyjściowe po uruchomieniu aplikacji w debugerze.

Umożliwia to debugowanie aplikacji i optymalizowanie ich wydajności na podstawie ich zachowania w środowisku testowym. Możesz debugować aplikację w kompilacji debugowania z włączonym atrybutem Debug warunkowym, aby otrzymywać wszystkie dane wyjściowe debugowania. Gdy aplikacja jest gotowa do wydania, możesz skompilować kompilację wydania bez włączania atrybutu Debug warunkowego, aby kompilator nie zawierał kodu debugowania w ostatnim pliku wykonywalnym. Aby uzyskać więcej informacji, zobacz How to: Compile Conditionally with Trace and Debug (Instrukcje: kompilowanie warunkowe za pomocą śledzenia i debugowania). Aby uzyskać więcej informacji na temat różnych konfiguracji kompilacji dla aplikacji, zobacz Kompilowanie i kompilowanie.

Możesz również śledzić wykonywanie kodu w zainstalowanej aplikacji przy użyciu metod Trace klasy . Umieszczając przełączniki śledzenia w kodzie, możesz kontrolować, czy śledzenie występuje i jak obszerne jest. Umożliwia to monitorowanie stanu aplikacji w środowisku produkcyjnym. Jest to szczególnie ważne w aplikacji biznesowej, która używa wielu składników uruchomionych na wielu komputerach. Możesz kontrolować sposób użycia przełączników po wdrożeniu za pośrednictwem pliku konfiguracji. Aby uzyskać więcej informacji, zobacz How to: Create, Initialize and Configure Trace Switchs (Instrukcje: tworzenie, inicjowanie i konfigurowanie przełączników śledzenia).

Podczas tworzenia aplikacji, dla której zamierzasz używać śledzenia, zwykle dołączasz komunikaty śledzenia i debugowania w kodzie aplikacji. Gdy wszystko będzie gotowe do wdrożenia aplikacji, możesz skompilować kompilację wydania bez włączania atrybutu warunkowego Debugowanie . Można jednak włączyć atrybut warunkowy Śledzenie , aby kompilator zawierał kod śledzenia w pliku wykonywalny. Aby uzyskać więcej informacji, zobacz How to: Compile Conditionally with Trace and Debug (Instrukcje: kompilowanie warunkowe za pomocą śledzenia i debugowania).

Fazy śledzenia kodu

Istnieją trzy fazy śledzenia kodu:

  1. Instrumentacja — dodajesz kod śledzenia do aplikacji.

  2. Śledzenie — kod śledzenia zapisuje informacje w określonym obiekcie docelowym.

  3. Analiza — oceniasz informacje śledzenia, aby identyfikować i interpretować problemy w aplikacji.

Podczas programowania wszystkie metody danych wyjściowych debugowania i śledzenia domyślnie zapisują informacje w oknie Dane wyjściowe w programie Visual Studio. W wdrożonej aplikacji metody zapisują informacje o śledzeniu do określonych miejsc docelowych. Aby uzyskać więcej informacji na temat określania docelowego elementu docelowego danych wyjściowych do śledzenia lub debugowania, zobacz Odbiorniki śledzenia.

Poniżej przedstawiono ogólny widok głównych kroków związanych z używaniem śledzenia do analizowania i rozwiązywania potencjalnych problemów w wdrożonych aplikacjach. Aby uzyskać więcej informacji na temat wykonywania tych kroków, zobacz odpowiedni link.

Aby używać śledzenia w aplikacji
  1. Rozważ, które dane wyjściowe śledzenia mają być odbierane w lokacji po wdrożeniu aplikacji.

  2. Utwórz zestaw przełączników. Aby uzyskać więcej informacji, zobacz Jak skonfigurować przełączniki śledzenia.

  3. Dodaj instrukcje śledzenia do kodu aplikacji.

  4. Określ, gdzie mają być wyświetlane dane wyjściowe śledzenia, i dodaj odpowiednie odbiorniki. Aby uzyskać więcej informacji, zobacz Tworzenie i inicjowanie odbiorników śledzenia.

  5. Przetestuj i debuguj aplikację oraz kod śledzenia, który zawiera.

  6. Skompiluj aplikację do kodu wykonywalnego przy użyciu jednej z następujących procedur:

    • Użyj menu Kompilacja wraz ze stroną Debugowanie okna dialogowego Strony właściwości w Eksplorator rozwiązań. Użyj tej funkcji podczas kompilowania w programie Visual Studio.

      - lub -

    • Użyj dyrektyw kompilatora Trace and Debug dla metody wiersza polecenia kompilowania. Aby uzyskać więcej informacji, zobacz Kompilowanie warunkowe za pomocą funkcji śledzenia i debugowania. Użyj tej opcji podczas kompilowania z wiersza polecenia.

  7. Jeśli podczas wykonywania wystąpi problem, włącz odpowiedni przełącznik śledzenia. Aby uzyskać więcej informacji, zobacz Konfigurowanie przełączników śledzenia.

    Kod śledzenia zapisuje komunikaty śledzenia do określonego miejsca docelowego, na przykład ekranu, pliku tekstowego lub dziennika zdarzeń. Typ odbiornika uwzględnionego Trace.Listeners w kolekcji określa element docelowy.

  8. Przeanalizuj komunikaty śledzenia, aby zidentyfikować i zrozumieć problem w aplikacji.

Instrumentacja śledzenia i aplikacje rozproszone

Podczas tworzenia aplikacji rozproszonej może być trudno przetestować aplikację w sposób, w jaki będzie ona używana. Niewiele zespołów programistycznych ma możliwość testowania wszystkich możliwych kombinacji systemów operacyjnych lub przeglądarek sieci Web (w tym wszystkich zlokalizowanych opcji językowych) lub symulowania dużej liczby użytkowników, którzy będą uzyskiwać dostęp do aplikacji w tym samym czasie. W takich okolicznościach nie można przetestować sposobu, w jaki aplikacja rozproszona będzie reagować na duże woluminy, różne konfiguracje i unikatowe zachowania użytkowników końcowych. Ponadto wiele części aplikacji rozproszonej nie ma interfejsu użytkownika, za pomocą którego można bezpośrednio wchodzić w interakcje lub wyświetlać działanie tych części.

Można jednak zrekompensować tę odpowiedź, umożliwiając aplikacjom rozproszonym opisywanie niektórych interesujących zdarzeń administratorom systemu, zwłaszcza takich, które poszły źle, instrumentując aplikację — czyli umieszczając instrukcje śledzenia w strategicznych lokalizacjach w kodzie. Następnie, jeśli coś nieoczekiwanego wystąpi w czasie wykonywania (na przykład zbyt wolny czas odpowiedzi), możesz określić prawdopodobną przyczynę.

Dzięki instrukcjom śledzenia można uniknąć trudnego zadania badania oryginalnego kodu źródłowego, modyfikowania go, ponownego kompilowania i próby wygenerowania błędu czasu wykonywania w środowisku debugowania. Pamiętaj, że możesz instrumentować aplikację nie tylko do wyświetlania błędów, ale także do monitorowania wydajności.

Strategiczne umieszczanie instrukcji śledzenia

Należy zachować szczególną ostrożność podczas umieszczania instrukcji śledzenia do użycia w czasie wykonywania. Należy wziąć pod uwagę, jakie informacje śledzenia mogą być potrzebne w wdrożonej aplikacji, aby wszystkie prawdopodobne scenariusze śledzenia zostały odpowiednio omówione. Ponieważ aplikacje korzystające ze śledzenia różnią się znacznie, nie ma jednak ogólnych wytycznych dotyczących strategicznego umieszczania śledzenia. Aby uzyskać więcej informacji na temat umieszczania instrukcji śledzenia, zobacz Instrukcje: Dodawanie instrukcji śledzenia do kodu aplikacji.

Dane wyjściowe z śledzenia

Dane wyjściowe śledzenia są zbierane przez obiekty nazywane odbiornikami. Odbiornik to obiekt, który odbiera dane wyjściowe śledzenia i zapisuje je na urządzeniu wyjściowym (zazwyczaj w oknie, dzienniku lub pliku tekstowym). Po utworzeniu odbiornika śledzenia jest on zwykle dodawany do Trace.Listeners kolekcji, co umożliwia odbiornikowi odbieranie wszystkich danych wyjściowych śledzenia.

Informacje śledzenia są zawsze zapisywane co najmniej w domyślnym Trace obiekcie docelowym danych wyjściowych.DefaultTraceListener Jeśli z jakiegoś powodu usunięto DefaultTraceListener element bez dodawania innych odbiorników do Listeners kolekcji, nie otrzymasz żadnych komunikatów śledzenia. Aby uzyskać więcej informacji, zobacz Śledzenie odbiorników.

Debug Sześć elementów członkowskich i Trace metod zapisujących informacje śledzenia znajduje się w poniższej tabeli.

Method Wyjście
Assert Określony tekst; lub, jeśli żadna z nich nie jest określona, stos wywołań. Dane wyjściowe są zapisywane tylko wtedy, gdy warunek określony jako argument w instrukcji Assert ma wartość false.
Fail Określony tekst; lub, jeśli żadna z nich nie jest określona, stos wywołań.
Write Określony tekst.
WriteIf Określony tekst, jeśli warunek określony jako argument w instrukcji WriteIf jest spełniony.
WriteLine Określony tekst i powrót karetki.
WriteLineIf Określony tekst i powrót karetki, jeśli warunek określony jako argument w instrukcji WriteLineIf jest spełniony.

Wszystkie odbiorniki w Listeners kolekcji odbierają komunikaty opisane w powyższej tabeli, ale podjęte akcje mogą się różnić w zależności od rodzaju odbiornika odbiera komunikat. Na przykład w oknie DefaultTraceListener dialogowym asercji jest wyświetlane okno dialogowe odebrania Fail lub niepowodzenia Assert powiadomienia, ale TextWriterTraceListener po prostu zapisuje dane wyjściowe w strumieniu.

Wyniki niestandardowe można wygenerować, implementując własny odbiornik. Niestandardowy odbiornik śledzenia może na przykład wyświetlać komunikaty w polu komunikatu lub łączyć się z bazą danych w celu dodania komunikatów do tabeli. Wszystkie odbiorniki niestandardowe powinny obsługiwać sześć metod wymienionych powyżej. Aby uzyskać więcej informacji na temat tworzenia odbiorników zdefiniowanych przez deweloperów, zobacz TraceListener w dokumentacji programu .NET Framework.

Metody Write i WriteLine zawsze zapisują określony tekst. Assert, WriteIfi WriteLineIf wymagają argumentu logicznego, który kontroluje, czy piszą określony tekst; zapisują określony tekst tylko wtedy, gdy wyrażenie ma wartość true (dla WriteIf i WriteLineIf) lub false (dla Assert). Metoda Fail zawsze zapisuje określony tekst. Aby uzyskać więcej informacji, zobacz How to: Add Trace Statements to Application Code (Instrukcje dodawania instrukcji śledzenia do kodu aplikacji) i .NET Framework reference (Dokumentacja programu .NET Framework).

Obawy dotyczące zabezpieczeń

Jeśli nie wyłączysz śledzenia i debugowania przed wdrożeniem aplikacji ASP.NET, aplikacja może ujawnić informacje o sobie, które mogą zostać wykorzystane przez złośliwy program. Aby uzyskać więcej informacji, zobacz Jak kompilować warunkowo za pomocą funkcji śledzenia i debugowania, kompilowania i kompilowania oraz Instrukcje: tworzenie, inicjowanie i konfigurowanie przełączników śledzenia. Debugowanie można również konfigurować za pośrednictwem usług Internet Information Services (IIS).

Zobacz też