【C#】Visual Studio 2017 一边Debug,一边修改代码
好久没写C#了,最近在学习著名***工具 shadowsocks-windows 的源代码,想着可以边断点调试,边加上一些注释以方便理解,stackoverflow 和 msdn 随便翻了一下,竟发现了Debug新世界。
一. 原始需求
原始需求是这样,本来我只是希望在断点调试项目的时候,可以增加一些注释,以方便理解。
但是遇到一个问题:
在处于断点模式(Break Mode,即程序当前命中了断点,并在断点处阻塞着不能向下执行)时,是可以随意增加注释的:
当不处于命中断点的状态时(Debug Mode, 程序正在跑呀跑呀跑~),如果我尝试增加注释,就会有这样的提示Changes are not allowed while code is running。
有小伙伴说可以用Bookmark,试了一下也不知道是怎么玩的。
之前在XCode中写Objective-C Debug时,注释都是可以随便加的,无论是否处于 Debug Mode 下或处于Break Mode(当前命中了断点)!
二.惊喜的发现
随便逛逛 stackoverflow 和 Microsoft blog,惊喜的发现,原来早在Visual Studio 2013,就可以在断点模式(Break Mode)下增加注释,而且,还可以修改代码,编译器和根据你修改的代码实时改变代码运行过程中的流程(see here)。
举个例子就可以清晰地明白:
以下是一个基于MVC5的Web Application,此时根据变量a的值决定是否进入if内部,显而易见,这时候肯定是会进入if内部的:
现在,我将if(a) 修改为 if(b)(这时候编译器会根据代码的修改,立刻编译),并且step into往下走,竟然发现,我可以实时的改变代码,且改变代码的执行流(修改后,不满足if的条件,因此不会return Content("ss"))。

在之前的使用中,如果我发现这里的判断条件需要修改,且我仍然需要动态调试,我会Stop debugging(Shift + F5),将if(a) 修改为 if(b),Start Debugging,最终代码断点执行到这个位置。
三.如何开启Edit and Continue
从Visual Studio 2013开始,这一功能是默认开启的。当然我现在用的是Visual Studio 2017啦,爽爽哒。
如果你发现这个功能不能使用,你需要在你的Project和Visual Studio中分别检查是否正确设置了:
1.检查在Project中是否开启了这一功能:
对于Web Application是可以在Project中手动开启和关闭的(在 WinForm 的 Project 中好像我没有找到设置):

2.检查在Visual Studio中是否开启了这一功能:
[Tools / Options]

搜索
Enable Edit and Continue,并勾选
四.一些不能使用的场景
官方指出有些场景下是明确不能使用的, From msdn:
- Mixed-mode (native/managed) debugging.
- SQL debugging.
- Debugging a Dr. Watson dump.
- Editing code after an unhandled exception, when the Unwind the call stack on unhandled exceptions option is not selected.
- Debugging an embedded runtime application.
- Debugging an application with Attach to rather than running the application with Start from the Debug menu.
- Debugging optimized code.
- Debugging managed code when the target is a 64-bit application. If you want to use Edit and Continue, you must set the target to x86. (ProjectProperties, Compile tab, Advanced Compiler setting.).
五.参考
- How to: Enable and Disable Edit and Continue
- Changes are not allowed when the debugger
- Supported Code Changes (C#)
- https://msdn.microsoft.com/en-us/library/7932e88z.aspx
- from:http://swsmile.info/2017/04/03/%E3%80%90C-%E3%80%91Visual-Studio-2017-%E4%B8%80%E8%BE%B9Debug%EF%BC%8C%E4%B8%80%E8%BE%B9%E4%BF%AE%E6%94%B9%E4%BB%A3%E7%A0%81/
【C#】Visual Studio 2017 一边Debug,一边修改代码的更多相关文章
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
Visual Studio 2017中使用正则修改部分内容 最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...
- Visual Studio 2017中使用正则修改部分内容
最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效果如下 修改前: /// <summary> /// ...
- 最强 IDE Visual Studio 2017 正式版发布
Visual Studio 2017 正式版发布,该版本不仅添加了实时单元测试.实时架构依赖关系验证等新特性,还对许多实用功能进行了改进,如代码导航.IntelliSense.重构.代码修复和调试等等 ...
- 终于等到你,最强 IDE Visual Studio 2017 正式版发布
Visual Studio 2017 正式版发布,该版本不仅添加了实时单元测试.实时架构依赖关系验证等新特性,还对许多实用功能进行了改进,如代码导航.IntelliSense.重构.代码修复和调试等等 ...
- Visual Studio 2017 发布 附带下载地址
链接: https://pan.baidu.com/s/1kFjGwyj5HwabvmJKiyLF_g 提取码: 关注公众号[GitHubCN]回复获取 winform框架源码-Devexpre ...
- visual studio 2017使用技巧
visual studio 2017使用技巧 批量删除代码中的空白行 Ctrl + H, 查找: ^(?([^\r\n])\s)*\r?$\r?\n 替换: 使用正则表达式 当前文档 常用快捷键 注释 ...
- 清理Visual Studio 2017的项目历史记录或手工修改Visual Studio 2017的注册表设置
Visual Studio 2017的"最近的文件列表"和"项目列表"总是删了之后重启电脑又出现(PS:这期间没有打开过项目,更没打开过VS). 一怒之下,按照 ...
- 如何在Visual Studio 2017中使用C# 7+语法
前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不喜勿喷,或许对您有帮助. 在Visual Studio 2017配置 ...
- 在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示
在Visual Studio中使用Debug Visualizers在C++中实现对原始类的自定义调试信息显示 当我们在VS的C++中使用vector.list.map等这些STL容器,在开启调试的时 ...
随机推荐
- react之异步请求数据,render先行渲染报错,未拿到数据
import React from 'react' import {connect} from 'react-redux' import { Redirect} from 'react-router- ...
- 关于Newtonsoft.Json,反序列化jason,内容有key的转换
Newtonsoft.Json,反序列化,对于result里面的结果,可以使用Dictionary<string, List<类名>>,string是key值,value又是一 ...
- hdu5672 尺取
因为没有初始化ans搞了一晚上 还是尺取,枚举所有l 然后寻找对应满足条件的r,这个串可以被后面所有的串包含,所以每个l 的贡献就是len-r+1 #include<bits/stdc++.h& ...
- poj2828 伸展树模拟
用伸展树模拟插队比线段树快乐3倍.. 但是pojT了.别的oj可以过,直接贴代码. 每次更新时,找到第pos个人,splay到根,然后作为新root的左子树即可 #include<iostrea ...
- 《剑指offer》-栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一 ...
- ERP商品类型管理相关业务处理(三十五)
根据类型编号获取父类名称 -- ============================================= CREATE FUNCTION [dbo].[FN_getParentTyp ...
- join 关键字
参考:http://www.blogjava.net/vincent/archive/2008/08/23/223912.html
- Ubuntu 16.04 LTS 安装Mongodb 3.4
第一步:安装 #setp 1. Import the public key used by the package management system. sudo apt-key adv --keys ...
- Unity 精灵物体的创建 Sprite.create
参考链接:http://www.cnblogs.com/BuladMian/p/6226744.html 创建预制体精灵 优点:创建大量相同精灵,只用调用一个预制体精灵,避免了 计算机大量重复创建会导 ...
- Unity Standard Assets Example Project
参考链接:http://blog.csdn.net/jaikydota163/article/details/52751976