在 Visual Studio 中使用 Just-In-Time 偵錯工具進行偵錯

Just-In-Time 偵錯可以在 Visual Studio 外部執行的應用程式發生錯誤或毀損時自動啟動 Visual Studio。 使用 Just-In-Time 偵錯,您可以在 Visual Studio 外部測試應用程式,並開啟 Visual Studio 以在發生問題時開始偵錯。

Just-In-Time 偵錯適用於 Windows 傳統型應用程式。 不適用於通用 Windows 應用程式,或裝載在原生應用程式的受控程式碼,例如視覺化檢視。

提示

如果您只想阻止 [Just-In-Time 偵錯工具] 對話方塊出現,但未安裝 Visual Studio,請參閱停用 Just-In-Time 偵錯工具。 如果您曾經安裝 Visual Studio,您可能需要從 Windows 登錄停用 Just-In-Time 偵錯

在 Visual Studio 中啟用或停用 Just-In-Time 偵錯

您可以從 Visual Studio 的 [工具]>[選項] (或 [偵錯]>[選項]) 對話方塊設定 Just-In-Time 偵錯。

注意

若要啟用或停用 Just-In-Time 偵錯,您必須以系統管理員身分執行 Visual Studio。 啟用或停用 Just-In-Time 偵錯會設定一個登錄機碼,而需要有系統管理員權限才能變更該機碼。 若要以系統管理員身分開啟 Visual Studio,請以滑鼠右鍵按一下 Visual Studio 應用程式,然後選擇 [以系統管理員身分執行]

啟用或停用 Just-In-Time 偵錯:

  1. 在 [工具] 或 [偵錯] 功能表上,選取 [選項]>[偵錯]>[Just-In-Time]

    Enable or disable JIT debugging

    注意

    如果未顯示 Just-In-Time 功能表選項,請確定已使用 Visual Studio 安裝程式安裝 Just-In-Time 偵錯工具。

  2. 在 [為這些類型的程式碼啟用 Just-In-Time 偵錯] 方塊中,選取您想要 Just-In-Time 偵錯功能進行偵錯的程式碼類型:受控、原生和/或指令碼

  3. 選取 [確定]。

如果您啟用 Just-In-Time 偵錯工具,但是當應用程式毀損或發生錯誤時不會開啟,請參閱 針對 Just-In-Time 偵錯進行疑難排解

從 Windows 登錄停用 Just-In-Time 偵錯

即使電腦上已沒有安裝 Visual Studio,Just-In-Time 偵錯可能仍然為啟用狀態。 如果不再安裝 Visual Studio,您可以編輯 Windows 登錄來停用 Just-In-Time 偵錯。

藉由編輯登錄來停用 Just-In-Time 偵錯:

  1. 從 Windows [開始] 功能表,執行 [登錄編輯程式] (regedit.exe)。

  2. 在 [登錄編輯程式] 視窗中,找出並刪除下列登錄項目 (若存在):

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

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

    JIT registry key

  3. 如有下列登錄項目存在,也要予以刪除:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

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

    務必不要刪除或變更任何其他登錄機碼。

  4. 關閉 [登錄編輯程式] 視窗。

啟用 Windows Form 的 Just-In-Time 偵錯

根據預設,Windows Form 應用程式有最上層例外狀況處理常式,可讓應用程式繼續執行 (若可復原)。 如果 Windows Forms 應用程式擲回未處理的例外狀況,其會顯示下列對話方塊:

Windows Form unhandled exception

若要啟用 Just-In-Time 偵錯,而不是標準 Windows Form 錯誤處理,請新增下列設定:

  • machine.config<應用程式名稱>.exe.config 檔案的 system.windows.forms 區段中,將 jitDebugging 值設定為 true

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
    
  • 在 C++ Windows Form 應用程式中,也要在 .config 檔案或您的程式碼中將 DebuggableAttribute 設定為 true。 如果您使用 /Zi 而且未使用 /Og 進行編譯,則編譯器將會設定這個屬性 (Attribute)。 不過,如果您想要偵錯非最佳化的發行組建,則必須在您應用程式的 AssemblyInfo.cpp 檔案中新增下列這一行,以設定 DebuggableAttribute

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

    如需詳細資訊,請參閱DebuggableAttribute

使用 Just-In-Time 偵錯

此範例會逐步引導您完成應用程式擲回錯誤時的 Just-In-Time 偵錯。

  • 您必須安裝 Visual Studio 才能遵循下列步驟。 如果沒有 Visual Studio,您可以下載免費的 Visual Studio Community Edition

  • 確定 Just-In-Time 偵錯已在 [工具]>[選項]>[偵錯]>[Just-In-Time]啟用

在此範例中,您會在 Visual Studio 中建立 C# 主控台應用程式,以擲回 NullReferenceException

  1. 在 Visual Studio 中,建立名為 ThrowsNullException 的 C# 主控台應用程式 ([檔案]>[新增]>[專案]>[Visual C#]>[主控台應用程式])。 如需在 Visual Studio 中建立專案的詳細資訊,請參閱逐步解說:建立簡單的應用程式

  2. 當專案在 Visual Studio 中開啟時,開啟 Program.cs 檔案。 將 Main() 方法取代為下列程式碼,其會將一行程式碼列印至主控台,然後擲回 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. 若要建置解決方案,請選擇 [偵錯] (預設值) 或 [發行] 組態,然後選取 [建置]>[重建解決方案]

    注意

    • 選擇 [偵錯] 組態,以取得完整的偵錯體驗。
    • 如果您選取 [發行] 組態,則必須關閉 [Just My Code],此程序才能運作。 在 [工具]>[選項]>[偵錯] 底下,取消選取 [啟用 Just My Code]

    如需組建組態的詳細資訊,請參閱了解組建組態

  4. 開啟 C# 專案資料夾 (...\ThrowsNullException\ThrowsNullException\bin\Debug...\ThrowsNullException\ThrowsNullException\bin\Release) 中建置的應用程式 ThrowsNullException.exe

    您應該會看到下列命令視窗:

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

  5. [選擇 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.

    在 [可用的偵錯工具] 之下,選取 [>您慣用的 Visual Studio 版本< 的新執行個體] (若尚未選取)。

  6. 選取 [確定]。

    ThrowsNullException 專案會在 Visual Studio 的新執行個體中開啟,其執行停止於擲回例外狀況的那一行:

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

此時您可以開始偵錯。 如果您正在偵錯真實的應用程式,則必須找出程式碼擲回例外狀況的原因。

警告

如果您的應用程式包含不受信任的程式碼,則會出現安全性警告對話方塊,讓您決定是否要繼續偵錯。 在繼續偵錯之前,請決定這是否為可以信任的程式碼。 這是您自行撰寫的程式碼嗎? 如果應用程式在遠端電腦上執行,您認得它的處理序名稱嗎? 如果應用程式在本機執行,請考慮在您的電腦上執行惡意程式碼的可能性。 如果您判斷程式碼值得信任,請選取 [確定]。 否則,請選取 [取消]

針對 Just-In-Time 偵錯進行疑難排解

如果 Just-In-Time 偵錯並未在應用程式毀損時開始 (即使已在 Visual Studio 中啟用):

  • 已知的 Windows 問題可能會導致 Just-In-Time 偵錯工具失敗。

    修正方法是將 將 [自動] 的 [DWORD 值] (值資料1) 新增至下列登錄機碼:

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

    • (針對 32 位元機器) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

  • Windows 錯誤報告可能會接管電腦的錯誤處理。

    若要修正此問題,請使用登錄編輯程式,將 [已停用] 的 [DWORD 值] (值資料1) 新增至下列登錄機碼:

    • HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Windows Error Reporting

    • (針對 32 位元機器) HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting

    如需詳細資訊,請參閱 .WER 設定

您可能會在 Just-in-Time 偵錯期間看見下列錯誤訊息:

  • 無法附加至沒有回應的處理序。 所指定的程式不是 Windows 或 MS-DOS 程式。

    偵錯工具嘗試連結至在另一位使用者身分之下執行的處理序。

    若要解決此問題,請在 Visual Studio 中開啟 [偵錯]>[連結至處理序] (或按 Ctrl + Alt + P),然後在 [可用的處理序] 清單中尋找您要偵錯的處理序。 如果您不知道處理序的名稱,請在 [Visual Studio Just-In-Time 偵錯工具] 對話方塊中尋找處理序識別碼。 在 [可使用的處理序] 清單中選取該處理序,然後按一下 [連結]。 選取 [無] 以關閉 Just-In-Time 偵錯工具對話方塊。

  • 由於沒有使用者登入,無法啟動偵錯工具。

    沒有任何使用者登入主控台,所以沒有使用者工作階段可顯示 [Just-In-Time 偵錯] 對話方塊。

    若要修正這個問題,請登入該電腦。

  • 類別未登錄。

    偵錯工具嘗試建立的 COM 類別尚未登錄,可能是因為安裝問題所致。

    若要修正這個問題,請使用 Visual Studio 安裝程式來重新安裝或修復 Visual Studio 安裝。