在Visual Studio中“全部中断”后,有没有办法保留当前文档?

当我在调试时“全部打破”时,Visual Studio会在堆栈顶部打开源代码; 我想将光标放在我正在处理的文档上,而不打开任何其他文档或窗口(例如:没有加载符号)。

有一种方法可以保留当前文档,但这需要在“ 调试”工具栏中创建Visual Studio加载项和新的UI命令。 这个答案的积分实际上也应该发给openshac ,他发布了类似的SO 问题,并通过使用宏在他的OP中给出了解决方法。

实现相当简单(我花了几分钟才能使它工作)。 首先,在加载项项目中,修改Connect.cs文件中的Exec方法,如下所示:

 public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) { handled = false; if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) { if(commandName == "BreakInCurrentDocument.Connect.BreakInCurrentDocument") { // here's where the magic happens // ****************************** var activeWindow = _applicationObject.ActiveWindow; _applicationObject.Debugger.Break(); if (_applicationObject.ActiveWindow != activeWindow) { _applicationObject.ActiveWindow.Close(vsSaveChanges.vsSaveChangesNo); } // ****************************** handled = true; return; } } } 

创建并注册加载项后,只需:

  1. 单击Visual Studio菜单上的工具
  2. 定制
  3. 命令
  4. 选择“工具栏”单选按钮
  5. 选择“调试”
  6. 添加命令…
  7. 从“Addins”类别中,选择您的自定义加载项。

而已。

这是一个function……当你“全部打破”时,假设你的进程已挂起。 你可能对这种情况感兴趣的第一件事是 – 在哪里。 因此,它会指引您直接进入正在执行的“当前”位置。 IIRC,这是所有低级调试器的事实标准。 如果你不想“加载无符号”只需标记’show disasembly’它就不会再弹出:)(当然,相反,你会看到确切的停止点。是的,这也是一个我自己多次用来调试未知库代码的function)

另一方面,如果您知道要停止代码的位置,请将断点放在那里。

另一方面(好像我们有三个),如果你想真正停止应用程序 – 停止它,不要破坏,只是停止。

我觉得你的实际问题在于你以错误的方式使用其中一个function,因此另一个function会让你感到困惑。 请告诉我,你使用什么“打破所有”以及如何/为什么它与你当前的文本编辑相冲突。 为什么你不能在这里停下来或打破? 还是“脱离”?

无论如何,我不得不承认,作为一个function,应该有一些选项可以关闭它,只是为了IDE的可配置性。


编辑

AAhh ..你是对的。 我完全忘记了光荣的编辑和继续。 我不是在开玩笑/戏弄,E&C是一个很棒的function,我希望所有其他平台都有。 我已经忘了它,因为……我广泛使用lambdas,generics,foreachs等function,有效地阻止编辑和继续。

无论如何,重点是,因为编辑并继续是您想要使用的黄金function – 应用程序必须处于“中断”模式。 然而,无论如何“打破”/“暂停”等等,IDE都会认为PAUSE是你的目标,而不是编辑,因此它会告诉你你在哪里暂停了应用程序。

MSVS中有一些选项,比如“只显示我的代码”可能对你有所帮助,但它无法解决问题:调试期间的编辑和继续是为“小型本地编辑”而设计的。 比如, if(x>0)throw new uncaught()而不是if(x<0)throw new uncaught() 。 您的应用程序在断言或断点处停止并且即将崩溃,第一次更改exception处理程序已关闭,这是您的机会! 您解除崩溃处理程序,更正代码,然后运行。 你停止 的同一种方法所有东西都出现在 ,作为即时补丁的一种方式。

这是为什么你不能在E&C会话期间添加方法,类,修改generics等的主要问题之一:即。 编辑当前的lambda或当前的foreach可能没问题,但是IDE将无法重新定位流并正确执行新代码。 这有点类似于您有时会看到“陈旧代码”警告的原因,但是对于那些代码构造,它更难分析,因此没有实现。 并且可能永远不会成为MS的TO-DO列表的顶部:/

当前的.Net / C#热潮并非“实时开发”,而是“模式化开发”,模块化和unit testing大力支持,您可以努力在线测试应用程序的大部分function。但是这是一种范式转换,对于小型项目或本地桌面开发,有时它只是一种矫枉过正。