禁用/删除子断点?

11
我正在使用Visual Studio中的C#调试ASP.NET网站。当我设置一个断点(在调试期间),随着时间的推移,创建的断点将累积许多子断点。(见这里。)
现在,有时候当我通过点击红色标记来移除断点时,由于子断点仍然存在,下一次执行该行时仍会命中断点。

在断点窗口中删除断点将解决问题,但是当你设置了很多断点时,找到正确的断点非常麻烦。此外,删除带有许多子项的断点是一个相当缓慢的操作。

那么问题来了,我可以禁用这些子断点的创建吗?或者有没有快速删除所有子项的方法?
欢迎提供替代方案!


请注意,这不是重复的问题:关于如何删除Visual Studio断点的问题,因为我正在问如何处理子断点。(尽管我们的目标是相同的。)


嗯,你怎么那么确定你的问题不是重复的?在我看来,你只是更好地想到了如何提出这个问题。无论如何,你的答案肯定在那篇帖子引用的Microsoft Connect页面上。 - sq33G
“更好”表示它是不同的,因此不是重复的。 :) 此外,如果这个问题会产生不同的答案,那么这难道也不证明它的独特性吗? - Protector one
有了答案,我们再谈论吧 ;) - sq33G
1
我不认为Visual Studio提供了更少烦人的替代方案,也许可以创建一个自定义插件来帮助禁用子断点,但这似乎有些牵强。 - C.Evenhuis
+1 表示发布了我没有看到过的非重复内容。 - sq33G
显示剩余2条评论
3个回答

2
以下代码可用作宏来删除所有子断点。
Sub RemoveChildBreakpoints()
    Dim i As Integer
    Dim len As Integer
    Dim debugger As EnvDTE.Debugger = DTE.Debugger
    Dim children As EnvDTE.Breakpoints
    For Each bp As EnvDTE.Breakpoint In debugger.Breakpoints
        children = bp.Children
        len = children.Count
        For i = len To 1 Step -1
            children.Item(i).Delete()
        Next
    Next
End Sub

如果您拥有很多断点,调试仍然会变得非常缓慢,所以最好定期运行它,如果您遇到子断点问题。


1
以下代码可用作宏,以删除当前选定行上的断点。(请注意,当断点被命中时,Visual Studio会自动选择该行。)
Sub RemoveBreakPoint()
    Dim debugger As EnvDTE.Debugger = DTE.Debugger
    Dim children As EnvDTE.Breakpoints
    Dim sel As Integer = DTE.ActiveDocument.Selection.ActivePoint.Line
    For Each bp As EnvDTE.Breakpoint In debugger.Breakpoints
        If bp.File <> DTE.ActiveDocument.FullName Then
            Continue For
        End If
        For Each bpc As EnvDTE.Breakpoint In bp.Children
            If bpc.FileLine = sel Then
                bp.Delete()
                Exit For
            End If
        Next
    Next
End Sub

您可以为其分配一个键盘快捷方式以便轻松访问。(工具 > 选项 > 环境 > 键盘。)


1
这是一个更新后的宏,用于新的基于JavaScript的宏插件(https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.MacrosforVisualStudio),以删除所有子断点:

/// <reference path="C:\Users\ERobishaw\AppData\Local\Microsoft\VisualStudio\14.0\Macros\dte.js" />
try {

    var outputWindowPane = dte.Windows.Item("{34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3}").Object.ActivePane;
    outputWindowPane.Activate();
    outputWindowPane.OutputString("display this text in the output window panel\n");

    var i;
    var len;
    var dbgr = dte.Debugger;
    var brk = dbgr.Breakpoints;
    outputWindowPane.OutputString("There are " + brk.Count + " Total\n");
    //Macro.InsertText("There are " + brk.Count + " Total");
    for (var bpi = 1; bpi <= brk.Count; bpi++) {
        outputWindowPane.OutputString("On " + bpi + " of " + brk.Count + "\n");
        var bp = brk.Item(bpi);
        var children = bp.Children;
        var len = children.Count;
        
        for (var chi = len; chi > 0; chi--) {
            outputWindowPane.OutputString(" Children Count = " + children.Count + "\n");
            children.Item(chi).Delete();
        }
    }
}
catch (e) {
    outputWindowPane.OutputString("Error\n");
    outputWindowPane.OutputString(e + "\n");
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接