Como adiciono pontos de interrupção de depuração às linhas exibidas em uma janela “Localizar resultados” no Visual Studio

StackOverflow https://stackoverflow.com/questions/73063

Pergunta

No Visual Studio 2005-2015 é possível encontrar todas as linhas contendo determinadas referências e exibi-las em uma janela "Localizar Resultados".

Agora que essas linhas de resultados são exibidas, existe algum atalho de teclado que permita adicionar pontos de interrupção de depuração a todas elas?

Foi útil?

Solução

Esta resposta não funciona para o Visual Studio 2015 ou posterior.Uma resposta mais recente pode ser encontrada aqui.

Você pode fazer isso facilmente com uma macro do Visual Studio.No Visual Studio, pressione Alt-F11 para abrir o Macro IDE e adicione um novo módulo clicando com o botão direito em MyMacros e selecionando Add|Add Module...

Cole o seguinte no editor de código-fonte:

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

Este exemplo usa os resultados da janela "Localizar resultados 1";você pode querer criar um atalho individual para cada janela de resultados.

Você pode criar um atalho de teclado acessando Ferramentas|Opções...e selecionando Teclado debaixo de Ambiente seção na navegação à esquerda.Selecione sua macro e atribua qualquer atalho que desejar.

Você também pode adicionar sua macro a um menu ou barra de ferramentas acessando Ferramentas|Personalizar...e selecionando o Macros seção na navegação à esquerda.Depois de localizar sua macro na lista, você pode arrastá-la para qualquer menu ou barra de ferramentas, onde seu texto ou ícone pode ser personalizado como desejar.

Outras dicas

Se você conseguir pesquisar a palavra exatamente, poderá usar alguns atalhos de teclado para fazer isso rapidamente.

Ferramentas -> Opções -> Ambiente -> Teclado

  • Editar.GoToFindResults1NextLocation
  • EditorContextMenus.CodeWindow.Breakpoint.InsertBreakpoint

Atribua-os a Control+Alt+F11 e F10 e você poderá passar por todos os resultados muito rapidamente.No entanto, não encontrei um atalho para ir para a próxima referência.

Eu precisava de algo semelhante para desabilitar todos os pontos de interrupção e colocar um ponto de interrupção em cada "Catch ex as Exception".No entanto, expandi um pouco isso para colocar um ponto de interrupção em cada ocorrência da string que você selecionou.Tudo o que você precisa fazer com isso é destacar a string na qual deseja ter um ponto de interrupção e executar a macro.

 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

Espero que funcione para você :)

Paul, muito obrigado, mas estou com o seguinte erro (caixa de mensagem), talvez seja necessário reiniciar meu PC:

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

Eu proporia a seguinte solução que é muito simples, mas funciona para mim

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top