如何将调试断点添加到 Visual Studio 中“查找结果”窗口中显示的行
-
09-06-2019 - |
题
在 Visual Studio 2005-2015 中,可以查找包含某些引用的所有行并将它们显示在“查找结果”窗口中。
既然显示了这些结果行,是否有任何键盘快捷键可以允许向所有结果行添加调试断点?
解决方案
此答案不适用于 Visual Studio 2015 或更高版本。可以找到最新的答案 这里.
您可以使用 Visual Studio 宏轻松地完成此操作。在 Visual Studio 中,按 Alt-F11 打开宏 IDE,然后右键单击 MyMacros 并选择“添加|添加模块...”来添加新模块。
将以下内容粘贴到源代码编辑器中:
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
本示例使用“Find Results 1”窗口中的结果;您可能想为每个结果窗口创建单独的快捷方式。
您可以通过转到“工具”|“选项...”来创建键盘快捷键。并选择 键盘 在下面 环境 左侧导航部分。选择您的宏并指定您喜欢的任何快捷方式。
您还可以通过转到“工具”|“自定义...”将宏添加到菜单或工具栏。并选择 宏 左侧导航部分。在列表中找到宏后,您可以将其拖动到任何菜单或工具栏,其中可以将其文本或图标自定义为您想要的任何内容。
其他提示
如果您可以准确搜索该单词,则可以使用一对键盘快捷键来快速完成。
工具 -> 选项 -> 环境 -> 键盘
- Edit.GoToFindResults1NextLocation
- EditorContextMenus.CodeWindow.Breakpoint.InsertBreakpoint
将它们分配给 Control+Alt+F11 和 F10,您可以非常快速地浏览所有结果。然而,我还没有找到转到下一个参考的捷径。
我需要类似的东西来禁用所有断点并在每个“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
希望对你有帮助 :)
保罗,非常感谢,但我有以下错误(消息框),可能我需要重新启动我的电脑:
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