訓練
模組
使用內建及 Visual Studio Code 偵錯工具,對 Node.js JavaScript 應用程式進行互動式偵錯 - Training
了解如何使用 Visual Studio Code 有效率地對 Node.js JavaScript CommonJS 應用程式進行偵錯,以快速修正錯誤 (Bug)。 使用 Visual Studio Code 內的互動式偵錯工具來分析並修正 JavaScript 應用程式。
Just My Code 是 Visual Studio 偵錯功能,其會自動逐步執行對系統、架構和其他非使用者程式碼的呼叫。 在 [呼叫堆疊] 視窗中,Just My Code 會將這些呼叫摺疊成 [外部程式碼] 框架。
Just My Code 在 .NET 和 C++ 專案中會以不同的方式運作。
針對大部分的程式設計語言,預設會啟用 Just My Code。
備註
[啟用 Just My Code] 是全域設定,適用於所有語言的所有 Visual Studio 專案。
在偵錯工作階段期間,[模組] 視窗會顯示偵錯工具將哪些程式碼模組視為 My Code (使用者程式碼),以及其符號載入狀態。 如需詳細資訊,請參閱更熟悉偵錯工具附加至您應用程式的方式。
在 [呼叫堆疊] 或 [工作] 視窗中,Just My Code 會將非使用者程式碼摺疊成標記為 [External Code]
的標註程式碼框架 (呈現灰色)。
提示
若要開啟 [模組]、[呼叫堆疊]、[工作],或其他大部分偵錯視窗,您必須在偵錯工作階段中。 偵錯時,在 [偵錯]>[視窗] 底下,選取您要開啟的視窗。
若要在摺疊的 [外部程式碼] 框架中檢視程式碼,請以滑鼠右鍵按一下 [呼叫堆疊] 或 [工作] 視窗,然後從捷徑功能表中選取 [顯示外部程式碼]。 展開的外部程式碼行會取代 [外部程式碼] 框架。
備註
[顯示外部程式碼] 是目前使用者分析工具設定,適用於所有語言中使用者開啟的所專案。
按兩下 [呼叫堆疊] 視窗中展開的外部程式碼行,即會以綠色醒目提示原始程式碼中的呼叫程式碼行。 對於找不到或未載入的 DLL 或其他模組,[找不到符號或來源] 頁面可能會開啟。
從 Visual Studio 2022 17.7 版開始,您可以在 Call Stack 視窗中按兩下外部程式碼,自動反編譯 .NET 程式碼。 如需詳細資訊,請參閱偵錯時從 .NET 元件產生原始程式碼。
在 .NET 專案中,Just My Code 會使用符號 (.pdb) 檔案和程式最佳化,來分類使用者與非使用者程式碼。 .NET 偵錯工具會將最佳化的二進位檔和非載入的 .pdb 檔案視為非使用者程式碼。
三個編譯器屬性也會影響 .NET 偵錯工具視為使用者程式碼的內容:
.NET 偵錯工具會將所有其他程式碼視為使用者程式碼。
在 .NET 偵錯期間:
如果沒有更多的使用者程式碼,偵錯會繼續進行直到其結束、叫用另一個中斷點,或擲回錯誤。
如果偵錯工具在非使用者程式碼內中斷 (例如,您使用 [偵錯]>[全部中斷],並在非使用者程式碼中暫停),則 [沒有來源] 視窗會出現。 然後,您可以使用 [偵錯]>[步驟] 命令,移至使用者程式碼的下一行。
如果未處理的例外狀況發生在非使用者程式碼中,偵錯工具就會在產生例外狀況的使用者程式碼行中斷。
如果針對例外狀況啟用第一個可能發生的例外狀況,則會在原始程式碼中以綠色醒目提示呼叫使用者程式碼行。 [呼叫堆疊] 視窗會顯示標記為 [外部程式碼] 的標註框架。
從 Visual Studio 2017 15.8 版開始,也支援 Just My Code for code 逐步執行。 此功能也需要使用 /JMC (Just My Code 偵錯) 編譯器參數。 預設會在 C++ 專案中啟用此參數。 對於 Call Stack 視窗和 Just My Code 中的呼叫堆疊支援,不需要 /JMC 切換。
若要分類為使用者程式代碼,調試程式必須載入包含使用者程式代碼之二進位檔的 PDB(使用 [模組 ] 視窗檢查載入狀態)。
針對呼叫堆疊行為,例如在 [呼叫堆疊] 視窗中,C++ 中的 Just My Code 只會將這些函式視為「非使用者程式碼」:
針對程式碼逐步執行行為,C++ 中的 Just My Code 只會將這些函式視為「非使用者程式碼」:
備註
如需 Just My Code 中的程式碼逐步執行支援,必須使用 Visual Studio 15.8 Preview 3 或更新版本中的 MSVC 編譯器來編譯 C++ 程式碼,而且必須啟用 /JMC 編譯器參數 (預設為啟用)。 如需其他詳細資料,請參閱自訂 C++ 呼叫堆疊和程式碼逐步執行行為和這篇部落格文章。 對於使用舊版編譯器編譯的程式碼,.natstepfilter 檔案是自訂程式碼逐步執行的唯一方法,這與 Just My Code 無關。 請參閱自訂 C++ 逐步執行行為。
在 C++ 偵錯期間,預設會跳過非使用者程式碼。 在 C++ 偵錯期間:
如果沒有更多的使用者程式碼,偵錯會繼續進行直到其結束、叫用另一個中斷點,或擲回錯誤。
如果偵錯工具在非使用者程式碼內中斷 (例如,您使用 [偵錯]>[全部中斷],並在非使用者程式碼中暫停),則逐步執行會在非使用者程式碼中繼續。
如果偵錯工具叫用例外狀況,其會在例外狀況上停止,無論是在使用者程式碼中還是在非使用者程式碼中。 系統會忽略 [例外狀況] 對話方塊中的 [使用者未處理] 選項。
針對 C++ 專案,您可以指定 [呼叫堆疊] 視窗會將其視為非使用者程式碼的模組、來源檔案和函式,方法是在 *.natjmc 檔案中指定這些項目。 如果您使用最新的編譯器,此自訂也適用於程式碼步進 (請參閱 C++ Just My Code)。
.natjmc 檔案是具有下列語法的 XML 檔案:
<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">
<!-- Modules -->
<Module Name="ModuleSpec" />
<Module Name="ModuleSpec" Company="CompanyName" />
<!-- Files -->
<File Name="FileSpec"/>
<!-- Functions -->
<Function Name="FunctionSpec" />
<Function Name="FunctionSpec" Module ="ModuleSpec" />
<Function Name="FunctionSpec" Module ="ModuleSpec" ExceptionImplementation="true" />
</NonUserCode>
模組項目屬性
屬性 | 描述 |
---|---|
Name |
必要。 該模組的完整路徑。 您可以使用 Windows 萬用字元 ? (零或一個字元) 和 * (零或多個字元)。 例如,<Module Name="?:\3rdParty\UtilLibs\*" /> 會告知偵錯工具中的所有模組都視為 \3rdParty\UtilLibs 為外部程式碼的任何磁碟機上。 |
Company |
選擇性。 發行內嵌於可執行檔之模組的公司名稱。 您可以使用這個屬性使模組意義清楚。 |
檔案項目屬性
屬性 | 描述 |
---|---|
Name |
必要。 要視為外部程式碼的原始程式檔之完整路徑。 在指定路徑時,您可以使用 Windows 萬用字元 ? 和 * 。 |
Function 項目屬性
屬性 | 描述 |
---|---|
Name |
必要。 要視為外部程式碼的函式之完整名稱。 在指定路徑時,您可以使用 Windows 萬用字元 ? 和 * 。 |
Module |
選擇性。 包含此函式的模組名稱或完整路徑。 您可以使用這個屬性使具有相同名稱的函式意義清楚。 |
ExceptionImplementation |
當設定為 true 時,此呼叫堆疊會顯示擲回例外狀況的函式,而不是這個函式。 |
在 C++ 專案中,您可以指定要逐步執行的函式,方法是將這些函式列為 *.natstepfilter 檔案中的 NoStepInto 函式。 在 *.natstepfilter 檔案中列出的函式不依賴於 Just My Code 設定。 NoStepInto 函式會告知偵錯工具逐步執行函式,即使其呼叫一些 StepInto 函式或其他使用者程式碼也一樣。 不同於 .natjmc 中列出的函式,偵錯工具會逐步執行 NoStepInto 函式內使用者程式碼的第一行。
備註
某些協力廠商延伸模組可能會停用 .natstepfilter 功能。
.natstepfilter 檔案是具有下列語法的 XML 檔案:
<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
<Function>
<Name>FunctionSpec</Name>
<Action>StepAction</Action>
</Function>
<Function>
<Name>FunctionSpec</Name>
<Module>ModuleSpec</Module>
<Action>StepAction</Action>
</Function>
</StepFilter>
元素 | 描述 |
---|---|
Function |
必要。 指定一個或多個函式做為非使用者函式。 |
Name |
必要。 指定要比對的完整函式名稱之 ECMA-262 格式化規則運算式。 例如:<Name>MyNS::MyClass::.*</Name> 告知偵錯工具在 MyNS::MyClass 中的所有方法要視為非使用者程式碼。 該比對會區分大小寫。 |
Module |
選擇性。 指定包含此函式的模組之完整路徑的 ECMA-262 格式化規則運算式。 該比對不區分大小寫。 |
Action |
必要。 區分大小寫值的其中之一:NoStepInto - 告知偵錯工具逐步執行函式。StepInto - 告知偵錯工具要逐步執行函式,覆寫相符函式的任何其他 NoStepInto 。 |
從 Visual Studio 2022 17.6 版開始,您可以將 .natjmc 和 .natstepfilter 檔案直接新增至解決方案或專案。
偵錯工具的 Output 視窗中不會報告 .natstepfilter 和 .natjmc 檔案中的語法錯誤。
與 .natvis 檔案不同,.natstepfilter 和 .natjmc 檔案不會重新熱載入。 相反地,這些檔案會在偵錯工作階段即將開始時重新載入。
針對範本函式,在名稱中使用 <.*>
或 <.*
可能會有所幫助。
針對 Visual Studio 2022 中的 .esproj 專案,Visual Studio Code 會使用 launch.json 檔案來設定及自定義調試程式。 launch.json是調試程式組態檔。
Visual Studio 只會將調試程式附加至使用者程序代碼。 針對 .esproj 專案,您可以使用 launch.json 中的 設定,在 Visual Studio skipFiles
中設定使用者程式代碼 (也就是 Just My Code 設定)。 此設定的運作方式與 VS Code 中的launch.json 設定相同。 如需skipFiles的詳細資訊,請參閱略過不感興趣的程式代碼。
訓練
模組
使用內建及 Visual Studio Code 偵錯工具,對 Node.js JavaScript 應用程式進行互動式偵錯 - Training
了解如何使用 Visual Studio Code 有效率地對 Node.js JavaScript CommonJS 應用程式進行偵錯,以快速修正錯誤 (Bug)。 使用 Visual Studio Code 內的互動式偵錯工具來分析並修正 JavaScript 應用程式。
文件
偵錯時將 .NET 程式代碼分解 - Visual Studio (Windows)
在 Visual Studio 中偵錯時,從 .NET 程式集產生並內嵌原始程式碼。 擷取並檢視內嵌的原始程式碼。
一般、偵錯、選項對話框 - Visual Studio (Windows)
設定 Visual Studio 調試程式選項以符合您的偵錯需求。 您可以設定中斷行為、偵錯層級、顯示行為等等。
使用偵錯工具連結至執行中處理序 - Visual Studio (Windows)
將 Visual Studio 偵錯工具連結至本機或遠端電腦中的執行中處理序,以偵錯執行中應用程式、不是在 Visual Studio 中建立的應用程式,以及其他案例。