如果您有在visualstudio中调试C#或visualbasic代码的经验,您可能熟悉一种称为justmycode(JMC)的调试特性。 在VisualStudio 2013中,我们只介绍C++的代码。 在VS2013中,这个C++的JMC功能的目标是帮助用户在查看调用堆栈时关注代码,而不会丢失库代码、Windows代码等。
用户体验
在查看调用堆栈时,调试器会将所有非用户代码的连续帧折叠为标记为[External code]的带注释帧。 有一个例外,如果应用程序在非用户代码中停止,那么调用堆栈顶部的外部代码将显示出来。
让我们从最基本的例子开始。 如果在Visual Studio 2012中(或在关闭JMC的VS2013中)创建新的Win32控制台应用程序并在第一行设置断点,则将获得以下调用堆栈:
对于大多数用户来说,只有顶部框架才是真正有趣的部分。 Just My Code功能将调用堆栈简化为:
只是我的代码不仅适用于调用堆栈窗口,而且适用于显示调用堆栈的任何地方。 例如,您可以在“线程”窗口中获得这些相同的好处:
或在“并行堆栈”窗口中:
JMC在有大量库代码使您很难找到自己的代码的情况下非常有用。 在调试Windos商店应用程序时,请考虑以下示例。 调用堆栈是如此的笨拙,以至于你看不到你所关心的用户代码,即使你取消停靠调用堆栈窗口并将其扩展到接近最大的大小。
只需我的代码就可以更简单地找到您的代码,以便您可以导航到它。
关闭和打开JMC
如果确实要查看外部代码,可以使用“调用堆栈”窗口中的上下文菜单在显示和隐藏外部代码之间切换。
关闭此选项后,“仅我的代码”将以浅灰色显示外部调用堆栈帧。
如果要完全关闭“仅我的代码”,可以在“工具”->“选项”中更改设置。
自定义非用户代码
虽然JMC有一个开箱即用的默认体验,但是如果您选择的话,您可以根据自己的喜好进一步定制它。 非用户代码在xml文件中定义,扩展名为.natjmc,位于两个位置之一。
%%VSINSTALLDIR%%Common7PackagesDebuggerVisualizers调试工具
%%USERPROFILE%%My Documents Visual Studio 2012可视化工具
这些位置与处理本机可视化工具时使用的位置相同( natvis文件 ). 默认设置在%%VSINSTALLDIR%%Common7PackagesDebuggerVisualizersdefault.natjmc中,并提供了一个完整的示例,说明如何将代码定义为非用户。
如您所见,您可以在三个不同的级别上将代码定义为非用户:
-
按模块
-
按文件
-
按功能
名称匹配允许使用*和?因此,只需添加一行xml,就可以充分涵盖很多情况。 对于模块,还可以包含公司名称,该名称将与生成文件时包含的公司名称相匹配。 例如,如果system32中的模块来自Microsoft,那么下面一行将它们定义为非用户代码。 但是,如果您将自己的代码安装到该目录中,它仍将被视为用户代码。
< 模块 姓名 = “ ?:WindowsSystem32*.dll “ 单位 = “ 微软公司 “ />
此外,对于文件和函数,可以包含模块名,使其更具体。 例如,下面的一行将在kernel32.dll中包含RaiseException作为非用户代码,但不会在不同的二进制文件中包含相同名称的函数。
< 功能 姓名 = “ 引发异常 “ 模块 = “ 内核32.dll “ 例外实施 = “ 是的 “ />
如前所述,当应用程序在代码中停止时,调试器仍将在堆栈顶部显示外部代码。 ExceptionImplementation属性将异常应用于该规则以隐藏引发异常的代码。
我们很乐意听到任何问题或意见,你在下面的评论或我们的网站 MSDN论坛 .