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

本文关键字:全部中断 保留 文档 中断 全部 Visual Studio 有没有 | 更新日期: 2023-09-27 17:56:54

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. 从"加载项"类别中,选择您的自定义加载项。

就是这样。

http://visualstudiogallery.msdn.microsoft.com/a83505c6-77b3-44a6-b53b-73d77cba84c8 提供的最新版本的VSCommands扩展(免费版本)正是您想要的。它将"当前文档中的中断"按钮添加到"调试工具栏"和"调试"菜单:

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

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

另一方面,如果您知道希望代码停止的位置,请改为将断点放在该位置。

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

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

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


编辑

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

无论如何,关键是,由于编辑并继续是您想要使用的黄金功能 - 应用程序必须处于"中断"模式。但是,无论如何如何"中断"/"暂停"等,IDE 会假设暂停是您的目标,而不是编辑,因此它会告诉您暂停应用程序的位置。

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

这是为什么不能在E&C会话期间添加方法,类,修改泛型等的主要问题之一:即编辑当前lambda或当前foreach可能是可以的,但IDE将无法重新定位流并正确执行新代码。这有点类似于为什么您有时会看到"过时代码"警告,但使用这些代码构造,它更难分析,因此无法实现。而且可能永远不会成为MS的待办事项列表的顶部:/

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