Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调试模式下在对象内搜索_C#_Visual Studio_Visual Studio 2010_Debugging - Fatal编程技术网

C# 在调试模式下在对象内搜索

C# 在调试模式下在对象内搜索,c#,visual-studio,visual-studio-2010,debugging,C#,Visual Studio,Visual Studio 2010,Debugging,调试C#应用程序时,是否可以在对象内部搜索值和/或其他字段? 我正在寻找一个深入的搜索,可以深入到许多层次的对象 我要寻找的是一种在非常复杂的对象中搜索(如F3搜索文档)的方法(例如,在调试时,在快速观察窗口中) 我认为没有内置功能可以让您在调试模式下深入研究对象,除非使用扩展(如果可用) 处于调试模式时,在菜单栏上转到调试,然后转到windows的下拉菜单。在那里,你会看到当地人。这将告诉您当前断点处的变量值。您还可以通过树菜单深入查看所有对象。要查找特定对象,您可以观察,然后在那里输入要观察

调试C#应用程序时,是否可以在对象内部搜索值和/或其他字段? 我正在寻找一个深入的搜索,可以深入到许多层次的对象


我要寻找的是一种在非常复杂的对象中搜索(如F3搜索文档)的方法(例如,在调试时,在快速观察窗口中)

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

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

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

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

    下面是它的外观示例(变量为books):

    资料来源:

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

    首先,您需要阅读跟踪点和自定义宏:

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

        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
    
    子显示所有属性()
    将outputWindow变暗为EnvDTE.outputWindow
    outputWindow=DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
    将currentStackFrame设置为EnvDTE.StackFrame
    currentStackFrame=DTE.Debugger.currentStackFrame
    outputWindow.ActivePane.OutputString(“*转储局部变量*”+vbCrLf)
    对于currentStackFrame.Locals中的每个exp As EnvDTE.Expression
    如果(exp.Name=“this”)那么“在这里,我只搜索名为“this”的变量”
    outputWindow.ActivePane.OutputString(“-”+exp.Name+”:“+exp.Value.ToString()+vbCrLf)
    helperDisplay(exp.DataMembers,outputWindow,1)
    如果结束
    下一个
    端接头
    私有子helperDisplay(ByRef exps作为EnvDTE.Expressions,ByRef OutputWindow作为EnvDTE.OutputWindow,ByVal n作为整数)
    对于EXP中的每个ex
    助手选项卡(n,输出窗口)
    如果(ex.Name=“非公共成员”或ex.Name=“静态成员”),则
    OutputWindow.ActivePane.OutputString(“~”+ex.Name+”:有“+ex.DataMembers.Count.ToString+vbCrLf”)
    其他的
    OutputWindow.ActivePane.OutputString(“~”+ex.Name+”:“+ex.Value.ToString()+vbCrLf)
    如果(ex.DataMembers.Count 0),则
    helperDisplay(例如DataMembers,OutputWindow,n+1)
    如果结束
    如果结束
    下一个
    端接头
    私有子HelperTab(ByVal n为整数,ByRef OutputWindow为EnvDTE.OutputWindow)
    对于i=1到n,步骤1
    OutputWindow.ActivePane.OutputString(vbTab)
    下一个
    端接头
    
    这段代码为我测试的一些DevExpress控件提供了例外情况。我认为这是因为某些值无法访问。我以前从来没有用VB编写过代码,所以里面可能有bug…玩一下,看看它是否能做你想做的事情(即只输出符合你需要的属性)。好的方面是,您可以在调试时更改宏代码,因此在编辑宏时无需停止项目

    要使用宏,您需要在代码中的某个地方放置一个断点,该断点将被命中,并且能够访问所需的对象。 ->右键单击断点并在点击时转到选中运行宏:,然后从下拉列表中选择您的宏。

    您可以使用(Visual Studio的附加组件),它允许您从悬停数据提示或QuickWatch窗口中查找要查看的成员

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


    全面披露:我是“OzCode”的共同创建者。

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


    试着使用F10或F11来进一步向下移动对象。此外,还有一个内置功能可以查看对象值等。我认为您需要更具体地说明“搜索”的含义,以获得更好的答案。我只是假设它意味着能够访问值。那么你想通过什么来搜索呢?属性类型?如果属性不是string、number或bool,如何搜索值?举一个你想做什么的例子。谢谢你的投票,但正如你所看到的,@Shahar写的“搜索”,它意味着在其中键入内容并搜索的功能。当然,您可以在调试中在对象中导航,我的意思是