Just My Code 是 Visual Studio 偵錯功能,可自動逐步執行系統、架構和其他非使用者程式碼的呼叫。 在 [呼叫堆疊] 視窗中,[只有我的程式碼] 會將這些呼叫摺疊成 [外部程式碼] 框架。
「只有我的程式碼」在 .NET 和 C++ 專案中的運作方式不同。
啟用或停用「Just My Code 模式」
對於大多數程式語言,預設會啟用「只有我的程式碼」。
開啟 [工具] (或 [偵錯) >] 窗格,展開 [所有設定>偵錯>一般] 區段,然後選取或清除 [只啟用我的程式碼] 複選框:
開啟 [工具] (或 [偵錯) >] 對話方塊,展開 [偵錯一般>] 區段,然後選取或清除 [只啟用我的程式碼] 複選框:
在
開啟 [工具] (或 [偵錯) >] 對話方塊,展開 [偵錯一般>] 區段,然後選取或清除 [只啟用我的程式碼] 複選框:
備註
啟用 Just My Code 是全域設定,適用於所有語言的所有 Visual Studio 專案。
僅我的程式碼偵錯
在偵錯工作階段期間, [模組] 視窗會顯示偵錯工具將哪些程式碼模組視為我的程式碼 (使用者程式碼) ,以及其符號載入狀態。 如需詳細資訊,請參閱如何使偵錯工具連接到您的應用程式。
在 「呼叫堆疊 」或 「工作 」視窗中,「僅我的程式碼」會將非使用者程式碼摺疊成標記為 [External Code]的灰色註解程式碼框架。
小提示
若要開啟 模組、 呼叫堆疊、 工作或大部分其他偵錯視窗,您必須處於偵錯會話中。 偵錯時,在 [偵錯視窗]> 底下,選取您要開啟的視窗。
若要在摺疊的 [外部程式碼] 框架中檢視程式碼,請在 [呼叫堆疊 ] 或 [工作] 視窗中按一下滑鼠右鍵,然後從操作功能表中選取 [ 顯示外部程式碼 ]。 展開的外部代碼行會取代 [外部代碼] 框架。
備註
顯示外部程式碼是 目前的使用者分析工具設定,適用於使用者開啟之所有語言的所有專案。
按兩下 [呼叫堆疊] 視窗中展開的外部程式碼行,會在原始程式碼中以綠色醒目提示呼叫程式碼行。 找不到或未載入的 DLL 或其他模組時,可能會開啟未找到符號或來源的頁面。
從 Visual Studio 2022 17.7 版開始,您可以按兩下 [呼叫堆疊] 視窗中的外部程式碼,以自動反編譯 .NET 程式碼。 如需詳細資訊,請參閱 偵錯時從 .NET 元件產生原始程式碼。
.NET 只是我的程式碼
在 .NET 專案中,Just My Code 會使用符號 (.pdb) 檔案和程式最佳化來分類使用者和非使用者程式碼。 .NET 偵錯工具會將最佳化的二進位檔和未載入的 .pdb 檔案視為非使用者程式碼。
三個編譯器屬性也會影響 .NET 偵錯工具視為使用者程式碼的內容:
- DebuggerNonUserCodeAttribute 告知偵錯工具套用的程式碼不是使用者程式碼。
- DebuggerHiddenAttribute 從偵錯工具隱藏程式碼,即使關閉 [只我的程式碼] 也一樣。
- DebuggerStepThroughAttribute 告知偵錯工具逐步穿越套用的程式碼,而不是深入執行程式碼。
.NET 偵錯工具會將所有其他程式碼視為使用者程式碼。
在 .NET 偵錯期間:
- 偵錯>在非使用者程式碼中跳入(或按 F11)會跳過非使用者程式碼,直接至下一行使用者程式碼。
- 偵錯>非使用者程式碼上的 Step Out (或 Shift+F11) 會執行至下一行使用者程式碼。
如果沒有更多使用者程式碼,偵錯會繼續進行,直到偵錯結束、遇到另一個中斷點,或發生錯誤為止。
如果偵錯工具在非使用者程式碼中中斷 (例如,您使用 [全部偵錯>中斷 ] 並在非使用者程式碼中暫停) ,則會出現 [ 無來源 ] 視窗。 然後,您可以使用「調試」>步驟命令移至下一行使用者程式碼。
如果非使用者程式碼中發生未處理的例外狀況,偵錯工具會在產生例外狀況的使用者程式碼行中斷。
如果針對例外狀況啟用了第一次機會例外,則在原始程式碼中,使用者程式碼的呼叫行會醒目地標記為綠色。 [ 呼叫堆疊] 視窗會顯示標示為 [外部程式碼] 的註解框架。
C++ 只是我的程式碼
從 Visual Studio 2017 15.8 版開始,逐步執行功能也支援僅限於我的程式碼。 此功能還需要使用 /JMC(只是我的代碼調試) 編譯器開關。 C++ 專案中,此開關預設為啟用。 針對 呼叫堆疊 視窗和 Just My Code 中的呼叫堆疊支援,不需要 /JMC 開關。
若要分類為使用者程式碼,偵錯工具必須載入包含使用者程式碼之二進位檔的 PDB (使用 [模組] 視窗來檢查載入狀態) 。
針對呼叫堆疊行為,例如在 [呼叫堆疊 ] 視窗中,C++ 中的 [僅我的程式碼] 只會將下列函式視為 非使用者程式碼:
- 符號檔中具有剝離來源資訊的函式。
- 符號檔顯示該函式沒有來源檔案與堆疊幀對應。
- 在 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 資料夾中的 *.natjmc 檔案中指定的函式。
針對程式碼逐步執行行為,C++ 中的 Just My Code 只會將下列函式視為 非使用者程式碼:
- 未在偵錯工具中載入對應 PDB 檔案的函式。
- 在 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 資料夾中的 *.natjmc 檔案中指定的函式。
備註
若要在 [僅我的程式碼] 中支援程式碼逐步執行,必須使用 Visual Studio 15.8 Preview 3 或更新版本中的 MSVC 編譯器編譯 C++ 程式碼,而且必須啟用 /JMC 編譯器參數 (預設會啟用)。 如需詳細資訊,請參閱 自訂 C++ 呼叫堆疊和程式碼逐步執行行為 和此 部落格文章。 對於使用較舊編譯器編譯的程式碼, .natstepfilter 檔案是自訂程式碼逐步執行的唯一方式,這與 Just My Code 無關。 請參閱 自訂 C++ 逐步執行行為。
在 C++ 偵錯期間,預設會略過非使用者程式碼。 在 C++ 偵錯期間:
- 偵錯>Step Into(或F11)在非使用者程式碼中呼叫時會跳過程式碼或執行至下一行使用者程式碼。
- 偵錯>在非使用者程式碼上執行的 Step Out (或 Shift+F11) 會執行至下一行使用者程式碼 (在目前堆疊框架之外)。
如果沒有更多使用者程式碼,偵錯會繼續進行,直到偵錯結束、遇到另一個中斷點,或發生錯誤為止。
如果偵錯工具在非使用者程式碼中中斷時(例如,您使用 Debug>Break All 並在非使用者程式碼中暫停),則會在非使用者程式碼中繼續逐步執行。
如果偵錯工具遇到例外狀況,它會停在例外狀況上,不論是在使用者碼或非使用者碼中。 「例外狀況設定」對話方塊中使用者未處理的選項會被忽略。
自訂 C++ 呼叫堆疊和程式碼逐步執行行為
針對 C++ 專案,您可以在 *.natjmc 檔案中指定模組、原始檔案和函式,以便 呼叫堆疊 視窗將之視為非使用者程式碼。 如果您使用最新的編譯器,這項自訂也適用於程式碼逐步執行功能(請參閱 C++ Just My Code功能)。
- 若要為 Visual Studio 電腦的所有使用者指定非使用者程式碼,請將 .natjmc 檔案新增至 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 資料夾。
- 若要為個別使用者指定非使用者程式碼,請將 .natjmc 檔案新增至 %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers 資料夾。
.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>
模組元素屬性
| Attribute | Description |
|---|---|
Name |
必須的。 一或多個模組的完整路徑。 您可以使用 Windows 萬用字元 ? (零個或一個字元) 和 * (零個或多個字元)。 例如,<Module Name="?:\3rdParty\UtilLibs\*" />告知偵錯工具將任何磁碟驅動器上 \3rdParty\UtilLibs 中的所有模組視為外部程式碼。 |
Company |
選擇性。 發佈內嵌在可執行檔中的模組的公司名稱。 您可以使用此屬性來消除模組的歧義。 |
檔案元素屬性
| Attribute | Description |
|---|---|
Name |
必須的。 要將來源檔案或檔案的完整路徑視為外部程式碼。 您可以使用 Windows 萬用字元 ? , * 並在指定路徑時使用。 |
函數元素屬性
| Attribute | Description |
|---|---|
Name |
必須的。 要視為外部程式碼的函式完整名稱。 您可以在指定路徑時使用 Windows 萬用字元 ? 和 *。 |
Module |
選擇性。 包含函式之模組的名稱或完整路徑。 您可以使用此屬性來消除具有相同名稱的函數的歧義。 |
ExceptionImplementation |
設定為 true時,呼叫堆疊會顯示擲回例外狀況的函式,而不是此函式。 |
自訂 C++ 步進行為,不受 Just My Code 設定影響
在 C++ 專案中,您可以指定要逐步執行的函式,方法是將函式列為 *.natstepfilter 檔案中的 NoStepInto 函式。 *.natstepfilter 檔案中列出的函式不相依於 [只我的程式碼] 設定。 NoStepInto 函式會告知偵錯工具略過函式的執行,即便它呼叫某些 StepInto 函式或其他使用者程式碼也要略過。 不同於 .natjmc 中列出的函式,偵錯工具會逐步執行 NoStepInto 函式內的第一行使用者程式碼。
- 若要為所有本機 Visual Studio 使用者指定非使用者程式碼,請將 .natstepfilter 檔案新增至 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 資料夾。
- 若要為個別使用者指定非使用者程式碼,請將 .natstepfilter 檔案新增至 %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers 資料夾。
備註
某些非 Microsoft 延伸模組可能會停用 .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>
| 元素 | Description |
|---|---|
Function |
必須的。 將一或多個函式指定為非使用者函式。 |
Name |
必須的。 ECMA-262 格式的正規表示式,指定要比對的完整函式名稱。 例如:<Name>MyNS::MyClass::.*</Name>會告知偵錯工具中的所有 MyNS::MyClass 方法都會被視為非使用者程式碼。 匹配時會區分大小寫。 |
Module |
選擇性。 ECMA-262 格式的正則運算式,指定包含函式之模組的完整路徑。 匹配時不區分大小寫。 |
Action |
必須的。 下列區分大小寫的值之一:NoStepInto - 告知偵錯工具跳過函式執行。StepInto - 告知偵錯工具逐步執行函式,覆寫相符函式的任何其他 NoStepInto 函式。 |
有關 .natstepfilter 和 .natjmc 檔案的其他資訊
從 Visual Studio 2022 17.6 版開始,您可以將 .natjmc 和 .natstepfilter 檔案直接新增至解決方案或專案。
.natstepfilter 和 .natjmc 檔案中的語法錯誤不會在偵錯工具的 [輸出] 視窗中報告。
與 .natvis 檔案不同, .natstepfilter 和 .natjmc 檔案不會熱重新載入。 相反地,這些檔案會在偵錯工作階段開始時重新載入。
對於範本函式,名稱中使用
<.*>或<.*可能會有所幫助。
JavaScript 只是我的程式碼
針對 Visual Studio 2022 中的 .esproj 專案,Visual Studio Code 會使用 launch.json 檔案來設定和自訂偵錯工具。 launch.json 是偵錯工具組態檔。
Visual Studio 只會將偵錯工具附加至使用者程式碼。 針對 .esproj 專案,您可以使用 launch.json中的設定,在 skipFiles Visual Studio 中設定使用者程式碼 (也就是 [僅我的程式碼設定] 。 此設定的運作方式與 VS Code 中的 launch.json 設定相同。 如需 skipFiles 的詳細資訊,請參閱 略過不感興趣的程式碼。