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

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

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

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

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

搜索功能

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

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

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

  1. 将断点放在将使用引用该对象的变量的位置。
  2. 命中断点时将鼠标hover在变量上。 您应该看到一个弹出窗口,显示对象的顶级属性。
  3. 使用左侧的小+按钮深入到对象中。 它可能会让人感到困惑。

您还可以固定您在内心深处找到的某些属性,这样您就不必一次又一次地查找它们(当您将鼠标hover在属性上时,每个属性的右侧会显示针按钮)

这是它的外观(变量是书籍): 例

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

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

首先,您需要阅读Tracepoints和自定义宏: 单击并转到“TracePoints – 运行自定义宏” 此处,此处

接下来,您需要制作宏来执行您想要的操作。 在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中编码,因此可能存在错误…使用它并查看它是否可以执行您想要的操作(即仅输出与您需要的属性相匹配的属性)。 好的部分是,您可以更改正在调试的宏代码,因此在编辑宏时无需停止项目!

要使用宏,您需要在代码中的某个位置放置一个断点,并且能够访问所需的对象。 – >右键单击断点并转到When Hit …关闭运行宏:并从下拉列表中选择您的宏。

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