Como adiciono pontos de interrupção de depuração às linhas exibidas em uma janela “Localizar resultados” no Visual Studio
-
09-06-2019 - |
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?
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