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++编辑并继续的需求 生成设置(程序属性) C/C++->常规->调试信息格式:编辑并继续程序数据库(/ZI) C/C++->代码生成->启用最小重新生成:是的(/Gm) 链接器->常规->启用增量连接:是的(/增长的) 任何不兼容的链接器设置(例如/SAFESEH, 或者 /OPT:…)在生成时的都应该导致LNK4075警告(举个例子,由于‘/OPT:ICF’规范而忽略‘/EDITANDCONTINUE’) 调试设置(调试->选项->常规) 启用本地调试并继续 在“编辑并继续”中,任何不兼容的编译器或者链接器都会导致一个错误(举个例子,“‘file.cpp’在‘MyApp.dll’中链接的时候并没有启用“编辑并继续”。确保启用了增量链接,而且,//EDITANDCONTINUE指令是不容忽视的。”) 不兼容的设置和不支持的情况 调试器设置(调试->选项->常规): “要求源文件与原始版本完全匹配:在修改方法时,不选此选项会导致在EnC之后不正确的断点绑定,同时,随着更新3应用此选项的更改,会导致错误“‘要求源文件精确匹配原始版本’在调试选项>选项>中的“设置”需要启用编辑并继续。请检查此选项,然后再试一次。”  “允许预编译(仅限本机)“:在Visual Studio 2015中,默认调试器不再支持这个选项。 Windows 8/8.1 应用商城:这些程序使用VC 120的工具包和C…

0

在Android上使用Visual Studio 2015调试 C++代码

[原文发表地址]Debugging C++ code on Android with Visual Studio 2015 [原文发表时间]2014/11/12 3:32PM 现在,你将听到令人振奋的消息,Visual Studio 2015支持Android上的C++开发(包括模拟器Android版)。 显然,任何不支持调试的开发体验都是不完整的,因此这意味着Visual Studio 2015支持在调试运行在Android上的C++代码。有了这个新的调试引擎,你会得到以下调试的经验包括(但不限于): F5,输出窗口,断点,单步/跳过/输出,运行到光标,调用堆栈,数据和变量窗口,模块窗口,地址级调试(拆卸,内存,寄存器窗口),线程窗口和并行堆栈以及并行监视窗口。 下面截图显示的是Visual Studio停在一个断点处 ,这段程序是用C ++代码创建的Android应用程序。在进程窗口,你可以看到的“调试”那一列显示“本机(GDB型)”,它表示这是VisualStudio针对Android的基于GDB的调试引擎. 在Visual Studio 2015 预览版中,值得注意的是C++的调试中有以下局限: 需要Android 4.2 及以上版本进行调试(Jelly Bean—API level 17) 停止调试并没有停止应用程序(它还在运行) 此外,不支持以下调试功能: 64位进程 更改异常设置在异常窗口 十六进制整数显示 断点绑定到多个位置(例如模板,具有完全相同的名称的文件) Android线程名字没有出现在线程窗口 在调用堆栈窗口显示参数值 附加到进程 自动窗口 返回值 使用JIT’d运行时间进行互操作调试(如Java或Xamarin) 只是我的代码 编辑并继续 任务窗口(包括并行堆栈窗口中的任务查看) 请尝试调试Visual Studio新的对C ++在Android上的调试支持,如果你发现任何上面并没有列出来的问题,请让我们知道。 最后,请让我们知道调试支持是如何为你工作的,并报告任何问题或整体反馈在下面,发送一个微笑功能, 通过VisualStudio或在我们的MSDN论坛。    

0

使用Visual C++ 跨平台移动技术调试JNI Android 应用程序

[原文发表地址] Debug JNI Android Applications using Visual C++ Cross-Platform Mobile [原文发表时间] 2014/12/12  4:22PM 之前我们已经介绍了,开发人员能够在Visual Studio 2015 preview(在这里下载)中使用Visual C++创建跨平台移动应用程序。特别是对于Android平台而言,这项功能的引入使得开发人员能够创建Native-Activity 应用程序,涵盖一系列功能的动态和静态的本地应用程序,提供快速,精确,以及平滑的编辑-〉编译-〉调试开发迭代循环。本博客着重给出如何使用Visual Studio调试器去调试预编译好的,甚至是那些未曾在Visual Studio中编译过的本地android应用程序(Native Activity 和 JNI)。 调试预编译的JNI代码 为了证明这个,我们从一个预编译的JNI应用程序包文件开始。为此,本博客中我们将使用Native-Audio Android应用程序,它是Android本地开发套件(NDK)的一部分(在这里下载)。如果需要,应用程序的预编译版本和源文件已作为本博客的一部分附上。在这种情况下,这个APK文件已经由作为Android SDK Bundle一部分的 Eclipse Android集成环境编译。另外,还需注意,无论你用什么工具来编写本地代码(gcc或clang),只要你能生成APK调试信息(NDK_DEBUG=1和manifest中的android:debuggable=”true”)。就上面说的,让我们开始吧! 为了调试这个预编译的JNI Android应用程序,我们需要创建一个dummy工程,这个工程允许我们利用VS的部署引擎对预编译的APK部署并开始调试。对于这个Dummy工程,我们使用动态共享库 (Android) 模板建立。 当一个简单的动态共享库(Android)工程创建后,‘配置属性’下的调试属性页就会自动配置(如下图所示)。 用户需要填写以下信息: 要启动的包:包含.apk名字的.apk文件的路径(例如:C:\DebugAPK\NativeAudio.apk) 包名:Android 应用程序的Java包的名字,这个信息可以在‘androidmanifest.xml’文件中找到。(例如:com.example.nativeaudio)。更多信息请看以下例子的配置。 启动活动:启动活动的名字,这个信息可以在‘androidmanifest.xml’文件中找到。(例如:NativeAudio) 启动的活动(如:NativeAudio)和包名(com.example.nativeaudio)都可以从AndroidManifest.xml(如下图)获得,并作为NativeAudio NDK的一部分。   如果不能访问AndroidManifest.xml,可以通过另外一种方法在预编译的.apk文件使用aapt工具获得详细信息。Aapt可以在android-sdk中找到,构建工具目录并执行以下命令将在aapt中得到一个包含包值和活动名的xml树的结果。 aapt dump –values xmltree NativeAudio.apk AndroidManifest.xml 我们现在在调试属性页面中设置manifest详细信息并开始调试本地程序代码。在之后发布的版本中我们计划把这一过程自动化,用户无需在调试属性页面中填写这些信息。而且请注意目前我们只支持源代码本地部分的调试。为了开始调试我们需要在配置管理器中设置一些属性。   在配置管理器中进行配置,取消编译项目属性,选择部署属性。一旦选择了部署属性,按F5,之前编译好的.apk将会部署在Device/Emulator上,我们就可以模仿调试了。  …

0

加快增量开发者构建方案

[原文发表地址] VisualC++ Team Blog ->Speeding up the Incremental Developer Build Scenario [原文发表时间]2014/11/12 3:35PM 概述 Visual C++的主要关注领域之一是不断提高开发人员的生产率。牢记于此,很多的改进旨在开发者增量场景已经被引入了Visual Studio 2015 preview(下载点击这里)。增量开发者方案指的是,开发人员修改了单个或多个源文件(在修复bug的时候),再构建。这种构建方案对于Visual C ++来说大致相当于一次链接便携式可执行文件(.dll 或 .exe )花费的时间。当然正在这篇文章中讨论这种功能大多运用在链接器空间。  在链接器空间的新增功能,平均而言,我们已经看到了大约2倍提高简洁链接的情况,并增加了更多的方案,包括现在可以增量链接或增量代码生成(当使用链接时代码生成(LTCG))。下面总结了这些功能集以及如何使他们并附于下表,但如果你有兴趣了解更多关于这些功能的话,请继续沿着下面的部分阅读。    特性 描述 组态 用法 静态库的增量链接 增量连接当编辑被其他可携带执行文件调用的静态库(.dll 或者.exe) 影响所有除了LTCG启用构建 默认情况下启用时(/incremental)链接器开关。 /Debug:FastLink 调试时获得快速的链路吞吐量生成新的程序数据库(PDB)文件。 影响所有除了LTCG启用构建。 /Debug:FASTLINK(链接器开关) /Zc:inline和算法的改进 编译器不再为死代码生成符号信息。 影响所有除了LTCG启用构建。 / ZC:inline(编译器开关) 增量LTCG     (仅目标机器为x86) 当LTCG启用工作基础之上,启用增量代码生成。 仅影响LTCG建立。 / LTCG:incremental(linker switch)    …

0

VS 2014 Preview 中的本地内存诊断

[原文发表地址]Native Memory Diagnostics in VS2015 Preview [原文发表时间]2014/11/21 7:19PM 在Visual Studio 2013 Update 2 和早期发布的VisualStudio 2015, CTP, 我们发布了一个内存诊断工具, 这个工具允许开发者截取应用程序的堆快照, 然后在终止它研究堆内容。在最初发布的版本中,支持查看堆管理和本地对象。并且在第一个Visual Studio2015 update CTP中增加了支持本机类型推导和值检验。 虽然这个工具是提供VisualStudio开发者含有一个收件箱内存分析器的一个良好开端, 但是在特定的程序状态下, 它缺乏一种轻松的分析堆内容的能力。因为为了更深层的研究数据,整个程序必须关闭。 改进的内存分析器进行预览 现在在Preview上,有一个新改进的内存分析器是可用的。它允许开发人员利用调试器强大的程序流程的控制力,并且在任何破发状态可以检验他们应用程序的堆内容。这是一个很好的对新的内存分析总结经验的一个概述。一个深入的特性总结完成了指令的激活功能。(我在那里找到它?章节),  在下面的这些指令是在第一次激活这个工具。 在调试期间,简单的按下F5将会启动新的分析器。现在为了查看堆快照不需要去终止程序。 这篇文章的剩余部分将集中介绍利用本机程序的新工具和详细介绍该工具的工作流程细节。 演示:分析 a Native MFC App 要展示新的内存分析器,一个被称为FamiTracker的MFC开源芯片定序器已经被加载到Visual Studio,并且为了建立新的编译器做了简单的修改。在启动内存分析器后,在应用程序中通过注册密钥和启动调试场景利用F5,工具加载。很快内存使用情况将被显示,并且下面的堆快照也将被显示:   快照可以在不同的点及时地的捕获堆状态,例如值仅可见于最近拍照时和处于破发状态时。 在这次练习中,对于FamiTracker,初始的程序状态是初始化序列UI:                                              FamiTracker 初始化编曲界面 另一个称为编辑器工具窗口会被打开为了编辑每一个编辑器的属性:                                           FamiTracker 编辑器窗口 利用新的内存分析器,为了更好的理解应用程序的内存消耗,我们将采取堆快照跨越两种程序状态。 首先,我们截取一个基本的快照为了储存初始化的堆内容: 工具编辑框被打开,这将在代码中触发一个断点,并且在程序状态中开始了一个变化,这个函数初始化工具编辑对话框和激活其它的一些辅助功能, 这将有助于创建工具编辑器的UI。 在OnInitDialog()开始断点的位置开始截取快照, 我们看到应用程序的堆内容之前,工具编辑器对话框启动分配对象。快照将列出对象类型,数量和内存占用。 由于我们在休息状态下, 通过双击某一行或者图标: 选择一个类型可以看到针对每一个实例的所有类型的分配情况,完整值和分配的调用堆栈。下面是所有CCHannelHandlerN163[]的实例:  …

0