Debugowanie przy pomocy IntelliTrace

Niniejszy temat znajduje zastosowane wyłącznie w odniesieniu do programu Visual Studio 2010 Ultimate.

W porównaniu z tradycyjnymi debugerami debugowanie przy pomocy IntelliTrace, dostępne w programie Microsoft Visual Studio 2010 Ultimate, zapewnia ulepszony obraz aplikacji. Tradycyjne debugery pokazują stan aplikacji w czasie bieżącym oraz ograniczone informacje na temat zdarzeń, jakie miały miejsce w przeszłości. Należy zatem wywnioskować zdarzenia, które miały miejsce w przeszłości, na podstawie stanu aplikacji w czasie bieżącym, lub ponownie uruchomić aplikację, w celu odtworzenia minionych zdarzeń. Dzięki IntelliTrace można zobaczyć zdarzenia, które miały miejsce w przeszłości oraz kontekst ich wystąpienia. Redukuje to liczbę ponownych uruchomień, których wymaga się, w celu debugowania aplikacji oraz możliwość, że błąd nie zdoła się odtworzyć, gdy ponownie uruchomimy aplikację.

IntelliTrace rozszerza oraz ulepsza możliwości debugowania na żywo w programie Visual Studio, do którego jesteście przyzwyczajeni. Będziecie mieć dostęp do wszystkich funkcji debugera programu Visual Studio, które już znacie. IntelliTrace pracuje w tle w sposób niewidoczny, rejestrując informacje dotyczące debugowania. Jeśli chcecie przejrzeć stan aplikacji z przeszłości, możecie włączyć tryb IntelliTrace, w którym możliwe jest przejście do różnych punktów w czasie, w których zarejestrowane zostały interesujące nas zdarzenia.

Można również pobrać i debugować plik dziennika śledzenia debugowania o rozszerzeniu .iTrace. Utworzone przez IntelliTrace, lub Test Managera, pliki dziennika pozwalają przeprowadzać poawaryjne debugowanie przy pomocy pełnego zakresu funkcji IntelliTrace.

Przy zastosowaniu ustawień domyślnych, IntelliTrace ma minimalny wpływ na wydajność aplikacji. Dlatego też IntelliTrace jest domyślnie włączony. Nawet jeśli nie planowaliście użycia IntelliTrace, gdy rozpoczynaliście sesję debugowania, informacje IntelliTrace są zbierane automatycznie i będą dostępne, kiedy będziecie ich potrzebować.

Szybsze debugowanie kodu

IntelliTrace może zaoszczędzić nasz czas poprzez skrócenie cyklu debugowania. Załóżmy, na przykład, że debugujemy aplikację, która odczytuje wartości rejestru podczas inicjowania, ale klucz rejestru nie istnieje. Skutki tego problemu mogą pozostać niewidoczne, aż do czasu, gdy aplikacja zostanie uruchomiona. Wtedy należy sprawdzić, dlaczego wartość rejestru nie została odczytana. Zwykle restartuje się aplikację i umieszcza się punkt przerwania blisko dostępu do rejestru. Uruchamianie aplikacji zajmuje trochę czasu. Dzięki IntelliTrace można uniknąć wielu takich ponownych uruchomień. Zamiast uruchamiania aplikacji, można rozpocząć debugowanie przy użyciu IntelliTrace, który pozwala przejrzeć wszystkie wejścia do rejestru i wybrać ten, który nas interesuje oraz sprawdzić stan aplikacji w momencie, gdy nastąpiło wybrane wejście do rejestru. Podobne oszczędności czasu można uzyskać debugując inne problemy, takie jak wyjątki, lub błąd dostępu do pliku.

Debugowanie nieodtwarzalnych błędów

IntelliTrace pozwala debugować błędy i awarie, które inaczej byłyby nieodtwarzalne. Możliwe jest debugowanie plików dziennika utworzonych przez IntelliTrace, lub przez Test Managera. Tester może połączyć plik dziennika z Test Managera bezpośrednio z elementem roboczym programu Team Foundation Server, lub usterką, które mogą zostać przypisane do dewelopera. W ten sposób IntelliTrace oraz Test Manager  zostaną włączone do zespołowego przepływu pracy.

Proces debugowania pliku IntelliTrace jest podobny do debugowania pliku zrzutu. Jednakże pliki IntelliTrace zapewniają znacznie więcej informacji, niż tradycyjne pliki zrzutu. Plik zrzutu zapewnia zdjęcie stanu aplikacji w jednym momencie w czasie, zwykle tuż przed awarią. Przy użyciu IntelliTrace można przewinąć historię, aby obejrzeć stan aplikacji i zdarzeń, jakie miały miejsce wcześniej, gdy aplikacja była uruchomiona. Dzięki temu debugowanie z pliku dziennika jest szybsze i łatwiejsze, niż debugowanie z pliku zrzutu.

Obsługiwane aplikacje i scenariusze debugowania

IntelliTrace obsługuje debugowanie aplikacji Visual Basic oraz C#, które korzystają z .NET v. 2.0, 3.0, 3.5, lub 4. Możliwe jest debugowanie większości aplikacji, w tym aplikacji utworzonych przy użyciu ASP.NET, Windows Forms, WPF, Windows Workflow oraz WCF. IntelliTrace nie obsługuje debugowania C++, skryptów, ani innych języków. Debugowanie aplikacji F# obsługiwane jest eksperymentalnie.

Przy użyciu IntelliTrace możliwe jest debugowanie aplikacji uruchamianych z Visual Studio oraz plików IntelliTrace utworzonych przez IntelliTrace, lub Test Managera. IntelliTrace  nie można użyć w przypadku aplikacji uruchamianych poza Visual Studio i debugowanych przy użyciu polecenia Attach to. IntelliTrace nie obsługuje zdalnego debugowania aplikacji uruchomionych na innych komputerach.

IntelliTrace obsługuje poawaryjne debugowanie aplikacji programu SharePoint oraz 64-bitowych aplikacji poprzez pliki dziennika śledzenia debugowania utworzone przez Test Managera. Nie obsługuje debugowania aplikacji programu SharePoint, ani aplikacji  64-bitowych uruchamianych z programu Visual Studio.

IntelliTrace nie obsługuje debugowania aplikacji Silverlight, Xbox, ani Windows Mobile.

Poziomy zbierania

Kiedy IntelliTrace jest włączony, informacje zbierane są automatycznie podczas każdej sesji debugowania. Umożliwiają one przełączanie się z debugowania na żywo na debugowanie przy pomocy IntelliTrace, kiedy tylko jest to potrzebne. Typ zbieranych informacji określany jest przez opcje ustawiane na poziomie programu Visual Studio. Opcje zbierania mają zastosowanie w odniesieniu do wszystkich projektów i rozwiązań. Utrzymują się między sesjami debugowania, a sesjami programu Visual Studio.

IntelliTrace domyślnie zbiera informacje tylko dla wybranych zdarzeń IntelliTrace. Jak wspomniano wcześniej, zbieranie informacji domyślnych ma minimalny wpływ na wydajność aplikacji.

Aby uzyskać większą moc debugowania, oprócz zdarzeń IntelliTrace, można wybrać zbieranie zapisów wywołań razem z ich parametrami i wartościami zwrotnymi. Dodatkowa moc debugowania możliwa jest kosztem wydajności.

Szybsze debugowanie kodu przy użyciu IntelliTrace

Debugowanie to proces z zasady powtarzający się. Często wymaga to kilkukrotnego ponownego uruchamiania aplikacji, w celu odnalezienia problemu. Zapewniając dostęp do informacji na temat zdarzeń, jakie miały miejsce w przeszłości, IntelliTrace może wyeliminować wielokrotne ponowne uruchomienia, a co za tym idzie przyspieszyć proces debugowania.

Szybsze debugowanie

Oto kilka przykładów na to, jak IntelliTrace może oszczędzić twój czas:

  • Ustawiasz punkt przerwania blisko początku aplikacji. Po obserwacji stanu aplikacji w tym punkcie, kontynuujesz jej wykonywanie. Później, decydujesz, że chcesz wrócić i obejrzeć ponownie pierwsze trafienie punktu przerwania. Bez IntelliTrace należałoby ponownie uruchomić aplikację. Dzięki IntelliTrace można odnaleźć zdarzenie w punkcie przerwania w oknie IntelliTrace, a następnie kliknąć punkt przerwania, aby obejrzeć stan aplikacji w momencie, gdy nastąpi trafienie w punkcie przerwania. Informacje o stanie zawierają zmienne, sprawdzone wcześniej w DataTips, lub oknach zmiennych.
  • Odkrywasz, że aplikacja uszkodziła plik danych, lub wpis rejestru, ale nie wiesz, gdzie to naruszenie pliku, lub rejestru nastąpiło. Bez IntelliTrace należałoby przeszukać kod, aby odnaleźć możliwe wejścia do pliku, lub rejestru, umieścić w tych miejscach punkty przerwania, a następnie ponownie uruchomić aplikację, aby sprawdzić, gdzie pojawia się problem. Wykorzystując IntelliTrace widzisz wszystkie zebrane zdarzenia wejścia do rejestru, lub pliku oraz stan aplikacji w czasie, gdy każde z tych zdarzeń miało miejsce.
  • Pojawia się wyjątek. Bez IntelliTrace otrzymasz komunikat o wyjątku, który określi naturę wyjątku, ale informacje na temat zdarzeń, które doprowadziły do jego wystąpienia są ograniczone. Możesz zbadać stos wywołań, aby zobaczyć łańcuch wywołań, który doprowadził do wyjątku, ale nie możesz zbadać sekwencji zdarzeń, jakie miały miejsce w trakcie tych wywołań. Korzystając z IntelliTrace możesz zbadać zdarzenia, które miały miejsce w różnych momentach przed wystąpieniem wyjątku.

Wprowadzenie do IntelliTrace

Debugowanie przy pomocy IntelliTrace poszerza i ulepsza typowe możliwości debugowania programu Visual Studio nie powodując zamętu w dotychczasowym przepływie pracy. Jeśli używasz ustawień domyślnych, IntelliTrace minimalnie wpływa na wydajność aplikacji. Poza zdarzeniami domyślnymi można również wybrać zbieranie dodatkowych informacji.

Debugowanie aplikacji przy użyciu IntelliTrace

  1. Uruchom debugowanie Visual Studio tak, jak zwykle.
    1. W menu Debug kliknij Start Debugging.
    2. Użyj okien debugera Visual Studio, jak zwykle ustaw punkty przerwania i wykonaj pozostałe elementy debugowania.
  2. Wejdź automatycznie w tryb przerwania, gdy aplikacja trafi na punkt przerwania, lub, gdy klikniesz Break All w menu Debug, lub oknie IntelliTrace.
  3. Użyj okna IntelliTrace, jeśli potrzebujesz więcej informacji na temat minionych zdarzeń.
    • Na liście zdarzeń IntelliTrace kliknij zdarzenie, które chcesz przejrzeć, jak pokazano na poniższej ilustracji.
    • Aby przefiltrować listę zdarzeń pod względem węzła, lub kategorii, użyj dwóch rozwijanych list w górnej części okna.
    • Aby wyszukać zdarzenia, które zawierają określone ciągi, wpisz ciąg w polu wyszukiwania, a następnie kliknij ikonę szkła powiększającego.
    • Kliknij link Related views, aby zobaczyć powiązane informacje w oknie debugera.
    • Jeśli zdarzenie IntelliTrace jest zdarzeniem uzyskania dostępu do pliku, kliknij link nazwy ścieżki, aby otworzyć ten plik. Jeśli pełna nazwa ścieżki nie jest dostępna, pojawi się pole wyszukiwania. Użyj go, aby odnaleźć plik.

Dalsze działania przy pomocy IntelliTrace

IntelliTrace domyślnie zbiera informacje na temat określonych zdarzeń IntelliTrace, które miały miejsce podczas gdy aplikacja była uruchomiona, w tym wyjątków, na temat zdarzeń debugera, takich jak trafienia w punktach przerwania oraz zdarzeń .NET Framework.

Aby uzyskać jeszcze większą moc debugowania, można wybrać zbieranie informacji IntelliTrace przy każdym wywołaniu, w tym parametrów wywołań oraz wartości zwrotnej. Jeśli wybierzesz zbieranie informacji o wywołaniu, IntelliTrace zapewni dodatkowe narzędzia, w tym Calls View.

Debugowanie nieodtwarzalnych błędów przy użyciu IntelliTrace

Nieodtwarzalne błędy to powszechny problem deweloperów. Na przykład, aplikacja może mieć awarię na komputerze testowym, ale uruchomić się bezproblemowo na komputerze dewelopera.

W wielu przypadkach użycie IntelliTrace razem z Test Managerem może rozwiązać problem nieodtwarzalnych błędów. Test Manager automatycznie zbiera dane IntelliTrace i zapisuje je, jako zapis IntelliTrace , który później deweloperzy mogą otworzyć przy użyciu programu Visual Studio. Elementy robocze Team Foundation Server zapewniają środki dla testerów do udostępniania deweloperom zapisów IntelliTrace . Deweloper może debugować problem w sposób podobny do debugowania typu postmortem pliku zrzutu, ale z większą ilością informacji.

Plik zrzutu reprezentuje zdjęcie stanu aplikacji w jednym momencie, zwykle w momencie wystąpienia awarii. Zapis IntelliTrace zawiera serię zdjęć, które reprezentują zmiany stanu aplikacji w czasie. Przy użyciu zapisu IntelliTrace można przejrzeć zdarzenia, które miały miejsce we wczesnym etapie uruchomionej aplikacji, oprócz stanu końcowego. W ten sposób debugowanie zapisu IntelliTrace bardziej przypomina debugowanie aktywnej aplikacji, niż debugowanie pliku zrzutu.

Deweloperzy mogą również udostępniać zapisy IntelliTrace, które tworzone są w programie Visual Studio. Ten scenariusz jest mnie popularny, niż debugowanie zapisu IntelliTrace  utworzonego w Test Managerze. 

Debugowanie zapisu IntelliTrace załączonego do elementu roboczego

  1. Otwórz element roboczy zawierający zapis IntelliTrace.
  2. W oknie elementu roboczego kliknij Other Links, a następnie kliknij zapis IntelliTrace, który rozpoznasz po rozszerzeniu .iTrace.
  3. W oknie IntelliTrace Summary rozwiń element Threads List, Exception Data, lub Test Step, następnie dwukrotnie kliknij wątek, wyjątek, lub etap testu, aby rozpocząć debugowanie aplikacji w tym punkcie:
    1. Jeśli debugujesz aplikację, która wywołała wyjątek, dwukrotnie kliknij nazwę wyjątku, aby rozpocząć debugowanie w momencie, w którym został on wywołany.
    2. Jeśli chcesz rozpocząć debugowanie na początku aplikacji, dwukrotnie kliknij Main thread.
  4. Na tym etapie możliwe jest przejście do dowolnego zdarzenia, jakie zostało zebrane w zapisie, w celu zbadania stanu aplikacji w danym momencie.
Uwaga
Jeśli zamkniesz okno Trace Debugging Log: Summary i chcesz je otworzyć ponownie, przejdź do menu Debug i kliknij ikonę Show Log Summary.

Zbieranie informacji IntelliTrace

W programie Visual Studio 2010 Ultimate IntelliTrace jest domyślnie włączony. W trakcie sesji debugowania na żywo, IntelliTrace  działa w tle, automatycznie i niewidocznie zbierając informacje IntelliTrace . Dostępność tych informacji umożliwia przełączenie się z sesji debugowania na żywo na debugowanie przy użyciu IntelliTrace oraz „podróż w czasie” przez kod. Informacje zebrane w trakcie debugowania na żywo zostają również zapisane jako plik  IntelliTrace , który można otworzyć później, aby rozpocząć sesję IntelliTrace.

Domyślnie IntelliTrace zbiera i rejestruje informacje tylko dla wybranych zdarzeń IntelliTrace. Domyślne ustawienia zbierania mają minimalne obciążenie. Nie wpływają na proces uruchamiania aplikacji, ani na możliwość korzystania z debugera programu Visual Studio.

Dzięki zbieraniu wywołań i parametrów IntelliTrace zapewnia dodatkowe możliwości debugowania. Jednakże czynność ta zwiększa obciążenie wydajności, powoduje dodatkowe zużycie miejsca na dysku oraz wyłącza funkcję Edit and Continue debugera programu Visual Studio. Należy zatem rozważyć koszty i korzyści dla poszczególnych aplikacji oraz scenariuszy debugowania.

Opcje zbierania ustawiane są na poziomie programu Visual Studio. Stosują się do wszystkich projektów i rozwiązań Visual Basic oraz C#. Utrzymują się między sesjami debugowania i sesjami programu Visual Studio.

IntelliTrace Events to zdarzenia, które występują, gdy aplikacja jest uruchomiona. Mogą być zbierane przez IntelliTrace. Typy zdarzeń, jakie mogą być zbierane przez IntelliTrace są następujące:

  • Zdarzenia debugera. Zdarzenia te występują podczas debugowania aplikacji w debugerze programu Visual Studio. Uruchomienie aplikacji to jedno zdarzenie debugera. Inne to zdarzenia zatrzymujące, czyli zdarzenia, które powodują przejście aplikacji w stan przerwania. Przykładowe zdarzenia zatrzymujące to trafienie w punkt przerwania, trafienie w punkt śledzenia, lub wykonanie polecenia Step.

Ze względu na wydajność IntelliTrace nie zbiera wszelkich możliwych wartości każdego zdarzenia debugera. Zbiera natomiast wartości, które są widoczne dla użytkownika. Jeśli, na przykład, okno Autos jest otwarte, IntelliTrace zbiera wartości w nim widoczne. Jeśli jest ono zamknięte, wartości te nie są zbierane.

Jeśli wskażemy zmienną w oknie źródłowym, wartość, która pojawi się w DataTip zostanie zebrana. Jednakże, wartości w zakotwiczonym DataTip nie są zbierane.

  • Zdarzenia wyjątków. Występują w przypadku obsługiwanych wyjątków, w punktach, gdzie wyjątek został zgłoszony i przechwycony oraz w przypadku wyjątków nieobsługiwanych. IntelliTrace zbiera typ wyjątku oraz komunikat o wyjątku.
  • Zdarzenia struktury. Występuję wewnątrz biblioteki .NET. Pełną listę zdarzeń .NET, jakie mogą być zbierane, można przejrzeć na stronie IntelliTrace Events okna dialogowego Options. Dane zebrane przez IntelliTrace różnią się dla poszczególnych zdarzeń. Dla zdarzenia File Access IntelliTrace zbiera nazwę pliku, dla Check Checkbox, zbiera stan pola wyboru i tekst, itd.

Aby zobaczyć listę zebranych zdarzeń IntelliTrace, kliknij kartę IntelliTrace Events w oknie IntelliTrace. Zdarzenia debugera zbierane są zawsze, gdy IntelliTrace jest uruchomiony. Nie można wyłączyć ich zbierania.

Najczęstsze zdarzenia .Framework zbierane są domyślnie. Aby wybrać inne zdarzenia .NET można użyć następującej procedury. Dodatkowo, możliwe jest wyłączenie zbierania dowolnych, lub wszystkich zdarzeń .NET. Aby zmniejszyć ilość informacji w oknie IntelliTrace, można wyłączyć zbieranie zdarzeń, które nas nie interesują. Włączanie, lub wyłączanie zbierania poszczególnych zdarzeń ma niewielki wpływ na wydajność aplikacji.

Wybieranie zdarzeń IntelliTrace, które chcemy zarejestrować

  1. W pasku narzędzi okna IntelliTrace kliknij ikonę Open IntelliTrace Setting.

    –lub–

    1. W menu Tools kliknij Options.
    2. W oknie dialogowym Options wskaż węzeł IntelliTrace, a następnie kliknij General.
  2. Sprawdź, czy wybrana została opcja Enable IntelliTrace.

    Uwaga
    Odznaczenie pola wyboru Enable IntelliTrace wyłącza wszystkie ustawienia niestandardowe.
  3. W węźle IntelliTrace kliknij IntelliTrace Events.

  4. Przejrzyj pole IntelliTrace Events, aby znaleźć kategorie zdarzeń, które cię interesują.

    1. Aby zobaczyć poszczególne zdarzenia, kliknij formant drzewa obok Category name. Można, na przykład, rozwinąć Registry, aby obejrzeć poszczególne zdarzenia rejestru, takie jak ClosedRegistryKey.
    2. Aby włączyć, lub wyłączyć rejestrowanie całej kategorii zdarzeń, zaznacz, lub odznacz pole wyboru obok nazwy kategorii.
    3. Aby włączyć, lub wyłączyć rejestrowanie poszczególnego zdarzenia, zaznacz, lub odznacz pole wyboru obok nazwy konkretnego zdarzenia.
  5. Kliknij OK.

  6. Jeśli przeprowadzasz debugowanie, musisz ponownie uruchomić sesję debugowania, aby zmiany zostały wprowadzone.

Wywołania i parametry

Jeśli potrzebujesz więcej informacji podczas debugowania przy użyciu IntelliTrace, możesz wybrać zbieranie informacji na temat wywołań i ich parametrów. Zbieranie informacji o wywołaniach może wpływać na wydajność aplikacji i może zwiększyć rozmiar plików dziennika.

Zbieranie informacji na temat wywołań jest niekompatybilne z funkcją Edit and Continue debugera programu Visual Studio. Jeśli wybierzesz zbieranie informacji na temat wywołań, funkcja Edit and Continue zostaje automatycznie wyłączona i nie można jej ponownie włączyć w czasie, gdy włączone jest zbieranie informacji na temat wywołań.

Gdy włączymy IntelliTrace Events and Call Information, IntelliTrace zbiera zapisy każdego rozpoczęcia i zakończenia wywołania. Przy rozpoczęciu IntelliTrace zbiera informacje na temat nazwy i wartości każdego parametru. W przypadku tabel tylko pierwsze 256 obiektów zostaje zarejestrowanych. W przypadku obiektów zarejestrowany zostaje wyłącznie górny poziom struktury. Przy zakończeniu IntelliTrace zbiera wartość zwrotną metody.

Włączanie zbierania informacji na temat wywołań

  1. W oknie dialogowym Options, w węźle IntelliTrace, kliknij General.
  2. Na stronie General kliknij IntelliTrace Events and Call Information.
  3. Kliknij OK.

Konfigurowanie zbierania w poszczególnych modułach

Zbieranie informacji IntelliTrace można włączyć, lub wyłączyć dla poszczególnych modułów. Możliwość ta jest bardzo przydatna, ponieważ niektóre moduły mogą okazać się nieprzydatne w procesie debugowania. Na przykład, możesz debugować rozwiązanie zawierające starsze projekty DLL, które były testowane i dogłębnie debugowane. Wyłączenie modułów, które nas nie interesują, redukuje ilość informacji w oknie IntelliTrace i ułatwia koncentrowanie się na wybranym kodzie. Może również zwiększyć wydajność i zredukować ilość miejsca na dysku wykorzystywaną przez plik dziennika. Różnica może być znacząca, jeśli wybraliśmy zbieranie wywołań i parametrów.

Zbieranie danych z wybranych modułów

  1. W oknie dialogowym Options, w węźle IntelliTrace, kliknij Modules.

  2. Wybierz Collect data from all modules except for the following, lub Collect data from only the following modules.

    Pod tym ustawieniem znajduje się lista nazw modułów.

  3. Aby usunąć moduł z listy, wybierz nazwę modułu i kliknij przycisk Remove.

  4. Aby dodać moduł do listy:

    1. Kliknij przycisk Add

      Pojawi się pole dialogowe Add a pattern.

    2. W polu Enter a string pattern wpisz nazwę modułu, który chcesz dodać do listy. Aby dodać więcej, niż jeden moduł, możesz użyć specyfikatorów symboli wieloznacznych na początku, lub na końcu ciągu.

    3. Kliknij Add.

    Nazwy modułów muszą być nazwami plików, a nie nazwami zestawów. Ścieżki plików nie są akceptowane.

  5. Kliknij OK.

Uwaga
Jeśli na stronie General zbieranie jest ustawione na Events only, ustawienia modułów nie odnoszą żadnego skutku.

Nawigowanie przy użyciu IntelliTrace

Podczas korzystania z debugera programu Visual Studio okna debugera pokazują zdjęcie stanu aplikacji w jednym momencie w czasie. Gdy korzystamy z IntelliTrace, możemy zobaczyć stan aplikacji w wielu momentach. IntelliTrace rejestruje stan aplikacji we wstępnie zdefiniowanych punktach w trakcie sesji debugowania.

Podczas debugowania przy użyciu IntelliTrace możliwe jest przejście do dowolnego punktu, w którym zebrane zostały informacje na temat debugowania. Kiedy przechodzimy do nowego punktu w IntelliTrace, okno źródłowe pokazuje kod źródłowy, w którym nastąpiło zdarzenie. W tym samym czasie okno debugera Call Stack oraz inne okna debugera są uaktualniane, w celu wskazania kontekstu, w jakim zdarzenie miało miejsce.

Niniejszy temat opisuje sposoby użycia IntelliTrace do nawigowania w zebranej historii aplikacji.

Podgląd IntelliTrace Events

Podgląd IntelliTrace Events jest domyślnym podglądem w oknie  IntelliTrace, który domyślnie zadokowany jest w Solution Explorer oraz Team Explorer. Zdarzenia IntelliTrace zbierane są za każdym razem, gdy IntelliTrace jest włączony. Można zatem użyć tego widoku podczas dowolnej sesji IntelliTrace.

W trybie debugowania widok IntelliTrace Events pokazuje listę zdarzeń zebranych przezIntelliTrace podczas sesji debugowania. Zebrane zdarzenia są określane w oknie dialogowym Options.

Przechodzenie do punktu w czasie, w którym nastąpiło zdarzenie diagnostyczne

  • W widoku IntelliTrace Events kliknij zdarzenie, do którego chcesz przejść.

    Okno źródłowe wyświetli kod źródłowy dla punktu, w którym zdarzenie miało miejsce, wskaźnik rozkazów przesunie się do tego punktu, a okna debugera zostaną uaktualnione, aby pokazać kontekst, w którym wystąpiło dane zdarzenie.

Widok wywołań

Widok wywołań zapewnia hierarchiczny sposób przeglądania wywołań nawigacyjnych oraz zdarzeń IntelliTrace z nimi związanych.

W przeciwieństwie do zdarzeń IntelliTrace, które zawsze zbierane są, gdy IntelliTrace jest włączony, informacje na temat wywołań zbierane są tylko, jeśli włączymy IntelliTrace Events and Call Information w oknie dialogowym Options.

Wyświetlanie widoku Calls

  • W pasku narzędzi w górnej części okna IntelliTrace kliknij ikonę Show Calls View.

Widok Calls wyświetla stos wywołań, który przypomina odwróconą wersję okna debugera Call Stack. W oknie tym bieżące wywołanie znajduje się na samej górze. W widoku Calls znajduje się na samym dole.

Kiedy debugujemy przy użyciu IntelliTrace, bieżące wywołanie oznacza wywołanie, które było bieżące w oglądanym kontekście czasowym. Niekoniecznie jest to wywołanie bieżące w czasie rzeczywistym.

Widok wywołań, wcięty poniżej bieżącego wywołania, pokazuje listę wywołań dokonanych z bieżącego wywołania oraz zdarzeń IntelliTrace z nim powiązanych.

Przechodzenie z wywołania bieżącego do innego wywołania

  • Na liście wywołań wciętych poniżej bieżącego wywołania dwukrotnie kliknij wywołanie, do którego chcesz przejść.

    Widok Calls zostaje uaktualniony i pokazuje, że dwukrotnie kliknięte wywołanie jest obecnie wywołaniem bieżącym. Okno źródłowe, wskaźnik rozkazów oraz okna debugera zostają uaktualnione i pokazują stan aplikacji dla nowego bieżącego wywołania.

Przechodzenie do położenia wywołania wewnątrz bieżącego wywołania

  • Na liście wywołań wciętych poniżej bieżącego wywołania kliknij wywołanie, które pojawi się pod wywołaniem bieżącym.

    Nie klikaj dwukrotnie tego wywołania. Dwukrotne kliknięcie spowoduje przeniesienie do wywołania, a nie do jego położenia.

    W oknie źródłowym wskaźnik rozkazów przesunie się do położenia wywołania. Okno Call Stack się nie zmienia, ponieważ nadal pozostajemy w tym samym wywołaniu.

Przechodzenie do zdarzenia IntelliTrace wewnątrz bieżącego wywołania

  • Kliknij zdarzenie IntelliTrace, które pojawi się pod bieżącym wywołaniem.

    W oknie źródłowym wskaźnik rozkazów przesunie się do położenia wywołania.

Przestrzeń nawigacyjna (Navigation Gutter)

Navigation gutter to kolejne narzędzie nawigacyjne dostępne tylko, jeśli włączona jest opcja IntelliTrace Events and Call Information w oknie dialogowym Options. Navigation gutter pojawia się razem z oknem źródłowym, między przestrzenią debugowania standardowego i marginesem. Przestrzeń ta to pionowy pasek, na którym pojawią się ikony bieżącego wskaźnika rozkazów oraz punktu przerwania.

Narzędzia Navigation gutter można użyć zarówno podczas debugowania na żywo, jak i debugowania przy użyciu IntelliTrace. Kolor Navigation gutter zmienia się, wskazując bieżący tryb. Kolorem domyślnym dla debugowania na żywo jest jasny szary. Kiedy debugujemy przy użyciu IntelliTrace, kolorem domyślnym jest ciemny szary.

Narzędzie Navigation gutter jest domyślnie wyświetlone. Nie pojawia się, jednak, jeśli metody i parametry nie są zbierane, jeśli IntelliTrace jest wyłączony, lub jeśli wyłączyliśmy go w oknie dialogowym Options. Jeśli narzędzie Navigation gutter jest wyłączone i chcesz włączyć je ponownie zapoznaj się z częścią Włączanie i wyłączanie narzędzia Navigation gutter (j.ang.).

Narzędzie Navigation gutter zawiera ikony nawigacyjne, jak pokazuje powyższa ilustracja. Należy zauważyć, że polecenia Return to Call Site oraz Step In są równe, ale przeciwstawne, tak jak Go to Previous Event i Go to Next Event.

  • Return to Call Site cofa w czasie wskaźnik rozkazów oraz kontekst debugowania do momentu, od którego bieżąca funkcja, lub metoda była wywoływana. Jeśli pracujesz w trybie debugowanie na żywo, polecenie to spowoduje rozpoczęcie debugowania przy użyciu IntelliTrace.
  • Step In przesuwa wskaźnik rozkazów oraz kontekst debugowania w czasie do przodu do obecnie wyróżnionej funkcji. Polecenie to dostępne jest wyłącznie, gdy wykonujesz debugowanie przy użyciu IntelliTrace. Step In oraz Return to Call Site przesuwają w odwrotnych kierunkach.
  • Go to Previous Call or IntelliTrace Event cofa w czasie wskaźnik rozkazów oraz kontekst debugowania do ostatniego wywołania, lub zdarzenia. Jeśli pracujesz w debugowaniu na żywo, polecenie to spowoduje rozpoczęcie debugowania przy użyciu IntelliTrace.
  • Go to Next Call or IntelliTrace Event przesuwa wskaźnik rozkazów oraz kontekst debugowania w czasie do przodu do następnego wywołania, lub zdarzenia, w którym istnieją dane IntelliTrace. Polecenie to dostępne jest tylko, jeśli wykonujesz debugowanie przy użyciu IntelliTrace.
  • Go to Live Mode powoduje powrót do debugowania na żywo, do punktu, w którym rozpoczęte zostało debugowanie przy użyciu IntelliTrace.
  • W każdej ramce bieżącego stosu wywołań pojawi się polecenie Set Debugger Context Here. Kliknij je, aby ustawić kontekst debugowania w ramce wywołania, w której się pojawi

Dostęp do tych ikon, z wyjątkiem ikony Set Debugger Context, można również uzyskać z menu IntelliTrace, zagnieżdżonego w menu Debug, lub z paska narzędzi IntelliTrace, jeśli zdecydujesz, że ma być wyświetlony. Set Debugger Context pojawi się wyłącznie w narzędziu Navigation gutter.

Przeszukiwanie historii IntelliTrace

Gdy IntelliTrace Events and Call Information jest włączone, IntelliTrace pozwala wyszukać dowolną zarejestrowaną instancję wywołania. Po znalezieniu interesującej cię instancji możesz zsynchronizować z nią kontekst IntelliTrace, a następnie użyć okna IntelliTrace oraz standardowych okien debugera do obserwowania stanu aplikacji podczas instancji wywołania.

Istnieją dwa sposoby wyszukiwania instancji wywołania. Jeden polega na kliknięciu linijki kodu źródłowego, z którego składa się wywołanie. Drugi polega na kliknięciu treści wywoływanej metody, lub funkcji.

Wyszukiwanie instancji wywołania

  1. W oknie kodu źródłowego,

    • Prawym przyciskiem myszy kliknij na linijkę kodu, z którego składa się wywołanie, następnie kliknij Search For This Line In IntelliTrace, lub
    • Prawym przyciskiem myszy kliknij wewnątrz treści metody, lub funkcji, a następnie kliknij Search For This Method In IntelliTrace..

    Wyniki wyszukiwania pojawią się w przestrzeni poziomej w górnej części okna źródłowego, jak pokazano na ilustracji. Wyniki wyszukiwania wskazują, ile instancji zostało znalezionych w IntelliTrace.

  2. W przestrzeni wyników wyszukiwania po wynikach poruszaj się poprzez klikanie Go To Next Result, Go To Last Result, Go To Previous Result, lub Go To First Result.

    Kiedy przejdziesz do instancji wywołania w przestrzeni wyników wyszukiwania, widok Calls w oknie IntelliTrace automatycznie się z nią zsynchronizuje.

Należy mieć świadomość pewnych ograniczeń wyszukiwania:

  • Search For This Method In IntelliTrace nie działa, chyba że plik projektu zawierający metodę został otwarty w programie Visual Studio.
  • Search For This Line In IntelliTrace nie zwraca dokładnych wyników, jeśli linijka stanowi wyjście metody.

Pokazywanie okna i paska narzędzi IntelliTrace

Pasek narzędzi IntelliTrace domyślnie jest ukryty. Okno IntelliTrace domyślnie jest widoczne, ale można je ukryć, jeśli chcielibyśmy zredukować ilość informacji. Niniejsza część opisuje, jak ukryć i pokazać te elementy.

Okno IntelliTrace

Domyślnie, okno IntelliTrace pojawia się w tej samej lokalizacji, co Solution Explorer oraz Team Explorer. Okno można ukryć zamykając je przy użyciu standardowej metody Close.

Pokazywanie okna IntelliTrace

  • W menu Debug wskaż IntelliTrace, a następnie kliknij IntelliTrace Events or IntelliTrace Calls. To polecenie menu dostępne jest wyłącznie podczas procesu debugowania.
    Uwaga
    Okno IntelliTrace można przesunąć, zadokować, oddokować, lub ukryć. Pełna informacja na temat przesuwania oraz dokowania okien znajduje się w części Rozmieszczanie i dokowanie okien (j.ang.).

Pasek narzędzi IntelliTrace

Pasek narzędzi IntelliTrace zapewnia alternatywny sposób uzyskania dostępu do poleceń IntelliTrace dostępnych w menu Debug oraz narzędziu Navigation gutter. Domyślnie nie jest on wyświetlany.

Aby pokazać, lub ukryć pasek narzędzi IntelliTrace

  • W menu View wskaż pasek narzędzi, a następnie kliknij IntelliTrace.

Włączanie i wyłączanie IntelliTrace

IntelliTrace jest domyślnie włączony. Przy zastosowaniu ustawień domyślnych IntelliTrace ma niewielki wpływ na wydajność. Zatem istnieje niewielkie prawdopodobieństwo, że kiedykolwiek trzeba go będzie wyłączyć. Jeśli jednak zajdzie potrzeba wyłączenia go i ponownego włączenia, postępuj zgodnie z następującą procedurą.

Aby włączyć, lub wyłączyć IntelliTrace

  1. W menu Tools kliknij Options.
  2. W oknie dialogowym Options rozwiń węzeł IntelliTrace, a następnie kliknij General.
  3. Zaznacz, lub odznacz pole wyboru Enable IntelliTrace.
  4. Kliknij OK.

Scenariusze debugowania IntelliTrace

W niniejszej sekcji znajdziesz cztery scenariusze, które pokazują, jak używać IntelliTrace do debugowania aplikacji w łatwiejszy sposób.

Dwa spośród scenariuszy opisanych w niniejszej sekcji opierają się na grze karcianej napisanej w Visual Basic. Pozostałe dwa są oparte na aplikacji sieci Web napisanej w C#. Kod użyty w obu aplikacjach jest dość prosty. Bez względu na to, czy jesteście programistami Visual Basic, czy programistami C# powinniście być w stanie wykonać każdy z tych scenariuszy.

Debugowanie gry karcianej przy pomocy IntelliTrace: część I

Niniejsza część pokazuje jak używać IntelliTrace do debugowania aplikacji, gdy problem z programem obsługi zdarzenia powoduje, że aplikacja wyświetla nieprawidłowe wyniki. Zapewnia również podstawowe wprowadzenie do korzystania z IntelliTrace z ustawieniami domyślnymi.

Tradycyjne debugery pokazują stan aplikacji w bieżącym momencie z ograniczoną ilością informacji na temat zdarzeń, które wystąpiły w przeszłości. Należy albo na podstawie stanu aplikacji w bieżącym momencie wywnioskować zdarzenia, które miały miejsce w przeszłości, lub ponownie uruchomić aplikację, aby odtworzyć minione zdarzenia. Jeśli przeglądasz stos wywołań, na przykład, widzisz go takim, jaki jest w bieżącym momencie czasu. Jeśli chcesz odnaleźć informacje na temat wcześniejszego wywołania, należy ustawić punkt przerwania i ponownie rozpocząć sesję debugowania.

Dzięki IntelliTrace można przechodzić do różnych punktów w czasie, w których interesujące nas zdarzenia zostały zarejestrowane. W każdym punkcie można przejść do szczegółów danych debugowania, sprawdzić stos wywołań oraz użyć innych narzędzi debugowania w celu wykluczenia usterki.

Wymagania wstępne

Zdjęcia ekranu zamieszczone w niniejszej części pokazują kroki podejmowane w trakcie debugowania problemu z programem obsługi zdarzenia przy użyciu IntelliTrace. Możecie zapoznać się z niniejszym tekstem i wyciągnąć wnioski bez instalowania przykładowej aplikacji. Jeśli wolicie, możecie zainstalować przykładową aplikację i samodzielnie wykonać wskazane kroki. Przykładową aplikację można pobrać z Galerii kodów MSDN (j.ang.).

Ponieważ IntelliTrace jest domyślnie włączony w programie Visual Studio Ultimate, nie ma potrzeby dostosowywania ustawień, aby ukończyć działania przedstawione w tej instrukcji. Została ona zaprojektowana dla domyślnych ustawień IntelliTrace, ale przy włączonych dodatkowych ustawieniach przeprowadzenie kroków nadal będzie możliwe. 

Aplikacja w niniejszej części została napisana w Visual Basic, ale powinna być zrozumiała dla programistów C# posiadających podstawową wiedzę na temat kodu Visual Basic.

Testowanie aplikacji Black Jack

  1. W Visual Studio otwórz CardGame\CardGame.sln.

  2. W menu Debug kliknij Start Debugging.

    Uruchomi się aplikacja Black Jack i pojawi się pierwsza strona aplikacji.

  3. Kliknij New Game.

    W oknie pojawi się stół karciany, karty do gry oraz żetony.

  4. Kliknij przycisk 10, aby postawić $10.

    W tym momencie pole My Bet pokazuje, że postawiono $25, zamiast oczekiwanych $10.

    Jest to usterka. Istnieje jakiś problem z programem obsługi zdarzeń dla przycisku 10.

Debugowanie usterki przycisku obsługi

  1. Aby rozpocząć debugowanie tego problemu, należy najpierw otworzyć debugera. Jeśli korzystaliście wcześniej z debugera Visual Studio, wiecie, że możecie to zrobić z poziomu menu Debug. Można to również zrobić przy użyciu Visual Studio Ultimate, ale jest na to inny sposób. W oknie IntelliTrace wyświetlonych jest kilka linków. Jeden z linków to Break All, jak widać na poniższym zdjęciu ekranu.

  2. W oknie IntelliTrace kliknij Break All.

  3. Okno IntelliTrace zmieni się. Zamiast linków poleceń, pokaże listę zdarzeń diagnostycznych, zarejestrowanych przez IntelliTrace podczas działania aplikacji Black Jack.

    Powyższy widok okna IntelliTrace nazywa się widokiem IntelliTrace Events. Poświęćcie chwilę na zapoznanie się ze zdarzeniami diagnostycznymi i zauważcie, że pojawiły się tu również listy. Znajduje się tu również pole wyszukiwania, które umożliwia odnalezienie zdarzeń diagnostycznych pasujących do określonego ciągu. Ponadto, są tu dwie listy rozwijane, których można użyć do filtrowania listy. Przydają się, gdy chcemy wyszukać zdarzenia z określonej kategorii, lub zdarzenia, które wystąpiły w określonym wątku.

    Każde zdarzenie diagnostyczne posiada tekst opisowy. Jeśli zajdzie potrzeba wyświetlenia pełnego opisu, szerokość okna IntelliTrace można dostosować.

  4. Spójrzmy na zdarzenie o nazwie Gesture: Clicked "10" Button. Jest to zdarzenie diagnostyczne, które nas interesuje, więc kliknijmy je.

  5. Kiedy je klikniemy, rozwinie się pokazując dodatkowe informacje:

    Okno IntelliTrace wyświetla obecnie bardziej szczegółowy opis zdarzenia, nazwę i numer identyfikacyjny wątku, w którym zdarzenie wystąpiło oraz linki do powiązanych widoków (Related views). Powiązane widoki to okna debugera zawierające informacje, które mogą być istotne dla zdarzenia. Aby otworzyć powiązany widok, kliknij link.

    Przyjrzyj się teraz oknu kodu źródłowego:

    IntelliTraceautomatycznie zlokalizował i wyróżnił program obsługi zdarzeń dla zdarzenia Gesture: Clicked "10" Button, na które kliknęliśmy w kroku 4.

    Poprzez sprawdzenie kodu źródłowego, można zobaczyć, że zdarzenie jest obecnie obsługiwane przez TwentyFiveBtn_Click, a nie przez TenBtn_Click, który wyraźnie jest niepoprawny. Możemy zatem naprawić usterkę.

Debugowanie gry karcianej przy pomocy IntelliTrace: część II

W niniejszym scenariuszu nauczymy się używać zaawansowanych funkcji IntelliTrace do debugowania aplikacji gry karcianej. Włączymy opcję IntelliTrace, aby zebrać informacje na temat wywołania oraz zobaczymy, w jaki sposób umożliwiają one sprawdzanie historii wykonywania aplikacji.

Zbieranie informacji na temat wywołania przy użyciu IntelliTrace może mieć wpływ na wydajność programu. Z tego powodu opcja ta jest domyślnie wyłączona.

Mimo, że gra karciana użyta w niniejszym scenariuszu została napisana w Visual Basic, kod jest dość prosty. Programiści C# posiadający podstawową wiedzę na temat odczytywania Visual Basic nie powinni mieć żadnych problemów z jego zrozumieniem.

Wymagania wstępne

Możecie zapoznać się z technikami i nauczyć się ich bez instalowania przykładowej aplikacji. Jeśli chcecie zobaczyć pełny kod i samodzielnie wykonać wskazane kroki, możecie pobrać rozwiązanie Visual Studio dla niniejszej przykładowej aplikacji z Galerii kodów MSDN (j.ang.).

Ponieważ przykładowa aplikacja jest grą karcianą, która zależy od szczęścia, wykonywane kroki podczas działania na uruchomionej aplikacji przykładowej mogą się nieco różnić od tych pokazanych w niniejszej części.

Użycie IntelliTrace

Tradycyjne debugery pokazują stan aplikacji w bieżącym momencie, zapewniając ograniczone informacje na temat zdarzeń, jakie miały miejsce w przeszłości. Podczas debugowania należy wywnioskować zdarzenia, jakie zaszły w przeszłości, w oparciu o bieżący stan aplikacji, lub ponownie uruchomić aplikację i próbować odtworzyć minione zdarzenia. Jeśli, na przykład, przeglądacie stos wywołań, widzicie go tak, jak wygląda w bieżącym momencie. Aby zobaczyć, jak wyglądał podczas poprzedniego wywołania, należy ustawić punkt przerwania i ponownie uruchomić sesję debugowania.

W IntelliTrace masz dostęp do stosów wywołań oraz innych informacji zbieranych w różnym czasie. Możliwa jest „podróż w czasie” między różnymi minionymi zdarzeniami. Wyklucza to potrzebę ponownego uruchamiania aplikacji i ustawia punkt przerwania dla wielu problemów debugowania. W dowolnym momencie sprawdzaj stos wywołań, używaj różnych okien debugera i przeglądaj szczegóły danych debugowania.

Zbieranie informacji na temat wywołań

IntelliTrace domyślnie zbiera informacje na temat programu, gdy zachodzą niektóre kluczowe zdarzenia. Wśród takich zdarzeń IntelliTrace znajdują się wyjątki, punkty przerwania, zdarzenia .NET Framework oraz inne zdarzenia systemowe przydatne przy debugowaniu. Czasami usterka pojawia się wewnątrz kodu i nie jest bezpośrednio związana z żadnym z tych zdarzeń. W takich przypadkach warto przejrzeć historię wywołań procedur, lub funkcji wewnątrz aplikacji, w tym parametry, wartości zwrotne i położenie wywołań. IntelliTrace może zbierać te informacje mimo, że nie jest domyślnie włączony.

Aby przygotować się do niniejszego scenariusza debugowania, należy dostosować ustawienia IntelliTrace, aby zbierać zarówno zdarzenia IntelliTrace, jak i informacje na temat wywołań.

  1. W menu Tools kliknij Options.

  2. W oknie dialogowym Options otwórz węzeł IntelliTrace, a następnie kliknij General.

  3. Kliknij IntelliTrace events and call information.

  4. Kliknij OK.

Testowanie aplikacji Black Jack

  1. W niniejszym scenariuszu będziemy debugować grę karcianą blackjack. Jeśli pobraliście przykładową aplikację, powinniście ją teraz uruchomić.

    1. W Visual Studio otwórz CardGame\CardGame.sln.

    2. W menu Debug kliknij Start Debugging.

    3. W oknie Black Jack kliknij New Game.

      W oknie pojawi się stół karciany, karty do gry oraz żetony.

  2. Teraz należy rozegrać kilka rozdań blackjacka, aby przetestować aplikację. Za każdym razem, gdy następuje rozdanie, aplikacja oblicza i wyświetla całkowitą wartość kart na ręce. Chcemy sprawdzić, czy aplikacja oblicza prawidłowo całkowitą wartość, gdy partia zawiera figurę króla, królowej, lub waleta.

    1. Kliknij przycisk 50, aby postawić $50.
    2. Kliknij przycisk Deal, aby rozdać karty.
    3. Kliknij przycisk Hit, aby otrzymać kolejną kartę.
    4. Kliknij Stand, kiedy nie chcesz otrzymać kolejnej karty.
  3. Kontynuuj grę, aż dostaniesz partię z figurą. W naszym przypadku otrzymaliśmy asa, ósemkę oraz króla. Zgodnie ze standardowymi zasadami blackjacka, ta partia powinna mieć wartość 19 punktów, ale aplikacja pokazuje wartość 21 punktów.

    Przeprowadzimy teraz debugowanie tego problemu.

Przerywanie aplikacji

  1. Zlokalizuj okno IntelliTrace. W domyślnej konfiguracji okno to jest zadokowane w Solution Explorer.

  2. W oknie IntelliTrace kliknij link Break All.

Debugowanie gry karcianej przy pomocy IntelliTrace

  1. Okno IntelliTrace zapewnia dwa widoki historii działania naszej aplikacji, widok IntelliTrace Events oraz widok Calls. Najpierw sprawdź widok IntelliTrace Events. Zlokalizuj ostatnie zdarzenie Gesture, jakie miało miejsce przed przerwaniem debugera. W zależności od tego, jak karty zostały rozdane, będzie to albo kliknięcie na przycisk Deal, lub Hit. W naszym przypadku był to przycisk Hit. Ponieważ było to ostatnie zdarzenie zebrane przed przerwaniem debugera, znajduje się ono na dole listy IntelliTrace Events.

  2. Kliknij zdarzenie Gesture, aby rozwinąć wpis i zobaczyć więcej informacji:

  3. Zobacz linki do widoków powiązanych (Related Views). Kliknij link Calls View, aby zsynchronizować go do Calls View.

    W widoku Calls View, w górnej części okna IntelliTrace, pojawia się stos wywołań. Jest on zsynchronizowany do momentu podczas wykonywania aplikacji. Ponieważ korzystamy z IntelliTrace, przeglądany moment możemy przesuwać w czasie naprzód i do tyłu. Kiedy zmieniają się ramy czasowe, zmienia się również widok Calls View oraz informacje w pozostałych oknach debugera.

    Główne wywołanie aplikacji znajduje się na szczycie stosu. Bieżące wywołanie jest na samym dole. „Bieżące” oznacza bieżące dla przeglądanych ram czasowych, a nie bieżące w czasie rzeczywistym. Orientacja stosu wywołań w tym oknie jest odwrotna do konwencji używanej w oknie Call Stack, gdzie bieżąca rama znajduje się na samej górze.

    Pod bieżącym wywołaniem znajduje się wcięta lista. Zawiera ona zdarzenia IntelliTrace, które zostały zebrane dla bieżącego wywołania, jak również wywołania, które zostały wykonane z bieżącego wywołania do innych funkcji i metod.

    W widoku Calls View możesz dwukrotnie kliknąć dowolne wywołanie, aby zobaczyć moment w czasie, w którym to wywołanie było wywołaniem bieżącym. Widok Calls View oraz okna debugera uaktualniają się automatycznie.

    Możesz pojedynczo kliknąć dowolne wywołanie, lub zdarzenie wcięte poniżej bieżącego wywołania. Pojedyncze kliknięcie wywołania nie powoduje, że IntelliTrace przechodzi do wywołania, ale przesuwa wskaźnik rozkazów do położenia wywołania wewnątrz wywołania bieżącego.

  4. Bezpośrednio pod zdarzeniem Gesture: Clicked "Hit" (Button) znajduje się wywołanie CardGame.BlackJackForm.HitBtn_Click(….). Kliknij je dwukrotnie.

    Widok Calls View uaktualni się i pokaże nowy kontekst. Widzicie teraz stan aplikacji w innym momencie w czasie.

  5. Okno źródłowe również dopasowało się do nowego momentu w czasie:

    W oknie źródłowym zobaczycie nowy element interfejsu użytkownika, narzędzie Navigation gutter. Przestrzeń ta, mająca kolor szary, pojawi się tylko, jeśli włączone są informacje na temat wywołań IntelliTrace. Navigation gutter zawiera ikony, których można użyć do przemieszczania się w czasie. Stepping w IntelliTrace jest podobny do steppingu w standardowym debugerze Visual Studio, jednak w kilku kluczowych kwestiach różnią się od siebie. W standardowym debugowaniu Visual Studio, znanym również, jako debugowanie na żywo, stepping występuje linijka po linijce. W IntelliTrace stepping występuje od jednego do drugiego zdarzenia IntelliTrace, lub wywołania. W debugowaniu na żywo stepping powoduje, że kod wykonywany jest w czasie rzeczywistym. W IntelliTrace widzimy zapis zdarzeń, które miały miejsce w przeszłości. Oznacza to, że poruszanie się naprzód i do tyłu w czasie, może odbywać się swobodnie.

    Kilka kolejnych kroków pokaże, jak używać narzędzia Navigation gutter do przechodzenia przez historię czasu wykonywania aplikacji.

  6. W Navigation gutter, kliknij ikonę Go to Next Call or IntelliTrace Event (F10). Możesz również użyć klawisza funkcyjnego.

    Kolejny wskaźnik rozkazów przesunie się naprzód do położenia kolejnego wywołania:

    _game.CurrentPlayer.Hit()

    Zauważ, że Go to Next Call or IntelliTrace Event (F10) przenosi nas do położenia wywołania, ale nie wchodzi w to wywołanie. Jest to równoważne z pojedynczym kliknięciem na wywołanie w widoku Calls.

  7. Kliknij ponownie Go to Next Call or IntelliTrace Event (F10).

    Kolejny wskaźnik zestawień przesunie się naprzód do kolejnego położenia wywołania:

    UpdateUIPlayerCards()

  8. Kliknij ponownie Go to Next Call or IntelliTrace Event (F10).

    Ponownie, kolejny wskaźnik zestawień przesunie się naprzód do kolejnego położenia wywołania:

    If _game.CurrentPlayer.HasBust....

  9. W tym momencie, chcesz wejść do kolejnego wywołania. Kliknij zatem ikonę Step In (F11).

    Jesteś obecnie wewnątrz Get CardGame.BlackJackGame.CurrentPlayer(). W widoku Calls widać, że Get CardGame.BlackJackGame.CurrentPlayer(). znajduje się na dole stosu wywołań.

    Wejście do wywołania przy użyciu polecenia Step In (F11) jest równoznaczne z dwukrotnym kliknięciem odpowiedniego wywołania w widoku Calls. Aby wykonać takie samo przejście, można również użyć narzędzia Navigation gutter lub widoku Calls View.

  10. Przejdź przez metodę pobierającą tę właściwość, wielokrotnie klikając Step In (F11), aż do powrotu z wywołania.

  11. Kiedy powrócisz z metody pobierającej, kliknij Step In (F11) jeszcze raz, aby wejść do CardGame.Player.HasBust.

  12. Kiedy znajdziesz się wewnątrz CardGame.Player.HasBust, kliknij Go to Next Call or IntelliTrace Event (F10).

    Doszliśmy obecnie do linijki kodu wyglądającej następująco:

    If _handProp.GetSumOfHand > 21 Then

    GetSumOfHand to funkcja, która oblicza wartość rozdania. Zatem to ona może być źródłem usterki. Wejdziemy do niej, aby sprawdzić kod.

  13. Jeszcze raz kliknij Step In (F11). Dzięki temu, mamy teraz wgląd w funkcję GetSumOfHand():

  14. Spójrz na okno Locals. Znajdują się tu wartości, będące wartościami bieżącymi, gdy wywołanie GetSumOfHand() było aktywne:

  15. Rozwiń węzeł GetSumOfHand, aby zobaczyć wartość zwrotną funkcji.

    Zauważcie, że wartość zwrotna, która reprezentuje sumę kart w rozdaniu, wynosi 21. Wiemy, że prawidłowa wartość to 19. Coś sprawia, że wartość zwrotna jest ustawiona nieprawidłowo.

    Kiedy przyjrzymy się kodowi w tej funkcji, zobaczymy wywołania c.FaceVal, c.BlackJackValueoraz ValueOfAces(). Położenia każdego z tych wywołań sprawdzamy pojedynczym kliknięciem położenia wywołania w widoku Calls View, lub poprzez użycie narzędzia Navigation gutter, w celu przejścia z jednego wywołania, do kolejnego. My użyjemy narzędziaNavigation gutter.

  16. Kliknij Go to Next Call or IntelliTrace Event (F10). Zauważ, jak zmienia się zawartość okna Locals. Klikaj Go to Next Call or IntelliTrace Event (F10), aż dojdziesz do wywołania ValueofAces:

    val += ValueofAces(val, numAces)

  17. W tym momencie, wydaje się, że kod nie oblicza prawidłowo wartości asa. Kliknij zatem Step In (F11), aby wejść w funkcję ValueofAces.

  18. Przejdź do okna Locals, lub do okna Autos i rozwiń ValueofAces:

  19. W widoku Calls kliknij Function Exit: CardGameFrameWork.BlackJackHand.ValueOfAces, a następnie sprawdź ponownie okno Locals.

    Zauważ, że wartość zwrotna nadal wynosi zero. numAces ma wartość 1. Najwyraźniej wartość zwrotna jest nieprawdziwa. Kod w ValueOfAces ustawia ją w nieprawidłowy sposób.

    Kiedy przyjrzymy się kodowi, zobaczymy dlaczego wartość zwrotna wynosi 0. Kod zawiera nieprawidłową instrukcję If.

  20. Aby naprawić tę usterkę usuń instrukcję If.

  21. Możesz już zatrzymać debugowanie i ponownie uruchomić aplikację, w celu sprawdzenia, czy wynik naprawy jest prawidłowy.

Debugowanie witryny sieci Web przy użyciu IntelliTrace: część I

W niniejszym scenariuszu nauczymy się, jak używać IntelliTrace do debugowania witryn sieci Web. Użyjemy IntelliTrace z ustawieniami domyślnymi. Przy takich ustawieniach IntelliTrace ma minimalny wpływ na wydajność aplikacji. IntelliTrace może zatem być włączony przez cały czas i być w gotowości, gdy będzie potrzebny.

Choć aplikacja sieci Web pokazana w niniejszym scenariuszu napisana jest w C#, kod jest dość prosty. Programiści Visual Basic posiadający podstawową wiedzę na temat C# nie powinni mieć kłopotów z jego zrozumieniem.

Warunki wstępne

Możecie zapoznać się z niniejszym tekstem i wyciągnąć wnioski bez instalowania przykładowej aplikacji. Jeśli wolicie zobaczyć pełny kod i przeprowadzić kroki przedstawione w niniejszym scenariuszu samodzielnie, możecie pobrać VHD zawierający Przykładową aplikację Tailspin. Próbna aplikacja Tailspin była dopracowywana w czasie pisania niniejszego scenariusza, dlatego też mogą pojawić się niewielkie różnice między pobraną aplikacją, a próbną aplikacją, jaka pojawia się w tej części.

Ponieważ IntelliTrace w Visual Studio Ultimate jest domyślnie włączony, nie ma potrzeby dostosowywania ustawień, aby ukończyć działania przedstawione w tej instrukcji. Została ona zaprojektowana dla domyślnych ustawień IntelliTrace, ale przy włączonych dodatkowych ustawieniach przeprowadzenie kroków nadal będzie możliwe.

Użycie IntelliTrace

Tradycyjne debugery pokazują stan aplikacji w bieżącym momencie, zapewniając ograniczoną ilość informacji na temat zdarzeń, które wystąpiły w przeszłości. W trakcie debugowania należy na podstawie bieżącego stanu aplikacji wywnioskować zdarzenia, które miały miejsce w przeszłości, lub ponownie uruchomić aplikację i próbować odtworzyć minione zdarzenia. Jeśli, na przykład, przeglądasz zmienne w oknie Locals, widzisz je takimi, jakie są w bieżącym momencie. Jeśli chcesz odnaleźć informacje na temat zmiennej Locals z wcześniejszego wywołania, musisz ustawić punkt przerwania na tym wywołaniu i ponownie rozpocząć sesję debugowania.

Dzięki IntelliTrace macie dostęp do informacji na temat debugowania zebranych w różnym czasie. Możliwa jest „podróż w czasie” między różnymi minionymi zdarzeniami, co wyklucza potrzebę ponownego uruchamiania aplikacji i ustawia punkt przerwania dla wielu problemów debugowania. W dowolnym momencie używaj różnych okien debugera i przeglądaj szczegóły danych debugowania

Testowanie witryny sieci Web

W niniejszym scenariuszu debugujemy prostą witrynę e-commerce o nazwie Tailspin Toys. Jeśli pobraliście Tailspin VHD, powinniście teraz zbudować aplikację i rozpocząć testowanie witryny.

  1. W Visual Studio otwórz TailspinToys.sln.

  2. W menu Debug kliknij Start Debugging.

    Pojawi się strona domowa witryny Tailspin Toys.

  3. Na stronie domowej przejdź do stopki i kliknij link About Us.

    W tym momencie, spodziewalibyście się, że pojawi się strona About. Zamiast tego, wygenerowany został wyjątek i pojawiła się strona błędu. Jest to usterka, którą zajmiemy się w niniejszym przykładzie.

    Tradycyjne debugery zapewniają ograniczone narzędzia debugowania takiego zdarzenia, jak to. Dzięki IntelliTrace można przerwać wykonywanie i przejrzeć zdarzenia, które miały miejsce, aż do tego momentu.

Przerywanie aplikacji

  1. Zlokalizuj okno IntelliTrace. W konfiguracji domyślnej, okno to jest zadokowane w Solution Explorer.

  2. W oknie IntelliTrace kliknij link Break All.

Debugowanie witryny sieci Web przy użyciu IntelliTrace

  1. Okno IntelliTrace obecnie wyświetla widok IntelliTrace Events. Pokazuje on zdarzenia IntelliTrace zebrane w tle, podczas gdy aplikacja jest debugowana. Jeśli przyjrzycie się widokowi IntelliTrace Events, zobaczycie kilka zebranych kategorii zdarzeń IntelliTrace: wyjątki, zdarzenia ASP.NET, zdarzenia ADO.NET oraz zdarzenia debugera. Te informacje są podobne do informacji zapewnionych przez takie narzędzia, jak SysInternals Filomen, lub RegMon, ale przy użyciu IntelliTrace są one obecnie dostępne w programie Visual Studio. Są tam listy rozwijane, których można użyć do filtrowania listy zdarzeń według kategorii, lub wątków oraz pole wyszukiwania, do którego można wprowadzić ciąg tekstowy.

  2. W oknie IntelliTrace zdarzenia IntelliTrace wymienione są w kolejności chronologicznej, a najświeższe zdarzenia znajdują się na samym dole. Przewiń do góry, aby zlokalizować pierwsze zdarzenie Exception. Jak widać, jest to wyjątek XML.

  3. Kliknij zdarzenie Exception Thrown. Rozwinie to zdarzenie, dzięki czemu widocznych będzie więcej szczegółów.

    Spójrzcie na linki do widoków powiązanych (Related views). Aby obejrzeć zmienne lokalne, lub stos wywołań w momencie zgłoszenia wyjątku, można kliknąć link Locals, lub Call Stack. Kliknięcie linku synchronizuje się automatycznie z oknem Locals, lub Call Stack.

  4. Kliknij link Locals.

  5. W oknie Locals rozwiń węzeł wyjątków i przyjrzyj się dostępnym informacjom:

  6. Wróć do okna IntelliTrace i kliknij węzeł zdarzeń XML: Loading Content\Xml\Ads.xml:

    Zdarzenie to pojawia się bezpośrednio przed wyjątkiem, więc jest to dość prawdopodobna przyczyna.

  7. Zwróć uwagę na linijkę mówiącą "XML Document loaded from file: Content\Xml\Ads.xml" . Kliknij link Content\Xml\Ads.xml.

    Jeśli to możliwe, Visual Studio otwiera plik Ads.xml. W przeciwnym razie pojawia się okno dialogowe File Open.

  8. Użyj okna dialogowego File Open, aby zlokalizować i otworzyć plik Ads.xml.

  9. Spójrz na kod XML. Zwróć uwagę na następującą linijkę: <NavigateUrl>https://localhost/test.aspx?a=2&b=1</ NavigateUrl>

    "b" in "b=1" podkreślone jest czerwoną falistą linią. Takie zaznaczenie wskazuje nieprawidłowy kod XML.

  10. Aby naprawić tę usterkę, usuń &b=1.

  11. Możesz teraz ponownie uruchomić aplikację sieci Web, aby sprawdzić naprawę usterki.

Właśnie dokonaliście debugowania witryny sieci Web przy użyciu IntelliTrace. Ten przykład pokazuje, jak używać domyślnych ustawień IntelliTrace. Aby debugować bardziej złożone problemy, może wystąpić potrzeba dostosowania ustawień IntelliTrace, w celu zebrania większej liczby informacji na temat wywołań oraz zdarzeń IntelliTrace.

Debugowanie witryny sieci Web przy użyciu IntelliTrace: część II

W niniejszym scenariuszu nauczycie się, jak korzystać z zaawansowanych funkcji IntelliTrace do debugowania witryny sieci Web. Włączycie opcję IntelliTrace, w celu zebrania informacji na temat wywołania oraz zobaczycie, jak te informacje umożliwiają sprawdzenie historii wykonywania danej aplikacji sieci Web.

Podczas zbierania wywołań IntelliTrace może wpływać na wydajność programu. Z tego powodu ta opcja nie jest domyślnie włączona.

Choć aplikacja sieci Web pokazana w niniejszym scenariuszu została napisana w C#, kod jest dość prosty. Programiści Visual Basic posiadający podstawową wiedzę na temat odczytywania C# nie powinni mieć kłopotów z jego zrozumieniem.

Warunki wstępne

Możecie zapoznać się z niniejszym tekstem i wyciągnąć wnioski bez instalowania przykładowej aplikacji. Jeśli wolicie zobaczyć pełny kod i przeprowadzić kroki przedstawione w niniejszym scenariuszu samodzielnie, możecie pobrać pełny VHD zawierający Przykładową aplikację Tailspin. Próbna aplikacja Tailspin była dopracowywana w czasie pisania niniejszego scenariusza, dlatego też mogą pojawić się niewielkie różnice między pobraną aplikacją, a próbną aplikacją wykorzystaną w tej części.

Użycie IntelliTrace

Tradycyjne debugery pokazują stan aplikacji w bieżącym momencie, zapewniając ograniczone informacje na temat zdarzeń, jakie miały miejsce w przeszłości. Podczas debugowania należy wywnioskować zdarzenia, jakie zaszły w przeszłości, w oparciu o bieżący stan aplikacji, lub ponownie uruchomić aplikację i próbować odtworzyć minione zdarzenia. Jeśli, na przykład, przeglądacie stos wywołań, widzicie go tak, jak wygląda w bieżącym momencie. Aby zobaczyć, jak stos wywołań wyglądał podczas poprzedniego wywołania, należy ustawić punkt przerwania i ponownie uruchomić sesję debugowania.

W IntelliTrace masz dostęp do stosów wywołań oraz innych informacji zbieranych w różnym czasie. Możliwa jest „podróż w czasie” między różnymi minionymi zdarzeniami. Wyklucza to potrzebę ponownego uruchamiania aplikacji i ustawia punkt przerwania dla wielu problemów debugowania. W dowolnym momencie sprawdzaj stos wywołań, używaj różnych okien debugera i przeglądaj szczegóły danych debugowania.

Zbieranie informacji o wywoływaniach

  • IntelliTrace domyślnie zbiera informacje na temat programu, gdy zachodzą niektóre kluczowe zdarzenia. Wśród takich zdarzeń IntelliTrace znajdują się wyjątki, punkty przerwania, zdarzenia .NET Framework oraz inne zdarzenia systemowe przydatne przy debugowaniu. Czasami usterka pojawia się wewnątrz kodu i nie jest bezpośrednio związana z żadnym z tych zdarzeń. W takich przypadkach warto przejrzeć historię wywołań procedur, lub funkcji wewnątrz aplikacji, w tym parametry, wartości zwrotne i położenie wywołań. IntelliTrace może zbierać te informacje mimo, że nie jest domyślnie włączony.

Aby przygotować się do niniejszego scenariusza debugowania, należy dostosować ustawienia IntelliTrace, aby zbierać zarówno zdarzenia IntelliTrace, jak i informacje na temat wywołań.

  1. W menu Tools kliknij Options.

  2. W oknie dialogowym Options, otwórz węzeł IntelliTrace, a następnie kliknij General.

  3. Kliknij IntelliTrace events and call information.

  4. Kliknij OK.

Testowanie witryny sieci Web

  • W niniejszym scenariuszu debugujemy prostą witrynę e-commerce o nazwie Tailspin Toys. Jeśli pobraliście Tailspin VHD, powinniście teraz zbudować aplikację i rozpocząć testowanie witryny. Celem jest sprawdzenie, czy koszyk prawidłowo uaktualnia się, gdy dodajemy do niego kolejne produkty.
  1. W Visual Studio otwórz TailspinToys.sln.

  2. W menu Debug kliknij Start Debugging.

    Pojawi się strona domowa witryny Tailspin Toys.

  3. Na stronie domowej kliknij link Paper Airplanes.

  4. Na następnej stronie kliknij link Contoso Cloud Explorer.

  5. Na stronie Contoso Cloud Explorer kliknij Add to Cart.

    W polu Shopping Cart znajduje się jeden produkt w koszyku, a suma wynosi $50.00.

  6. Kliknij ponownie link Contoso Cloud Explorer.

  7. Kliknij ponownie Add to Cart.

    W koszyku nadal znajduje się tylko jeden produkt, a suma wciąż wynosi $50.00.

    Wózek nie uaktualnił się, gdy dodaliśmy drugi produkt Contoso Cloud Explorer. Jest to usterka, którą zajmiemy się w niniejszym scenariuszu.

Przerywanie aplikacji

  1. Zlokalizuj okno IntelliTrace. W konfiguracji domyślnej okno to jest zadokowane w Solution Explorer.

  2. W oknie IntelliTrace, kliknij link Break All.

Debugowanie witryny sieci Web przy użyciu IntelliTrace

  1. Okno IntelliTrace zapewnia dwa widoki historii wykonywania naszej aplikacji: widok IntelliTrace Events oraz widok Calls. W oknie IntelliTrace kliknij Show IntelliTrace Events.

    Witryna Tailspin Toys używa architektury Model View Controller. Dlatego też nie ma obsługi zdarzeń dla kliknięcia przycisku Add to Cart. Zamiast tego, do kontrolera zostaje wysłany komunikat POST. Komunikaty te są zbierane, jako zdarzenia IntelliTrace, dlatego można je znaleźć w widoku IntelliTrace Events. Jeśli odnaleźliście komunikat POST, możecie przejść do punktu sesji debugowania, w którym wywołana zostanie logika Add Item.

  2. W widoku IntelliTrace Events, nad listą zdarzeń IntelliTrace, znajduje się pole wyszukiwania. Wpisz w nim Post, a następnie wciśnij Enter.

    Widok IntelliTrace Events przeszukuje listę i wyświetla wyłącznie zdarzenia, które pasują do wpisanego przez nas ciągu.

  3. Aby zobaczyć więcej informacji na temat zdarzenia, kliknij pierwsze zdarzenie POST:

  4. Odznacz pole wyboru, aby ponownie wyświetlić wszystkie zdarzenia:

  5. Kliknij drugie zdarzenie POST. Jest to instancja, po której pojawiła się nieprawidłowa wartość. Zatem właśnie tej instancji należ się przyjrzeć.

  6. Pod zdarzeniem POST kliknij link Calls View.

    Okno IntelliTrace przełączy się do widoku Calls.

    W widoku Calls View, w górnej części okna IntelliTrace, pojawia się stos wywołań. Jest on zsynchronizowany do momentu w czasie wykonywania aplikacji. Podczas korzystania z IntelliTrace widoczny moment możemy przesuwać w czasie naprzód i do tyłu. Kiedy zmieniają się ramy czasowe, zmienia się również widok Calls View oraz informacje w pozostałych oknach debugera.

    Główne wywołanie aplikacji znajduje się na szczycie stosu. Bieżące wywołanie jest na samym dole. „Bieżące” oznacza bieżące dla przeglądanych ram czasowych, a nie bieżące w czasie rzeczywistym. Orientacja stosu wywołań w tym oknie jest odwrotna do konwencji używanej w oknie Call Stack, gdzie bieżąca rama znajduje się na samej górze.

    Pod bieżącym wywołaniem znajduje się wcięta lista. Zawiera ona zdarzenia IntelliTrace, które zostały zebrane dla bieżącego wywołania, jak również wywołania, które zostały wykonane z bieżącego wywołania do innych funkcji i metod.

    W widoku Calls View możesz dwukrotnie kliknąć dowolne wywołanie, aby zobaczyć moment, w którym to wywołanie było wywołaniem bieżącym. Widok Calls View oraz okna debugera uaktualniają się automatycznie.

    Możesz pojedynczo kliknąć dowolne wywołanie, lub zdarzenie wcięte poniżej bieżącego wywołania. Pojedyncze kliknięcie wywołania nie powoduje, że IntelliTrace przechodzi do niego, ale przesuwa wskaźnik rozkazów do położenia wywołania wewnątrz wywołania bieżącego.

  7. Widoku Calls View użyjesz do przejrzenia kodu Add Item. Dwukrotnie kliknij Function Entry: Tailspin.Web.App.Controllers.CartController.AddItem:

  8. Dwukrotnie kliknij Tailspin.Model.ShoppingCart.AddItem(Tailspin.Model.Product product={Tailspin.Model.Product})

    Jesteś wewnątrz Tailspin.Model.ShoppingCart.AddItem(Tailspin.Model.Product product={Tailspin.Model.Product})call:

  9. Dwukrotnie kliknij Tailspin.Model.ShoppingCart.AddItem(Tailspin.Model.Product product={Tailspin.Model.Product},int quantity =1)

    Jesteś wewnątrz Tailspin.Model.ShoppingCart.AddItem(Tailspin.Model.Product product={Tailspin.Model.Product},int quantity =1)call:

  10. Dwukrotnie kliknij Tailspin.Model.ShoppingCart.AddItem(Tailspin.Model.Product product={Tailspin.Model.Product},int quantity =1,System.DateTimeAdded=3/10/2010 8:45:47 PM)

    Jesteś wewnątrz Tailspin.Model.ShoppingCart.AddItem(Tailspin.Model.Product product={Tailspin.Model.Product},int quantity =1,System.DateTimeAdded=3/10/2010 8:45:47 PM)call:

    Za każdym razem, gdy wchodzisz w nowe wywołanie, widok Calls View się uaktualnia. Informacje na temat debugowania, przedstawione w oknach debugera również się uaktualniają.

  11. Teraz sprawdź okno Locals:

  12. W oknie Locals rozwiń węzeł funkcji AddItem:

    Widzisz, że ilością dodaną jest 1.

  13. Następnie sprawdź okno kodu źródłowego:

    Narzędzie Navigation gutter zapewnia jeszcze jeden sposób nawigowania w sesji debugowania. Ta szara przestrzeń pojawia się tylko, gdy włączone są informacje na temat wywołań IntelliTrace. Narzędzie Navigation gutter zawiera ikony, których można użyć do przesuwania w czasie naprzód i do tyłu. Stepping w IntelliTrace jest podobny do steppingu w standardowym debugerze Visual Studio, jednak w kilku kluczowych kwestiach różnią się od siebie. W standardowym debugowaniu Visual Studio, znanym również, jako debugowanie na żywo, stepping występuje linijka po linijce. W IntelliTrace stepping występuje od jednego do drugiego zdarzenia IntelliTrace, lub wywołania. W debugowaniu na żywostepping powoduje, że kod wykonywany jest w czasie rzeczywistym. W IntelliTrace widzimy zapis zdarzeń, które miały miejsce w przeszłości. Oznacza to, że poruszanie się naprzód i do tyłu w czasie, może odbywać się swobodnie.

    Kilka kolejnych kroków pokaże, jak używać narzędzia Navigation gutter do przechodzenia przez historię czasu wykonywania aplikacji.

  14. Kliknij ikonę Go to Next Call or IntelliTrace Event (F10).

  15. Ponownie kliknij ikonę Go to Next Call or IntelliTrace Event (F10).

  16. Ponownie przyjrzyj się oknu Locals.

  17. Rozwiń węzeł AdjustQuantity:

    Zwróć uwagę, że newQuantity nadal ma wartość 1. Wartość ta powinna wynosić 2, więc kod, który ją ustawia jest źródłem usterki.

  18. Aby naprawić usterkę, zatrzymaj debugowanie i zmień tę linijkę kodu:

    AdjustQuantity(product, item.Quantity + quantity);

    na tę:

    AdjustQuantity(product, item.Quantity);