Debugowanie przy użyciu debugera just in time w programie Visual Studio

Debugowanie just in time może automatycznie uruchamiać program Visual Studio, gdy aplikacja działa poza błędami lub awariami programu Visual Studio. Debugowanie just in time umożliwia testowanie aplikacji poza programem Visual Studio i otwieranie programu Visual Studio w celu rozpoczęcia debugowania po wystąpieniu problemu.

Debugowanie just in time działa w przypadku aplikacji klasycznych systemu Windows. Nie działa w przypadku aplikacji uniwersalnych systemu Windows ani kodu zarządzanego hostowanego w aplikacji natywnej, takiego jak Wizualizatory.

Napiwek

Jeśli chcesz zatrzymać wyświetlanie okna dialogowego Debuger just in time, ale nie masz zainstalowanego programu Visual Studio, zobacz Wyłączanie debugera Just In Time. Jeśli po zainstalowaniu programu Visual Studio może być konieczne wyłączenie debugowania Just In Time z rejestru systemu Windows.

Włączanie lub wyłączanie debugowania just in time w programie Visual Studio

Debugowanie just in time można skonfigurować w oknie dialogowym Opcje narzędzi>programu Visual Studio (lub Opcje debugowania).>

Uwaga

Aby włączyć lub wyłączyć debugowanie just in time, musisz uruchomić program Visual Studio jako administrator. Włączenie lub wyłączenie debugowania Just In Time powoduje ustawienie klucza rejestru, a uprawnienia administratora mogą być wymagane do zmiany tego klucza. Aby otworzyć program Visual Studio jako administrator, kliknij prawym przyciskiem myszy aplikację Visual Studio i wybierz polecenie Uruchom jako administrator.

Aby włączyć lub wyłączyć debugowanie just in time:

  1. W menu Narzędzia lub Debugowanie wybierz pozycję Opcje>Debugowanie>just in time.

    Enable or disable JIT debugging

    Uwaga

    Jeśli opcja menu Just In Time nie jest wyświetlana, upewnij się, że debuger Just In Time jest zainstalowany przy użyciu Instalator programu Visual Studio.

  2. W polu Włącz debugowanie just in time dla tego typu kodu wybierz typy kodu, które mają być debugowanie just in time, aby debugować: Zarządzane, Natywne i/lub Skrypt.

  3. Wybierz przycisk OK.

Jeśli włączysz debuger Just In Time, ale nie zostanie otwarty, gdy aplikacja ulegnie awarii lub błędom, zobacz Rozwiązywanie problemów z debugowaniem just in time.

Wyłączanie debugowania just in time z rejestru systemu Windows

Debugowanie just in time może być nadal włączone, nawet jeśli program Visual Studio nie jest już zainstalowany na komputerze. Jeśli program Visual Studio nie jest już zainstalowany, możesz wyłączyć debugowanie just in time, edytując rejestr systemu Windows.

Aby wyłączyć debugowanie just in time, edytując rejestr:

  1. W menu Start systemu Windows uruchom Edytor rejestru (regedit.exe).

  2. W oknie Edytor rejestru znajdź i usuń następujące wpisy rejestru, jeśli istnieją:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\. NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    JIT registry key

  3. Usuń również następujące wpisy rejestru, jeśli istnieją:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\. NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    Pamiętaj, aby nie usuwać ani zmieniać żadnych innych kluczy rejestru.

  4. Zamknij okno Edytor rejestru.

Włączanie debugowania just in time formularza systemu Windows

Domyślnie aplikacje formularzy systemu Windows mają procedurę obsługi wyjątków najwyższego poziomu, która pozwala aplikacji na działanie, jeśli będzie mogła odzyskać. Jeśli aplikacja Windows Forms zgłasza nieobsługiwany wyjątek, zostanie wyświetlone następujące okno dialogowe:

Windows Form unhandled exception

Aby włączyć debugowanie just in time zamiast standardowej obsługi błędów formularza systemu Windows, dodaj następujące ustawienia:

  • W sekcji pliku machine.config lub <app name.exe.config> ustaw jitDebugging wartość na true:system.windows.forms

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
    
  • W aplikacji formularzy systemu Windows w języku C++ ustaw również wartość DebuggableAttributetrue w pliku config lub w kodzie. Jeśli kompilujesz z /Zi i bez /Og, kompilator ustawia ten atrybut za Ciebie. Jeśli chcesz debugować niezoptymalizowaną kompilację wydania, musisz jednak ustawićDebuggableAttribute, dodając następujący wiersz w pliku AssemblyInfo.cpp aplikacji:

    [assembly:System::Diagnostics::DebuggableAttribute(true, true)];
    

    W celu uzyskania więcej informacji, zobacz następujący temat: DebuggableAttribute.

Używanie debugowania just in time

W tym przykładzie przedstawiono debugowanie typu Just In Time, gdy aplikacja zgłasza błąd.

  • Aby wykonać te kroki, musisz mieć zainstalowany program Visual Studio. Jeśli nie masz programu Visual Studio, możesz pobrać bezpłatną wersję Visual Studio Community Edition.

  • Upewnij się, że debugowanie just in time jest włączone w obszarze Narzędzia>Opcje>debugowania>just in time.

W tym przykładzie utworzysz aplikację konsolową języka C# w programie Visual Studio, która zgłasza wyjątek NullReferenceException.

  1. W programie Visual Studio utwórz aplikację konsolową języka C# (Plik>nowy>projekt>Visual C#>Aplikacja konsolowa) o nazwie ThrowsNullException. Aby uzyskać więcej informacji na temat tworzenia projektów w programie Visual Studio, zobacz Przewodnik: tworzenie prostej aplikacji.

  2. Po otwarciu projektu w programie Visual Studio otwórz plik Program.cs . Zastąp metodę Main(następującym kodem, który wyświetla wiersz w konsoli, a następnie zgłasza wyjątek NullReferenceException:

    static void Main(string[] args)
    {
        Console.WriteLine("we will now throw a NullReferenceException");
        throw new NullReferenceException("this is the exception thrown by the console app");
    }
    
  3. Aby skompilować rozwiązanie, wybierz konfigurację debugowania (domyślne) lub wydania, a następnie wybierz pozycję Kompiluj>ponownie rozwiązanie.

    Uwaga

    • Wybierz pozycję Konfiguracja debugowania , aby uzyskać pełne środowisko debugowania.
    • Jeśli wybierzesz pozycję Konfiguracja wydania , musisz wyłączyć opcję Tylko mój kod , aby ta procedura działała. W obszarze Narzędzia>Opcje>debugowania usuń zaznaczenie pozycji Włącz tylko mój kod.

    Aby uzyskać więcej informacji na temat konfiguracji kompilacji, zobacz Opis konfiguracji kompilacji.

  4. Otwórz utworzoną aplikację ThrowsNullException.exe w folderze projektu C# (...\ThrowsNullException\ThrowsNullException\bin\Debug lub ...\ThrowsNullException\ThrowsNullException\bin\Release).

    Powinno zostać wyświetlone następujące okno polecenia:

    Screenshot of the console for ThrowsNullException.exe, which throws an unhandled null reference exception (System.NullReferenceException).

  5. Zostanie otwarte okno dialogowe Wybieranie debugera just in time.

    Screenshot of the Choose Just-In-Time Debugger dialog box, which appears after the exception appears in the ThrowsNullException.exe console window.

    W obszarze Dostępne debugery wybierz pozycję Nowe wystąpienie preferowanej <wersji/edycji> programu Visual Studio, jeśli nie została jeszcze wybrana.

  6. Wybierz przycisk OK.

    Projekt ThrowsNullException zostanie otwarty w nowym wystąpieniu programu Visual Studio, a wykonanie zatrzymane w wierszu, w którym wystąpił wyjątek:

    Screenshot of the ThrowsNullException project in Visual Studio, with highlighting of the line of source code that threw the exception.

W tym momencie możesz rozpocząć debugowanie. Jeśli debugujesz rzeczywistą aplikację, musisz dowiedzieć się, dlaczego kod zgłasza wyjątek.

Uwaga

Jeśli aplikacja zawiera niezaufany kod, zostanie wyświetlone okno dialogowe ostrzeżenia o zabezpieczeniach, które umożliwia podjęcie decyzji, czy kontynuować debugowanie. Przed kontynuowanym debugowaniem zdecyduj, czy kod jest zaufany. Czy samodzielnie napisałeś kod? Jeśli aplikacja jest uruchomiona na maszynie zdalnej, czy rozpoznasz nazwę procesu? Jeśli aplikacja działa lokalnie, rozważ możliwość uruchomienia złośliwego kodu na komputerze. Jeśli zdecydujesz, że kod jest godny zaufania, wybierz przycisk OK. W przeciwnym razie wybierz pozycję Anuluj.

Rozwiązywanie problemów z debugowaniem just in time

Jeśli debugowanie just in time nie zostanie uruchomione, gdy aplikacja ulegnie awarii, mimo że jest ona włączona w programie Visual Studio:

  • Znany problem z systemem Windows może powodować niepowodzenie debugera Just In Time.

    Poprawka polega na dodaniu wartości DWORD automatycznej z danymiwartości 1 do następujących kluczy rejestru:

    • HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

    • (W przypadku maszyn 32-bitowych) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

  • Raportowanie błędów systemu Windows może przejąć obsługę błędów na komputerze.

    Aby rozwiązać ten problem, użyj Edytora rejestru, aby dodać wartośćDWORD wyłączone z wartością1 do następujących kluczy rejestru:

    • HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Raportowanie błędów systemu Windows

    • (W przypadku maszyn 32-bitowych) HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Raportowanie błędów systemu Windows

    Aby uzyskać więcej informacji, zobacz . Ustawienia usługi WER.

Podczas debugowania just in time mogą zostać wyświetlone następujące komunikaty o błędach:

  • Nie można dołączyć do procesu awarii. Określony program nie jest programem systemu Windows ani MS-DOS.

    Debuger próbował dołączyć do procesu uruchomionego pod innym użytkownikiem.

    Aby obejść ten problem, w programie Visual Studio otwórz pozycję Dołącz debugowanie>do procesu (lub naciśnij klawisze Ctrl + Alt + P) i znajdź proces, który chcesz debugować na liście Dostępne procesy. Jeśli nie znasz nazwy procesu, znajdź identyfikator procesu w oknie dialogowym Debuger just in time programu Visual Studio. Wybierz proces z listy Dostępne procesy i wybierz pozycję Dołącz. Wybierz pozycję Nie , aby zamknąć okno dialogowe debugera Just In Time.

  • Nie można uruchomić debugera, ponieważ żaden użytkownik nie jest zalogowany.

    Nie ma zalogowanego użytkownika do konsoli, więc nie ma sesji użytkownika do wyświetlenia okna dialogowego debugowania Just In Time.

    Aby rozwiązać ten problem, zaloguj się na maszynie.

  • Klasa nie została zarejestrowana.

    Debuger próbował utworzyć klasę COM, która nie jest zarejestrowana, prawdopodobnie z powodu problemu z instalacją.

    Aby rozwiązać ten problem, użyj Instalator programu Visual Studio, aby ponownie zainstalować lub naprawić instalację programu Visual Studio.