当我在调试时“全部中断”时,Visual Studio会在堆栈顶部打开源代码;我想将光标放在我正在处理的文档上,而不打开任何其他文档或窗口(例如:没有加载符号)。
答案 0 :(得分:10)
http://visualstudiogallery.msdn.microsoft.com/a83505c6-77b3-44a6-b53b-73d77cba84c8提供的最新版本的VSCommands扩展(免费版)正是您想要的。 它在Debug Toolbar和Debug Menu中添加了一个Break In Current Document按钮:
http://vscommands.squaredinfinity.com/Media/VSCommands/BlogPost//blog/breakincurrentdocument.png
答案 1 :(得分:9)
有一种方法可以保留当前文档,但这需要在 Debug 工具栏中创建Visual Studio加载项和新的UI命令。此答案的积分实际上也应该发送到openshac,他发布了类似的SO question,并通过使用宏在其OP中提供了解决方法。
实施相当简单(让我花了几分钟才能完成它)。首先,在加载项项目中,修改Exec
文件中的Connect.cs
方法,如下所示:
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;
}
}
}
创建并注册加载项后,只需:
就是这样。
答案 2 :(得分:2)
这是一个功能..当你“全部打破”时,假设你的进程已挂起。你可能对这种情况感兴趣的第一件事是 - 在哪里。因此,它会指引您直接进入正在执行的“当前”位置。 IIRC,这是所有低级调试器的事实标准。如果你不想要“没有加载符号”,只需标记'show disasembly',它就不会再弹出:)(当然,相反,你会看到确切的停止点。是的,这也是一个我自己多次用来调试未知库代码的功能)
另一方面,如果您知道希望代码停止的位置,请将断点放在那里。
另一方面(好像我们有三个),如果你想实际停止应用程序 - 停止它,不要破坏,只是停止。
我觉得你的实际问题在于你以错误的方式使用其中一个功能,因此另一个功能会让你感到烦恼。请告诉我,你用什么“打破所有”以及如何/为什么它与你当前的文本编辑相冲突。为什么你不能在这里停下来或打破?还是“分离”?
无论如何,我必须承认,作为一项功能,应该有一些选项可以将其关闭,只是为了配置IDE。
修改
AAhh ..你是对的。我完全忘记了光荣的编辑和继续。我不是在开玩笑/戏弄,E& C是一个很棒的功能,我希望所有其他平台都有。我已经忘记了它,因为......我广泛使用lambdas,泛型,foreachs等功能来有效地阻止编辑和继续。
无论如何,重点是,因为编辑并继续是您想要使用的黄金功能 - 应用程序必须处于“中断”模式。然而,无论如何'打破'/'暂停'等等,IDE都会认为PAUSE是你的目标,而不是编辑,因此它会告诉你你在哪里暂停了应用程序。
MSVS中有一些选项,比如“只显示我的代码”可能对你有所帮助,但它无法解决问题:调试期间的编辑和继续是为“小型本地编辑”而设计的。比如,if(x>0)throw new uncaught()
代替if(x<0)throw new uncaught()
。您的应用程序在断言或断点处停止并且即将崩溃,首先更改异常处理程序已关闭,这是您的机会!您解除崩溃处理程序,更正代码,然后运行。 同一种方法中的所有内容停止发生在中,作为即时补丁的一种方式..
这是为什么不能在E&amp; C会话期间添加方法,类,修改泛型等的主要问题之一:即。编辑当前的lambda或当前foreach可能没问题,但是IDE将无法重定位流并正确执行新代码。这有点类似于您有时会看到“陈旧代码”警告的原因,但是对于那些代码构造,它更难分析,因此没有实现。并且可能永远不会成为MS的TO-DO列表的顶部:/
目前的.Net / C#热潮不是“实时开发”,而是“模拟开发”,模块化和单元测试大力支持,您可以努力测试应用程序的大多数功能离线..但这是一种范式转换,对于小型项目或本地桌面开发,有时它只是一种矫枉过正。