19

在 Visual Studio 2005-2015 中,可以找到包含某些引用的所有行并将它们显示在“查找结果”窗口中。

现在显示了这些结果行,是否有任何键盘快捷键可以向所有结果行添加调试断点?

4

4 回答 4

18

此答案不适用于 Visual Studio 2015 或更高版本。可以在此处找到更新的答案。

使用 Visual Studio 宏可以很容易地做到这一点。在 Visual Studio 中,按 Alt-F11 打开宏 IDE 并通过右键单击 MyMacros 并选择 Add|Add Module... 添加一个新模块

在源代码编辑器中粘贴以下内容:

Imports System
Imports System.IO
Imports System.Text.RegularExpressions
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module CustomMacros
    Sub BreakpointFindResults()
        Dim findResultsWindow As Window = DTE.Windows.Item(Constants.vsWindowKindFindResults1)

        Dim selection As TextSelection
        selection = findResultsWindow.Selection
        selection.SelectAll()

        Dim findResultsReader As New StringReader(selection.Text)
        Dim findResult As String = findResultsReader.ReadLine()

        Dim findResultRegex As New Regex("(?<Path>.*?)\((?<LineNumber>\d+)\):")

        While Not findResult Is Nothing
            Dim findResultMatch As Match = findResultRegex.Match(findResult)

            If findResultMatch.Success Then
                Dim path As String = findResultMatch.Groups.Item("Path").Value
                Dim lineNumber As Integer = Integer.Parse(findResultMatch.Groups.Item("LineNumber").Value)

                Try
                    DTE.Debugger.Breakpoints.Add("", path, lineNumber)
                Catch ex As Exception
                    ' breakpoints can't be added everywhere
                End Try
            End If

            findResult = findResultsReader.ReadLine()
        End While
    End Sub
End Module

此示例使用“查找结果 1”窗口中的结果;您可能希望为每个结果窗口创建一个单独的快捷方式。

您可以通过转到工具|选项...并在左侧导航的环境部分下选择键盘来创建键盘快捷键。选择您的宏并分配您喜欢的任何快捷方式。

您还可以通过转到工具|自定义...并选择左侧导航中的宏部分来将宏添加到菜单或工具栏。一旦你在列表中找到你的宏,你可以将它拖到任何菜单或工具栏,它的文本或图标可以自定义为你想要的任何东西。

于 2008-10-30T07:35:29.687 回答
3

如果您可以准确搜索该单词,则可以使用一对键盘快捷键快速完成搜索。

工具 -> 选项 -> 环境 -> 键盘

  • Edit.GoToFindResults1NextLocation
  • EditorContextMenus.CodeWindow.Breakpoint.InsertBreakpoint

将它们分配给 Control+Alt+F11 和 F10,您可以非常快速地浏览所有结果。但是,我还没有找到前往下一个参考的捷径。

于 2008-09-16T14:45:59.830 回答
3

我需要类似的东西来禁用所有断点并在每个“Catch ex as Exception”上放置一个断点。但是,我对此进行了一点扩展,因此它将在您选择的字符串的每次出现处放置一个断点。您需要做的就是突出显示要在其上设置断点的字符串并运行宏。

 Sub BreakPointAtString()

    Try
        DTE.ExecuteCommand("Debug.DisableAllBreakpoints")
    Catch ex As Exception

    End Try

    Dim tsSelection As String = DTE.ActiveDocument.Selection.text
    DTE.ActiveDocument.Selection.selectall()
    Dim AllText As String = DTE.ActiveDocument.Selection.Text

    Dim findResultsReader As New StringReader(AllText)
    Dim findResult As String = findResultsReader.ReadLine()
    Dim lineNum As Integer = 1

    Do Until findResultsReader.Peek = -1
        lineNum += 1
        findResult = findResultsReader.ReadLine()
        If Trim(findResult) = Trim(tsSelection) Then
            DTE.ActiveDocument.Selection.GotoLine(lineNum)
            DTE.ExecuteCommand("Debug.ToggleBreakpoint")
        End If
    Loop

End Sub

希望对你有帮助 :)

于 2009-04-28T11:42:18.467 回答
1

保罗,非常感谢,但我有以下错误(消息框),可能我需要重新启动我的电脑:

Error
---------------------------
Error HRESULT E_FAIL has been returned from a call to a COM component.
---------------------------
OK   
---------------------------

我会提出以下非常简单但对我有用的解决方案

Sub BreakPointsFromSearch()
    Dim n As Integer = InputBox("Enter the number of search results")

    For i = 1 To n
        DTE.ExecuteCommand("Edit.GoToNextLocation")
        DTE.ExecuteCommand("Debug.ToggleBreakpoint")            
    Next
End Sub
于 2009-10-27T15:54:32.077 回答