Visual Studio 2015 Update3 的C++ 编辑并继续

[原文发表地址] C++ Edit and Continue in Visual Studio 2015 Update 3

[原文发表时间] 2016/7/1

我们一直在改进C++的编辑并继续(EnC)功能 自从我们在Visual Studio 2015 发布它之后,EnC使用默认的调试引擎和VC140工具包。我们已经处理了相当多的客户反馈,同时在此基础上,我会在这篇博客中介绍 Update3(下载)和其它有关C++ EnC的最新进展。

快速回顾一下——编辑并继续允许您在调试的时候修改您的代码(举个例子,如果在运行的时候你在代码里发现了一个bug),调试器可以在调试的进程中应用代码的更改,并可以继续使用您的新代码进行调试!这可以帮助加快您的编辑->生成->部署->调试周期。您可以在我们之前的博客里找到更多的信息,同时在这里也有介绍如何使用C++的编辑并继续。

我们在Update3的修复

  • 在静态库中旧代码 (错误信息)的EnC: 在静态库中对源文件进行编辑会导致源信息的不匹配以及旧代码会有一个误导的“成功应用代码改变”的消息。目前这个问题已被修复,现在任何旧代码在任何情况下都应该包含一个关于为什么我们不能映射指令指针的警告说明。
  • 在一些比较大的项目中, EnC崩溃/卡住时带有链接/DEBUG:FASTLINK调试信息: 自从链接开关FASTLINK泄露某些信息在obj文件中,而不是整合所有的信息到PDB中后,在运行大程序的时候VS会遇到和EnC有关的内存问题,目前已经解决了这个问题。
  • C1092错误/C4656警告:我们已经修复了很多臭名昭著的有关于“严重错误 C1092:编辑并继续不支持对数据类型的修改;需要重新生成”的不相关更改的错误。同时,如果你使用/WX(把所有的警告都视为错误)生成,编译器在EnC的时候这些会导致编译错误的误报,也不会发出“警告C4656:…数据类型是新的或已从最新的版本上更改,或者在其他地方被定义的不同”
  • 在EnC上提高“应用代码更改…”的性能: 我们已经减少了应用代码更改的时间(即:当你看到“应用代码更改…”的对话框时),并且让它快了3倍。

Update3的断点改变

  • 允许预编译(只在本地):调试选项调试->选项->常规->允许预编译(只在本地)不再支持Visual Studio Update3和默认调试器。对边际性能的改进是之前的设置,没有功能上的影响。

快速EnC参考

C++编辑并继续的需求

  • 生成设置(程序属性)
  1. C/C++->常规->调试信息格式:编辑并继续程序数据库(/ZI)
  2. C/C++->代码生成->启用最小重新生成:是的(/Gm)
  3. 链接器->常规->启用增量连接:是的(/增长的)

任何不兼容的链接器设置(例如/SAFESEH, 或者 /OPT:…)在生成时的都应该导致LNK4075警告(举个例子,由于‘/OPT:ICF’规范而忽略‘/EDITANDCONTINUE’

  • 调试设置(调试->选项->常规)
  1. 启用本地调试并继续

在“编辑并继续”中,任何不兼容的编译器或者链接器都会导致一个错误(举个例子,“‘file.cpp’在‘MyApp.dll’中链接的时候并没有启用“编辑并继续”。确保启用了增量链接,而且,//EDITANDCONTINUE指令是不容忽视的。”)

不兼容的设置和不支持的情况

  • 调试器设置(调试->选项->常规):
  1. “要求源文件与原始版本完全匹配:在修改方法时,不选此选项会导致在EnC之后不正确的断点绑定,同时,随着更新3应用此选项的更改,会导致错误“‘要求源文件精确匹配原始版本’在调试选项>选项>中的“设置”需要启用编辑并继续。请检查此选项,然后再试一次。”
  2.   “允许预编译(仅限本机)“:在Visual Studio 2015中,默认调试器不再支持这个选项。
  • Windows 8/8.1 应用商城:这些程序使用VC 120的工具包和C / C++ / bigobj开关。EnC和/bigobj 只支持VC140工具包。
  • 改变lambdas 传递 std::function: 这会导致一个误报的ODR违规,产生C1092警告。
  • 使用一个自定义的编译器(cl.exe)路径: 出于安全原因,在EnC的文件重新编译时,Visual Studio会始终使用已安装的编译器。如果您使用的是自定义的编译路径(例如在你的 *.props文件中通过一个自定义的$(executablepath)变量时),会显示一个警告,同时VS会返回到使用相同版本/架构的安装的编译器。
  • FASTBuild生成系统: 目前FASTBuild不兼容“启用最小重生成”编译器,所以不支持编辑并继续。
  •  架构/VC 工具包: 有了VC 140的工具包,默认调试引擎对X86和X64的C++程序支持编辑并继续(EnC)功能。传统的工具只支持X86应用。比VC120更早的工具包应该通过检验调试>选项>常规>使用原生的兼容性模式来使用传统的调试器,以便来使用编辑并继续。

日志

我们收到的一个常见的问题是有关于如果用户遇到了EnC启用日志的问题。为了帮助判断EnC问题,你可以设置以下DWORD注册表值:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0_Config\Debugger\NativeEncDiagnosticLoggingLevel = 1

设置这个值(在调试会话开始)可以令EnC的多个组件在输入->调试窗口输出详细的日志信息。

总结

我们很期待您的任何关于编辑并继续的反馈——联系我们,<你可以通过vsdbgfb@microsoft.com>邮箱, 在下面添加评论,或者通过Visual Studio的发送反馈功能 或通过Twitter。。