Visual Studio 2015 Update 1 对C++编辑并继续功能的改进

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

[原文发表时间]

在Visual Studio2015 RTM中,我们宣布使用VC++ 2015 工具包(v140)的默认调试引擎对X86和X64的C++程序支持编辑并继续(EnC)功能。在过去的几个月,我们一直在努力改善该功能的使用体验和支持新的配置。在这篇博客中,我会演示Visual Studio2015 Update 1中对C++ EnC所做的改进。

快速回顾一下 - 编辑并继续允许你在运行时(调试时)修改你的代码,而不需要停下来,重新编译和重新启动应用程序!举例来说,如果你正在调试,并且注意到你的代码的函数中有错误,当程序在断点处停下,你可以修改你的源文件,点击继续(GO或者步骤的命令),调试器将应用代码更改到被调试的进程并继续调试你的新代码!这可以帮助加快您的编辑>生成>部署>调试周期。请参见我们之前的2015 RTM的博客了解更多的细节

2015 Update 1 中EnC功能的改进

  • 支持Windows应用程序和DirectX应用程序(支持/ bigobj编译器开关) : Update 1中的VC ++2015工具包现在支持/ZI编译器开关(EnC开关)与/bigobj一起使用,对于Windows应用程序和DirectX应用程序,这是默认启用的。
  • 支持链接时带有 / DEBUG: FASTLINK调试信息的二进制文件:FASTLINK是一个可以加快生成时间的链接开关(留某些调试信息在obj文件中,而不是整合所有的信息到PDB文件中)。Update 1 中的VC++2015工具包现在支持在使用FASTLINK链接开关链接而成的二进制文件中使用EnC功能。
  • 在ENC期间显示可取消的等待对话框:我们现在显示等待对话框来通知用户执行的进度,保持用户界面响应,同时还支持取消。

       

  • 告知用户,如果被修改的文件不支持EnC:关于EnC易用性的一个常见的不满是,诊断*为什么*编辑会被Visual Studio忽视非常的困难。这通常是由于编译器或链接器开关与EnC不兼容(比如没有使用 /ZI编译器开关或 /INCREMENTAL链接器开关)。

在Update 1中,如果一个源文件在调试过程中被修改,但没有正确的配置(如不兼容的编译器/链接器开关),这时会显示一个错误对话框,它带有关于为什么编辑不被支持的可操作信息。
例如,如果编译源文件时使用/Zi(而不是/ ZI),现在编辑将失败,并且显示一个错误对话框和以下错误(在错误列表中或输出>生成窗口):

你可以通过在错误对话框中点击“忽略”按钮来选择忽略这些错误。

· 预留更多的内存,以便应用更多的编辑到二进制文件中:在使用EnC选项(/ZI编译开关和 /INCREMENTAL链接开关)生成的二进制文件中预留更多的内存以防止可怕的 超出模块 [模块名称] 预留的地址空间“的错误信息。随着这一变化,在被迫停下来重新编译二进制文件之前,你将能够做更多的编辑。

· 改进指令指针重新映射,以防止过时的代码警告:用户反馈表明,一些人总是得到“在函数X中无法决定新的地址来重新映射指令指针”的警告。在这里,指令指针不会被重新映射到新的(修改)的代码,而会留在旧的(未修改)的代码,这样的情况被称为“陈旧代码”(查看我们之前的2015 RTM的博客了解更多的细节)。我们已经在这方面做了一些改进,以确保我们找出正确的地址来重新映射IP,并减少以过时的程序代码而结束的机会。

· 荣誉奖 - 修正了“致命错误C1092:编辑并继续不支持更改数据类型; 需要重新生成”对于不相关的变更会出现误报的编译错误: 这是投票最多的EnC bug中的一个。

当EnC重新编译的时候,编译器将抛出警告“警告C4656:... 对于最新的版本,数据类型是新的或者已经改变,或者是在其他地方有不同的定义”,对于不相关的改变,这会导致“致命错误C1092:编辑并继续不支持更改数据类型; 需要重新生成”。使用STL的代码很容易会遇到这个错误。

这是由于一个误报的ODR违规造成的,在Update 1中我们已经解决了这个问题 – 在EnC重新编译的时候,这样的警告将不再导致一个致命错误。

总结
请在下面的评论中让我们知道您的反馈以及我们能做些什么来改善用户体验,或通过Visual Studio的发送反馈功能 或通过Twitter