在Visual Studio中宣布C ++仅在我的代码中单步执行

[原文发表地址]:Announcing C++ Just My Code Stepping in Visual Studio

[原文发表时间]:2018年6月26日

[作者]:Marian Luparu [MSFT]

在Visual Studio 2017发行版15.8预览版3中,我们宣布在C ++中支持逐步执行我的代码。 除了以前支持的回调过滤之外,Visual Studio调试器现在还支持单步执行非用户代码。 当您“进入”时,例如在带有自定义谓词的标准库中的算法或具有用户回调的Win32 API,调试器将方便地进入您提供的谓词或回调 ,而不是使用的库代码。 最终将调用你的代码。

去年在CppCon 2017上宣布的在std :: function调用中的调试改进得到了非常热烈的接受后,该团队一直在为这个调试挑战开发通用解决方案,不需要在库代码中进行任何注释。 15.8预览3今天可以获得此支持,我们期待您的反馈。

如何启用逐步执行我的代码(JMC)

  • 您的程序使用新的MSVC编译器开关编译:/ JMC。 默认情况下,JMC在所有调试配置中都是MSBuild项目,因此请确保在15.8 Preview 3或更高版本的最新MSVC编译器重新编译项目
  • 调试器加载包含用户代码的二进制文件的PDB
  • 工具 >选项>调试>常规>启用我的代码(默认设置)中启用了JMC。

新的“单步执行”行为

启用JMC后,调试器将跟踪哪些代码是用户代码或系统/库代码。 当进入具有PDB信息的函数时,执行将继续进行,直到到达另一个标记为用户代码的函数或当前函数完成其执行。 这在实践中意味着,为了获得你的代码,你不必花时间逐行执行你不感兴趣的无数行库代码,更常见的是,你可以停止在你的代码库中遍布大量断点。

例如,在下面的代码片段中,如果没有JMC,如果您有足够的雄心壮志“单步执行”,直到您到达作为参数传递给标准库算法的谓词,您将必须按F11(单步执行)140次! 使用JMC,它只是一个“单步执行”命令调用。

STL算法

另一个例子是进入Win32 API回调。 如果没有JMC,调试器无法判断某些用户代码最终会执行,因此它会完全跳过Win32 API调用而不会进入用户定义的回调。 JMC正确地将回调标识为用户代码并适当地停止调试器。

Win32 API回调

单步执行到特定处

要明确地进入可能是非用户代码的调用,您可以利用编辑器上下文菜单中提供的”单步执行到特定处 命令。 这允许您选择要进入的特定功能(用户代码与否):

为其他第三方库配置仅我的代码

C ++调试器认为非用户代码的默认模块和源文件集在%VSInstallDir%\ Common7 \ Packages \ Debugger \ Visualizers下的default.natjmc文件中编码,它指定WinSDK,CRT,STL和ATL / MFC等 其他事情

您可以通过以下任一方式自定义这组模块和源文件:

  • 修改%VSInstallDir%\ Common7 \ Packages \ Debugger \ Visualizers \ default.natjmc中的中央列表或
  • 在%USERPROFILE%\ Documents \ Visual Studio 2017 \ Visualizers文件夹下创建任意数量的用户特定的.natjmc文件

例如,要将所有Boost库视为非用户代码,您可以使用以下内容在上述文件夹中创建boost.natjmc。

您无需重建用户代码即可启动这些更改。在下一个调试会话中,单步执行使用Boost的代码将跳过Boost库代码,并且只有在调用栈上找到某些用户代码时才会停止执行。

有关.natjmc文件格式的更多详细信息,请参阅仅我的代码文档页面。 请注意,.natjmc格式还支持基于函数名称将代码标记为非用户代码,但出于提高性能原因,我们不建议将此功能用于经常调用的函数或用于大型函数组的函数('函数'规则 比“模块”或“文件”规则慢得多)

第三方库

隐藏

如上所述,JMC功能仅适用于使用新MSVC编译器开关/ JMC编译的用户代码。 默认情况下,此新开关已在调试配置中用于MSBuild项目。 如果您使用的是其他构建系统,则需要确保手动将默认的/ JMC开关添加到项目的调试版本中。

/ JMC仅支持链接到CRT的二进制文件。

要显式关闭JMC,可以使用/ JMC-开关。

给我们您的反馈!

此版本是第一个支持逐步执行仅我的代码Visual Studio 2017预览版。您的反馈是确保我们提供愉快的调试体验的关键部分。 如有任何问题,请通过@visualc上的Twitter或发送电子邮件至visualcpp@microsoft.com与我们联系。 如有任何问题或建议,请通过帮助>发送反馈>在IDE中报告问题告诉我们。