好久没写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
中分别检查是否正确设置了:
检查在Project
中是否开启了这一功能:
对于Web Application
是可以在Project中手动开启和关闭的(在 WinForm 的 Project 中好像我没有找到设置):
检查在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. (Project, Properties**, 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