如何在Visual Studio的"查找结果"窗口中显示的行上添加调试断点
时间:2020-03-05 18:56:09 来源:igfitidea点击:
在Visual Studio 2005-2015中,可以找到包含某些引用的所有行,并将其显示在"查找结果"窗口中。
现在已经显示了这些结果行,是否有任何键盘快捷键可以允许向所有这些调试键添加调试断点?
解决方案
回答
如果我们可以精确搜索该单词,则可以使用一对键盘快捷键快速进行搜索。
工具->选项->环境->键盘
- Edit.GoToFindResults1NextLocation
- EditorContextMenus.CodeWindow.Breakpoint.InsertBreakpoint
将它们分配给Control + Alt + F11和F10,我们可以非常快速地浏览所有结果。但是,我还没有找到下一个参考的捷径。
回答
我们可以使用Visual Studio宏轻松地做到这一点。在Visual Studio中,按Alt-F11打开Macro 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
本示例在"查找结果1"窗口中使用结果;我们可能想为每个结果窗口创建一个单独的快捷方式。
我们可以转到"工具|选项...",然后在左侧导航栏中的"环境"部分下选择"键盘",以创建键盘快捷方式。选择宏,然后分配我们想要的任何快捷方式。
我们还可以通过以下方式将宏添加到菜单或者工具栏:转到"工具" |"自定义...",然后在左侧导航栏中选择"宏"部分。在列表中找到宏后,可以将其拖动到任何菜单或者工具栏,在其中可以将其文本或者图标自定义为所需的任何内容。
回答
我需要类似的方法来禁用所有断点,并在每个"作为异常捕获的对象"上放置一个断点。但是,我对此进行了一点扩展,因此它将在我们选择的字符串的每次出现处都放置一个断点。我们所需要做的就是突出显示要在其上设置断点的字符串并运行宏。
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
希望这对你有用 :)
回答
Paul,非常感谢,但是我遇到以下错误(消息框),可能是我需要重新启动PC:
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