在对象内部以调试模式搜索

时间:2011-08-03 10:51:55

标签: c# visual-studio visual-studio-2010 debugging

在调试C#应用程序时,是否可以在对象内搜索值和/或其他字段? 我正在寻找可以在很多层次上钻取对象的深度搜索。

我正在寻找的是一种在非常复杂的对象中搜索(如F3进行文档搜索)的方法(例如,在快速监视窗口中进行调试时)。

5 个答案:

答案 0 :(得分:13)

您可以使用OzCode(Visual Studio的附加组件),它允许您在on-hover-DataTip或QuickWatch窗口中查看要查看的成员{。}}。 / p>

请参阅以下屏幕截图中的示例:

Search Feature

完全披露:我是“OzCode”的共同创作者。

答案 1 :(得分:1)

我认为没有内置功能可以让您在调试模式下深入了解对象,除非使用扩展(如果可用)。

答案 2 :(得分:1)

除了Wilson Kao的帖子,您还可以尝试我使用的最简单的方法:

  1. 在将使用引用该对象的变量的位置放置断点。
  2. 在点击断点时将鼠标悬停在变量上。您应该会看到一个弹出窗口,显示对象的顶级属性。
  3. 使用左侧的小+按钮深入到对象中。它可能会让人感到困惑。
  4. 您还可以固定您在内心深处找到的某些属性,这样您就不必一次又一次地查找它们(当您将鼠标悬停在属性上时,每个属性的右侧都会显示针按钮)

    以下是它的外观(变量是书籍): Example

    来源:http://blogesh.wordpress.com/2008/09/09/visual-studio-debugging-tips-and-tricks/

    编辑:有一种方法可以通过手动悬停和点击方法获取您访问的所有属性及其值(即在上图中,您可以通过代码获取ISBN及其值)。但是,您必须使用Visual Basic代码。然后,您可以搜索特定值的结果。

    首先,您需要阅读Tracepoints和自定义宏: Click and go to "TracePoints – Running a Custom Macro" Also, here

    接下来,您需要制作宏来执行您想要的操作。 在Visual Studio中,转到工具 - >宏 - >宏IDE ... 添加一个新宏。应该有一个名为Module 1的预设空白。在这里,您可以添加例程来执行您想要的操作。以下是我制作的宏,它将通过某个变量并输出它的属性(基本上,输出您在封面和单击方法中获得的数据)。这将输出到“输出”窗口,您可以通过查看 - >打开该窗口。输出

        Sub DisplayAllProperties()
        Dim outputWindow As EnvDTE.OutputWindow
        outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
    
        Dim currentStackFrame As EnvDTE.StackFrame
        currentStackFrame = DTE.Debugger.CurrentStackFrame
    
        outputWindow.ActivePane.OutputString("*Dumping Local Variables*" + vbCrLf)
    
        For Each exp As EnvDTE.Expression In currentStackFrame.Locals
            If (exp.Name = "this") Then ' Here, I am only searching in a variable named "this"
                outputWindow.ActivePane.OutputString("- " + exp.Name + ": " + exp.Value.ToString() + vbCrLf)
    
                helperDisplay(exp.DataMembers, outputWindow, 1)
            End If
    
        Next
    End Sub
    
    Private Sub helperDisplay(ByRef exps As EnvDTE.Expressions, ByRef OutputWindow As EnvDTE.OutputWindow, ByVal n As Integer)
    
        For Each ex In exps
            helperTabs(n, OutputWindow)
    
            If (ex.Name = "Non-Public members" Or ex.Name = "Static members") Then
                OutputWindow.ActivePane.OutputString("~ " + ex.Name + ": There are " + ex.DataMembers.Count.ToString + vbCrLf)
            Else
                OutputWindow.ActivePane.OutputString("~ " + ex.Name + ": " + ex.Value.ToString() + vbCrLf)
                If (ex.DataMembers.Count <> 0) Then
                    helperDisplay(ex.DataMembers, OutputWindow, n + 1)
                End If
            End If
        Next
    
    End Sub
    
    Private Sub helperTabs(ByVal n As Integer, ByRef OutputWindow As EnvDTE.OutputWindow)
        For i = 1 To n Step 1
            OutputWindow.ActivePane.OutputString(vbTab)
        Next
    End Sub
    

    这段代码给了我一些我测试过的DevExpress控件的例外。我认为这是因为无法访问某些值。我以前从未在VB中进行编码,因此可能存在错误...使用它并查看它是否可以执行您想要的操作(即仅输出与您需要的属性相匹配的属性)。好的部分是,您可以更改正在调试的宏代码,因此在编辑宏时无需停止项目!

    要使用宏,您需要在代码中的某个位置放置一个断点,并且能够访问所需的对象。 - &GT;右键单击断点,然后转到点击时... 选中运行宏,然后从下拉列表中选择您的宏。

答案 3 :(得分:1)

如果要添加附件,可以通过转到对象列表,选择所有对象(ctrl + a)并将其复制到可搜索的文本编辑器中来完成。这将为您提供换行符分隔列表。

enter image description here

答案 4 :(得分:-3)

当您处于调试模式时,请转到菜单栏上的Debug,然后转到窗口的下拉菜单。在那里,你会看到当地人。这将告诉您变量在当前断点处的值。您还可以通过树状菜单深入了解所有对象。要查找特定对象,您可以观察,然后输入要在那里观看的变量。确保在正确的位置有断点。祝你好运!