仅我的代码

使用 .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) 文件和程序优化。

  1. 如果二进制文件从一个打开 Visual Studio 项目进行编译,始终被视为用户代码。

  2. 调试器确定代码非用户代码,在二进制文件优化时,或者当 .pdb 文件不可用时。

此外还有三个特性影响调试器确定是否为"我的代码:

其他代码视为用户代码。

单步执行行为

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

必需。 这些值区分大小写。

  • NoStepInto– 告诉调试器来但不执行匹配函数。

  • StepInto– 告诉调试器来但不进入匹配函数,为匹配函数冲在其它NoStepInto。

自定义调用堆栈行为

定义模型,源文件和函数在*.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导根文件夹项目中。

此类别排序执行:

  1. 默认值类

  2. 在%VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json文件中分类。

  3. 在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或者文件字符串能包括一个或者多个*字符,相对应匹配零个或者更多的字符串。 *等效于 正则表达式.*。