Поиск в режиме отладки внутри объекта
Можно ли искать внутри объекта значения и/или другое поле при отладке приложения С#?
Я ищу глубокий поиск, который может развернуть объект для многих уровней.
То, что я ищу, - это способ поиска (например, F3 для поиска документов) внутри очень сложных объектов (при отладке, например, в окне Quick watch).
Ответы
Ответ 1
Вы можете использовать OzCode (надстройка для Visual Studio), которая позволяет search для членов, которые вы хотите видеть из встроенного в DataTip или QuickWatch окна.
См. пример на следующем снимке экрана:
![Search Feature]()
Полное раскрытие. Я являюсь соавтором "OzCode".
Ответ 2
Я думаю, что нет встроенной функции, позволяющей вам погружаться глубоко в объекты в режиме отладки, если не использовать расширения, если они доступны.
Ответ 3
Помимо публикации Wilson Kao, вы также можете попробовать самый простой подход, который я использую:
- Поместите точку останова в место, где будет использоваться переменная, ссылающаяся на объект.
- Наведите указатель мыши на переменную при ударе точки останова. Вы должны увидеть всплывающее окно, показывающее свойства верхнего уровня объекта.
- Используйте кнопки "+" слева, чтобы углубиться в объект. Это может запутать.
Вы также можете привязать определенные свойства, которые вы находите в глубине, поэтому вам не нужно искать их снова и снова (кнопка ввода появляется справа от каждого свойства при наведении указателя мыши на свойство)
Здесь приведен пример того, как он выглядит (переменная - это книги):
![Example]()
Источник: http://blogesh.wordpress.com/2008/09/09/visual-studio-debugging-tips-and-tricks/
Изменить: есть способ получить все свойства и их значения, которые вы получаете с помощью ручного метода "наведите указатель мыши" (т.е. на приведенном выше изображении вы можете получить 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, поэтому там, вероятно, есть ошибки... Поиграйте с ним и посмотрите, может ли он делать то, что вы хотите (т.е. Выводите только те свойства, которые соответствуют тому, что вам нужно). Хорошая часть, вы можете изменить код макроса, как вы отлаживаете, поэтому вам не нужно останавливать свой проект при редактировании макроса!
Чтобы использовать макрос, вам нужно поставить точку останова где-то в вашем коде, который будет удален, и сможет получить доступ к требуемому объекту.
- > Щелкните правой кнопкой мыши точку останова и перейдите к Когда нажмите... Отключить Запустить макрос: и выбрать макрос из раскрывающегося списка.
Ответ 4
Когда вы находитесь в режиме отладки, перейдите в Debug в строке меню и перейдите в раскрывающееся меню окон. Там вы увидите локальных жителей. Это скажет вам, какие значения ваши переменные находятся на ваших текущих контрольных точках. Вы также можете глубоко погрузиться во все ваши объекты, а также через древовидное меню. Чтобы найти конкретный объект, вы можете посмотреть, а затем ввести переменную, которую вы хотите посмотреть там. Убедитесь, что у вас есть точки останова в нужном месте. Удачи!