Just My Code
使用 .NET Framework 語言的開發人員皆熟悉Just My Code 偵錯工具功能,此功能逐步執行於系統、架構以及其他非使用者呼叫,並在呼叫堆疊視窗中摺疊這些呼叫。 在 Visual Studio 2013 中,Just My Code延伸到 JavaScript 和 C++ 語言。 本主題將說明在 .NET Framework專案、原生 C++ 專案以及 JavaScript 專案中使用 Just My Code 的細節。
內容
啟用或停用 Just My Code
.NET Framework Just My Code
C++ Just My Code
JavaScript Just My Code
啟用或停用 Just My Code
若要啟用或停用 Just My Code,請選取 [偵錯] 功能表上的 [選項和設定] 。 在 [偵錯] / [概觀] 節點中,選取或清除 [啟用 Just My Code]。
注意事項 |
---|
[啟用 Just My Code] 設定是套用至所有語言中所有 Visual Studio 專案的全域設定。 |
覆寫呼叫堆疊篩選
在呼叫堆疊上顯示,例如呼叫堆疊和工作視窗, Just My Code 將非使用者程式碼摺疊至其標記為 [External Code]標註的框架中。 若要檢視摺疊的框架,請選取呼叫堆疊顯示上內容功能表的 [顯示外部程式碼] 。
注意事項 |
---|
[顯示外部程式碼] 設定會儲存至目前使用者的分析工具。它會套用至在使用者所開啟的所有語言之專案。 |
.NET Framework Just My Code
使用者和非使用者程式碼**|逐步執行行為|中斷點行為|**例外狀況行為
使用者程式碼和非使用者程式碼
要區別使用者程式碼與非使用者程式碼, Just My Code 會查看已開啟的專案、符號 (.pdb) 檔案和程式最佳化。
如果二進位檔已建立自開啟的 Visual Studio 專案,總是會被視為使用者程式碼。
在二進位最佳化時,或當 .pdb 檔無法使用時,偵錯工具會將程式碼視為非使用者程式碼。
三個屬性也會影響偵錯工具如何判斷 My Code:
DebuggerNonUserCodeAttribute 會告知偵錯工具它所套用的程式碼並不是 My Code。
DebuggerHiddenAttribute 會對偵錯工具隱藏程式碼,即使 Just My Code 已關閉。
DebuggerStepThroughAttribute 會告知偵錯工具應逐步執行 (Step Through) 它所套用的程式碼,而非逐步執行 (Step Into) 程式碼。
其他程式碼視為使用者程式碼。
逐步執行行為。
在 [逐步執行] (鍵盤快速鍵:F11) 非使用者程式碼,偵錯工具逐步執行程式碼至下一個使用者陳述式。 在 [步驟] (鍵盤:SHIFT + F11),偵錯工具執行至下一行使用者程式碼。 使用者程式碼在應用程式結束、執行到中斷點或發生例外狀況之前,都會繼續執行。
中斷點行為
當 Just My Code 啟用時,您可以選擇 [中斷所有] (快速鍵:CTRL + ALT + Break) ,並停止在沒有要顯示的使用者程式碼的位置之執行。 發生這種情況時,來源視窗不會顯示。 如果您接著選取步驟命令,偵錯工具會將您帶到下一行使用者程式碼。
例外狀況行為。
如果未處理的例外狀況發生在非使用者程式碼,偵錯工具中斷在產生例外狀況的該行使用者程式碼。
假如第一個可能發生的例外狀況為有效例外狀況,使用者程式碼行反白顯示以綠色顯示。 呼叫堆疊會顯示標記為 [[外部程式碼]] 的附註框架。
C++ Just My Code
使用者和非使用者程式碼**|逐步執行行為|例外狀況行為|自訂的逐步執行行為|**自訂呼叫堆疊行為
使用者程式碼和非使用者程式碼
因為逐步執行行為獨立於呼叫堆疊行為, C++ Just My Code 不同於 .NET Framework 和 JavaScript Just My Code 。
呼叫堆疊
根據預設,偵錯工具在呼叫堆疊視窗會將這些函式視為非使用者程式碼:
在其符號檔中有被刪除的來源資訊之函式。
符號檔指定的位置中沒有與堆疊框架對應的原始程式檔之函式。
在%VsInstallDirectory%\Common7\Packages\Debugger\Visualizers資料夾*.natjmc檔案中所指定的函式。
逐步執行
根據預設,只有在 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 資料夾的 *.natstepfilter 檔案中被指定的函式會被視為非使用者程式碼。
您可以建立自己的 .natstepfilter 和 .natjmc 來自訂 %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers的逐步執行和呼叫堆疊視窗行為。
逐步執行行為。
從使用者程式碼到非使用者程式碼作 [逐步執行] (鍵盤快速鍵:F11)時 ,偵錯工具將逐步執行程式碼至下一行使用者程式碼。 在 [步驟] (鍵盤:SHIFT + F11),偵錯工具執行至下一行使用者程式碼。 使用者程式碼在應用程式結束、執行到中斷點或發生例外狀況之前,都會繼續執行。
如果偵錯工具在非使用者程式碼內中斷 (例如,如果有個[中斷所有命令]停止於非使用者程式碼),則在非使用者程式碼繼續逐步執行。
例外狀況行為。
當偵錯工具遇到一個例外狀況,無論是在使用者或是在非使用者程式碼,該例外狀況會停止目前的執行。 在 [例外狀況。] 對話方塊的 [使用者未處理] 索引標籤會被忽略。
自訂的逐步執行行為
您可以列出函式為 *.natstepfilter 檔案中的非使用者程式碼,來指定函式逐步執行。
若要為 Visual Studio 電腦上所有使用者指定非使用者程式碼,請將 .natstepfilter 檔案加至 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 資料夾。
若要為個別使用者指定非使用者程式碼,請將 .natstepfilter 檔案加至 %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers 資料夾。
.natstepfilter 檔案是有這個語法的 XML 檔案:
<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="https://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 |
必要項。 區分大小寫值的其中之一:
|
自訂呼叫堆疊行為
您可以在 *.natjmc 檔案指定模組、原始程式檔和函式,來指定在呼叫堆疊中視為非使用者程式碼。
若要為 Visual Studio 電腦上所有使用者指定非使用者程式碼,請將 .natjmc 檔案加至 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 資料夾。
若要為個別使用者指定非使用者程式碼,請將 .natjmc 檔案加至 %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers 資料夾。
.natjmc 檔案是有這個語法的 XML 檔案:
<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="https://schemas.microsoft.com/vstudio/debugger/jmc/2013">
<!-- 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 萬用字元 ? 和 * 。 |
功能元件屬性
屬性 |
描述 |
---|---|
Name |
必要項。 視為外部程式碼的函式之完整名稱。 |
Module |
選擇項。 包含函式的模組之名稱或完整路徑。 您可以使用這個屬性來區分具有相同名稱的函式。 |
ExceptionImplementation |
當設定為 true,呼叫堆疊會顯示擲回例外狀況的函式,而不是這個函式。 |
JavaScript Just My Code
使用者和非使用者程式碼**|逐步執行行為上的|中斷點行為|例外狀況行為|**自訂 Just My Code
使用者程式碼和非使用者程式碼
程式碼分類
JavaScript Just My Code 將程式碼分類為下列類別其中一類,來控制逐步執行和呼叫堆疊顯示:
MyCode |
您所擁有並控制的使用者程式碼。 |
LibraryCode |
來自您通常使用與應用程式所依賴以便正常運作的程式庫之非使用者程式碼 (例如 WinJS 或 jQuery)。 |
UnrelatedCode |
可在應用程式執行的非使用者程式碼,不過您不擁有之,而且您的應用程式不會直接與它正常運作 (例如,顯示廣告的廣告SDK )。 在 Windows 市集專案,從 HTTP 或 HTTPS URI載入至您的應用程式的所有程式碼也會視為 UnrelatedCode。 |
JavaScript 偵錯工具自動歸類這些程式碼類型:
藉由傳遞字串給主機所提供 eval 函式來執行的指令碼分類為 MyCode。
藉由傳遞字串給 Function 建構函式來執行的指令碼會將分類為 LibraryCode。
框架參考所包含的指令碼,例如 WinJS 或 Azure SDK,分類為 LibraryCode。
藉由傳遞字串給 setTimeout, setImmediate,或 setInterval 函式來執行的指令碼分類為 UnrelatedCode。
%VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json 為所有 Visual Studio JavaScript 專案指定其他使用者和非使用者程式碼。
您可以修改預設分類,並將名為 mycode.json .json 檔案加到專案根資料夾,來分類特定檔案和 URL 。
其他程式碼分類為 MyCode。
逐步執行行為。
如果函式不是使用者 (MyCode) 程式碼, [逐步執行] (鍵盤快速鍵:F11) 將做為 [步驟] (鍵盤:F10)。
如果步驟開始在非使用者 (LibraryCode 或 UnrelatedCode) 程式碼,則逐步執行暫時行為如同 Just My Code 未啟用的情況。 一旦您逐步執行至使用者程式碼, Just My Code 逐步執行立即重新啟用。
當執行使用者程式碼產生離開目前執行內容 (例如在事件處理常式的最後一行步驟),偵錯工具將停止於使用者程式碼下一個執行的行。 舉例癌說,如果回呼實作於 LibraryCode 程式碼,偵錯工具繼續執行,直到使用者程式碼下一行執行。
[步驟] (鍵盤:SHIFT + F11) 停止於下一行使用者程式碼。 使用者程式碼在應用程式結束、執行到中斷點或發生例外狀況之前,都會繼續執行。
中斷點行為
不論該程式碼的分類為何,設定在任何程式碼的中斷點總是會被點閱。
如果 debugger 關鍵字出現在:
LibraryCode 程式碼,偵錯工具總是在此中斷。
UnrelatedCode 程式碼,偵錯工具在此不會停止。
例外狀況行為。
假如發生未處理的例外狀況:
MyCode 或 LibraryCode 程式碼,偵錯工具總是在此中斷。
UnrelatedCode 程式碼和 MyCode 或 LibraryCode 程式碼在呼叫堆疊,偵錯工具中斷。
如果為了例外狀況對話方塊中的例外狀況來啟動第一個可能發生的例外狀況,而且在 LibraryCode 程式碼中或 UnrelatedCode 程式碼中會擲回例外狀況:
如果例外狀況已經處理,則偵錯工具不會中斷。
如果例外狀況未經處理,則偵錯工具中斷。
自訂 Just My Code
若要為單一 Visual Studio 專案分類使用者程式碼和非使用者程式碼,將名為 mycode.json 的.json 檔案加到專案根資料夾。
依這個順序執行分類:
預設分類
在 %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json 檔案的分類動作
在此專案的 mycode. json 檔案的分類動作。
每個分類步驟覆寫先前的步驟。 .json 檔案不需要列出所有索引鍵值組,因此 MyCode、 Libraries和 Unrelated 值可以是空陣列。
My Code .json 檔案中使用這種語法:
{
"Eval" : "Classification",
"Function" : "Classification",
"ScriptBlock" : "Classification",
"MyCode" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
],
"Libraries" : [
"UrlOrFileSpec”,
. .
"UrlOrFileSpec”
],
"Unrelated" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
]
}
Eval,Function和 ScriptBlock
Eval、 Function和 ScriptBlock 索引鍵值配對會判斷動態產生的程式碼如何來分類。
Eval |
藉由傳遞字串給主應用程式提供 eval 函式來執行的指令碼。 根據預設, Eval 指令碼歸類為 MyCode。 |
Function |
藉由傳遞字串給 Function 建構函式來執行的指令碼。 根據預設,函式指令碼歸類為 LibraryCode。 |
ScriptBlock |
由傳遞字串給 setTimeout函式、 setImmediate函式或 setInterval 函式,所執行的指令碼。 根據預設, ScriptBlock 指令碼歸類為 UnrelatedCode。 |
您可以將值變更為這些關鍵字之一:
MyCode 分類指令碼為 MyCode。
Library 分類指令碼為 LibraryCode。
Unrelated 分類指令碼為 UnrelatedCode。
MyCode、Libraries和Unrelated
MyCode、 Libraries和 Unrelated 三種索引鍵值配對會指定您在分類要包含的 URL 或檔案:
MyCode |
分類為 MyCode的URL陣列或檔案陣列。 |
Libraries |
分類為 LibraryCode的URL陣列或檔案陣列。 |
Unrelated |
分類為 UnrelatedCode的URL陣列或檔案陣列。 |
這個 URL 或檔案字串可以包含一或多個 * 字元,其符合零或多個字元。 * 同等於 .*規則運算式。