Как добавить точки останова отладки в строки, отображаемые в окне результатов поиска в Visual Studio

В Visual Studio 2005-2015 можно найти все строки, содержащие определенные ссылки, и отобразить их в окне «Результаты поиска».

Теперь, когда эти строки результатов отображаются, есть ли какая-либо комбинация клавиш, которая позволила бы добавить точки останова отладки ко всем из них?


person Noah    schedule 16.09.2008    source источник


Ответы (4)


Этот ответ не подходит для Visual Studio 2015 и более поздних версий. Более свежий ответ можно найти здесь.

Вы можете сделать это довольно легко с помощью макроса Visual Studio. В Visual Studio нажмите Alt-F11, чтобы открыть Macro 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»; вы можете захотеть создать отдельный ярлык для каждого окна результатов.

Вы можете создать сочетание клавиш, выбрав Сервис|Параметры... и выбрав Клавиатура в разделе Среда на панели навигации слева. Выберите свой макрос и назначьте любой ярлык, который вам нравится.

Вы также можете добавить свой макрос в меню или на панель инструментов, перейдя в Инструменты|Настроить... и выбрав раздел Макросы на панели навигации слева. Как только вы найдете свой макрос в списке, вы можете перетащить его в любое меню или на панель инструментов, где его текст или значок можно настроить по своему усмотрению.

person Jeff Hillman    schedule 30.10.2008
comment
Это все еще возможно? Я не уверен, что должно вызвать нажатие клавиши Alt F11, и не могу найти окно макроса для перехода в Visual Studio 2017. - person SweetTomato; 23.05.2018
comment
@SweetTomato Этому ответу почти 10 лет. Я не использовал ни один вариант Visual Studio более 5 лет, но я сомневаюсь, что что-либо из этого больше актуально. - person Jeff Hillman; 03.07.2018
comment
Я думаю, что новые макросы требуют .js - person Demodave; 10.10.2018

Если вы можете точно найти слово, вы можете использовать пару сочетаний клавиш, чтобы сделать это быстро.

Инструменты -> Параметры -> Среда -> Клавиатура

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

Назначьте их на Control+Alt+F11 и F10, и вы сможете очень быстро просмотреть все результаты. Однако я не нашел ярлык для перехода к следующей ссылке.

person Tom Ritter    schedule 16.09.2008
comment
F3 и F9 делают это без переназначения каких-либо сочетаний клавиш. - person StuperUser; 24.08.2011
comment
F3 переходит к следующему результату на текущей панели, а не к следующей строке в результатах поиска. Можно использовать F3 на панели результатов поиска, но вам также нужно нажать Enter и перейти между панелями кода и результатов. Этот ответ экономит много нажатий клавиш. - person Nathan Kovner; 15.08.2017

Мне нужно было что-то подобное, чтобы отключить все точки останова и поместить точку останова на каждое «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

Надеюсь, это сработает для вас :)

person Community    schedule 28.04.2009

Павел, большое спасибо, но у меня следующая ошибка (окно сообщения), возможно, мне нужно перезагрузить компьютер:

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
person Dmytro    schedule 27.10.2009