17

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

4

3 回答 3

11

有一种方法可以保留在当前文档上,但这需要在“调试”工具栏中创建一个 Visual Studio 加载项和一个新的 UI 命令。这个答案的功劳实际上也应该 归于 openshac,他发布了一个类似的 SO问题,并通过使用宏在他的 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;
        }
    }
}

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

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

就是这样。

于 2013-02-06T10:24:19.800 回答
10

可从http://visualstudiogallery.msdn.microsoft.com/a83505c6-77b3-44a6-b53b-73d77cba84c8获得的最新版本的 VSCommands 扩展(免费版)正是您想要的。它在调试工具栏和调试菜单中添加了一个 Break In Current Document 按钮:

http://vscommands.squaredinfinity.com/Media/VSCommands/BlogPost//blog/breakincurrentdocument.png

于 2013-02-07T01:26:39.780 回答
2

这是一个功能..当您“全部中断”时,假定您的进程已挂起。您可能对这种情况感兴趣的第一件事是 - WHERE。因此,它会将您直接引导到正在执行的“当前”位置。IIRC,这是所有低级调试器的事实标准。如果您不希望“未加载符号”,只需标记“显示反汇编”,它将永远不会再次弹出:)(当然,相反,您会看到确切的停止点。是的,这也是一个我自己多次用于调试未知库代码的功能)

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

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

我觉得您的实际问题在于您以错误的方式使用其中一个功能,因此另一个功能会困扰您。请告诉我,您将“全部中断”用于什么以及它如何/为什么与您当前的文本编辑发生冲突。为什么你不能在这里停下来或休息一下呢?还是“分离”?

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


编辑

啊。。你是对的。我完全忘记了光荣的编辑和继续。我不是在开玩笑/取笑,E&C 是一个很棒的功能,我希望所有其他平台都拥有。我已经忘记了,因为...我广泛使用 lambdas、泛型、foreachs 等功能,这些功能有效地阻止了编辑和继续。

无论如何,重点是,因为编辑并继续是您想要使用的黄金功能 - 应用程序必须处于“中断”模式。但是,无论如何如何“中断”/“暂停”等,IDE 将假定 PAUSE 是您的目标,而不是编辑,因此它会告诉您您在哪里暂停了应用程序。

MSVS 中有一些选项,例如“仅显示我的代码”,可能会对您有所帮助,但不会解决问题:调试期间的编辑并继续是为“小型本地编辑”而设计的。喜欢,if(x>0)throw new uncaught()而不是if(x<0)throw new uncaught()。您的应用程序在断言或断点处停止并即将崩溃,首次更改异常处理程序已启动,这是您的机会!您展开崩溃处理程序,更正代码,然后运行。作为即时补丁的一种方式,您停止的所有事情都发生在同一方法中。

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

当前 .Net/C# 的繁荣不是“实时开发”而是“notaliveyet 开发”,在模块化和单元测试的大力支持下,您可以努力离线测试应用程序的大部分功能。但是这是一种范式转变,对于小型项目或本地桌面开发来说,有时这只是一种矫枉过正。

于 2013-02-06T09:06:10.843 回答