仅我的代码
使用 .NET Framework 语言的开发人员仅熟悉单执行系统、结构和其他非用户"我的代码调试器函数调用和位于调用堆栈"窗口调用的折叠。 在 Visual Studio 2013,"仅我的代码"扩展到 C++ 和 JavaScript 语言。 本主题介绍使用"我的指定代码在 .NET Framework,本机 C++ 和 JavaScript 项目。
内容
启用或禁用“仅我的代码”调试
.NET Framework "仅我的代码"
C++“仅我的代码”
JavaScript“仅我的代码”
启用或禁用“仅我的代码”调试
启用或者禁用我的代码,在Debug菜单 选择Options and Settings。 在**“调试”**节点中/ 常规”节点,选择或清除启用”仅我的代码“。
备注
启用我的代码设置是应用到所有的Visual Studio所有语言的全局设置。
重写调用堆栈筛选
在调用堆栈显示中比如调用堆栈和堆栈窗口,仅我的代码使非用户代码转化为注释框架按钮[External Code]。 查看损坏的框架,选择调用栈显示面板的内容菜单中的Show External Code 。
备注
Show External Code设置百村到用户探查器中。它应用于在用户打开的所有语言中的所有项目。
.NET Framework "仅我的代码"
用户和非用户代码**|步骤行为|断点操作|**异常操作
用户和非用户代码
为了区分用户代码与非用户代码中,"仅我的代码"查看打开项目、符号 (.pdb) 文件和程序优化。
如果二进制文件从一个打开 Visual Studio 项目进行编译,始终被视为用户代码。
调试器确定代码非用户代码,在二进制文件优化时,或者当 .pdb 文件不可用时。
此外还有三个特性影响调试器确定是否为"我的代码:
DebuggerNonUserCodeAttribute 告诉调试器代码应用到我的代码中。
DebuggerHiddenAttribute 对调试器隐藏代码,即使“仅我的代码”关闭;
DebuggerStepThroughAttribute 告知调试器逐句通过其所应用的代码,而不是单步执行代码。
其他代码视为用户代码。
单步执行行为
在Step Into (键盘 快捷方式: F11) 非用户代码时,调试器跳到下一个用户报表。 在 点击Step Out (键盘: Shift + F11),调试器运行用户代码的下一行。 如果没有遇到用户代码,那么程序将继续执行,直至该应用程序退出未执行或者点击断电或者发生异常。
断点行为
启用“仅我的代码”后,可在**“调试”**菜单中选择“中断所有”(Keyboard: Ctrl + Alt + Break) ,在非用户代码不显示的地方停止执行。 发生这种情况时,源窗口不会显示。 如果再选择步骤命令,调试器会将您带到用户代码的下一行。
异常行为
如果未经处理的异常在非用户代码,就会发生行的调试器中断在用户代码会生成异常的那一行。
第一个异常为异常有效,用户代码行显示为绿色。 调用堆栈按钮显示框架按钮**[External Code]**。
C++“仅我的代码”
用户和非用户代码**|单步操作|异常操作|**自定义单步操作 **|**自定义操作堆栈操作
用户和非用户代码
因为单步执行行为是调用堆栈行为的独立性,C++ "仅我的代码与 .NET Framework 和 JavaScript 不同仅我的代码"
调用堆栈
默认情况下,调试器在调用堆栈窗口中考虑非用户代码的函数:
在符号文件中定义功能并剥离源信息。
函数符号表明源文件和堆栈帧不对应。
函数在%VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 文件夹中指明*.natjmc文件。
单步执行
默认情况下,只有函数指定文件夹 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers中的*.natstepfilter 文件是非用户代码。
可以创建自己的.natstepfilter 和.natjmc在%USERPROFILE%\My Documents\Visual Studio 2013\Visualizers中来自定义步骤和调用堆栈窗口操作。
单步执行行为
在Step Into (键盘 快捷方式: F11)从用户代码到非用户代码时,调试器跳到用户代码的下一行。 在 点击Step Out (键盘: Shift + F11),调试器运行用户代码的下一行。 如果没有遇到用户代码,那么程序将继续执行,直至该应用程序退出未执行或者点击断电或者发生异常。
如果在非用户代码的调试器中断 (例如,所有条件,则命令在非用户代码终止) 的中断,单步执行非用户代码继续。
异常行为
当调试器遇到异常,它在异常将终止无论是否在用户或非用户代码。 在Exceptions对话框中的User-unhandled 被忽略。
customize 单步执行行为
可以指定函数并且在*.natstepfilter文件中通过作为非用户代码来列出他们来单步执行。
为 Visual Studio平台的所有用户指定非yoghurt代码,可将 .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>
元素 |
描述 |
---|---|
功能 |
必需。 为非用户函数指定一个或多个函数作。 |
Name |
必需。 ECMA-262 格式化指定完整的函数名和正则表达式匹配。 例如: <Name>MyNS::MyClass.*</Name> 告诉调试器在MyNS::MyClass中的所有方位被认为非用户代码。 匹配区分大小写。 |
Module |
可选。 ECMA-262 格式化指定完整路径的正则表达式传递给包含该函数的模块。 匹配不区分大小写。 |
Action |
必需。 这些值区分大小写。
|
自定义调用堆栈行为
定义模型,源文件和函数在*.natjmc文件中通过定义来讲调用堆栈中德函数作为非用户函数来对待。
为 Visual Studio平台的所有用户指定非yoghurt代码,可将 .natjmc 文件添加到 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers文件夹中。
为个人用户指定非用户代码,可将natjmc文件r添加到 %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“仅我的代码”
用户和非用户代码 **|**单步操作 **|**断点操作 **|**异常操作 **|**自定义我的代码
用户和非用户代码
代码分类
JavaScript 我的代码在这些类别之一控件起始值、通过类代码调用堆栈示:
MyCode |
您拥有控件的用户代码。 |
代码库 |
从您经常使用的库和应用程序的非用户代码依赖于正常工作 (例如 WinJS 或 jQuery)。 |
UnrelatedCode |
这可以运行在应用程序的非用户代码,但是,您拥有,并且应用程序不直接依赖于其是否正常工作 (例如,该广告的 SDK 显示广告)。 在 Windows 应用仓库项目,加载到您的应用程序从 HTTP 或 HTTPS URI 也视为 UnrelatedCode 的任何代码。 |
JavaScript 调试器自动类代码中调用这些类型:
由传递字符串到主机提供的eval函数执行的脚本被分类定义为MyCode。
由传递字符串到主机提供的Function函数执行的脚本被分类定义为LibraryCode。
framework引用包括脚本,比如WinJS或者Azure SDK,作为LibraryCode分类。
由传递字符串到 setTimeout, setImmediate, 或者setInterval 函数执行的脚本被分类定义为 UnrelatedCode。
%VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json为所有的Visual Studio JavaScript 项目指定其他用户或者非用户代码。
可以修改默认分类其并且通过将由mycode.json 命名的.json文件添加到项目的根文件夹中。
所有的其它代码由 MyCode分类。
单步执行行为
假如函数不是用户 (MyCode)代码,Step Into (快捷键: F11) 将与Step Over (Keyboard: F10)效果相同。
如果在非用户(LibraryCode或者 UnrelatedCode)代码开始单步执行,那么暂时的单步执行行为将与仅我的代码一样不可用。 当您单步执行回用户代码,我代码单步执行重新启用。
当用户代码的一个步骤会离开当前执行上下文 (例如执行在事件处理程序的最后一行的步骤),则调试器停止在用户代码下执行的行。 比如,如果在LibraryCode代码段中执行回调操作,那么调试器将继续执行知道用户的下一行代码被执行。
Step Out (Keyboard: Shift + F11) 在用户的下一行代码停止执行。 如果没有遇到用户代码,那么程序将继续执行,直至该应用程序退出未执行或者点击断电或者发生异常。
断点行为
在所有代码设置无论该代码的类,的断点将被命中。
如果遇到debugger关键字:
LibraryCode 代码,调试器总是阻止。
UnrelatedCode 代码,调试器不阻止。
异常行为
如果发生了未经处理的异常:
MyCode 代码或者LibraryCode代码,调试器总是阻止。
UnrelatedCode代码,MyCode或者LibraryCode 代码调用堆栈,调试器中止。
如果机会异常对于异常对话框的异常是可用的,那么在LibraryCode or UnrelatedCode代码断异常将被抛出:
如果异常进行处理,调试器不会中断。
如果未进行处理,调试器中断。
自定义“仅我的代码”
对于单独的 Visual Studio 项目分用户和非用户代码,添加 .json文件名mycode.json导根文件夹项目中。
此类别排序执行:
默认值类
在%VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json文件中分类。
在mycode. json的当前项目文件中分类。
每个类别步骤重写上述步骤。 .json文件不需要列出所有的关键值对,并且MyCode, Libraries, and Unrelated的值不能为空的数组。
我的代码 .json 文件使用此语法:
{
"Eval" : "Classification",
"Function" : "Classification",
"ScriptBlock" : "Classification",
"MyCode" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
],
"Libraries" : [
"UrlOrFileSpec”,
. .
"UrlOrFileSpec”
],
"Unrelated" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
]
}
Eval,函数和 ScriptBlock
Eval, Function, and ScriptBlock关键值对决定了动态生成的代码如何分类。
Eval |
脚本通过将字符串传递到由主机提供的eval函数中来执行。 默认情况下,Eval脚本被分为MyCode类。 |
功能 |
脚本通过将字符串传递到Function构造函数中来执行。 默认情况下,函数脚本被分为LibraryCode类。 |
ScriptBlock |
脚本通过将字符串传递到setTimeout, setImmediate, or setInterval函数中来执行。 默认情况下,ScriptBlock 脚本被分为 UnrelatedCode类。 |
可以将值更改为这些关键字之一:
MyCode 将这些脚本分为MyCode类。
Library 将这些脚本分为LibraryCode类。
Unrelated 将这些脚本分为UnrelatedCode类。
MyCode,库和无关
MyCode, Libraries, 和 Unrelated关键值对指定了要在分类中包括的urs或者文件.
MyCode |
urls或者文件数组由MyCode分类。 |
库 |
urls或者文件数组由LibraryCode分类。 |
不相关 |
urls或者文件数组由UnrelatedCode分类。 |
url或者文件字符串能包括一个或者多个*字符,相对应匹配零个或者更多的字符串。 *等效于 正则表达式.*。