Поиск в режиме отладки внутри объекта
Можно ли искать в объекте значения и / или другое поле при отладке приложения на C#? Я ищу глубокий поиск, который может детализировать объект на многих уровнях.
Я ищу способ поиска (например, F3 для поиска документов) внутри очень сложных объектов (например, во время отладки, в окне Quick watch).
5 ответов
Если вы хотите сделать это без надстройки, это можно сделать, перейдя в список объектов, выбрав все объекты (ctrl+a) и скопировав их в текстовый редактор с возможностью поиска. Это даст вам разделенный список новой строки.
Я думаю, что нет встроенной функции, позволяющей вам углубиться в объекты в режиме отладки, если только не использовать расширения, если они доступны.
Помимо поста Уилсона Као, вы также можете попробовать самый простой подход, который я использую:
- Поместите точку останова в место, где будет использоваться переменная, ссылающаяся на объект.
- Наведите курсор на переменную при достижении точки останова. Вы должны увидеть всплывающее окно со свойствами верхнего уровня объекта.
- Используйте маленькие кнопки + слева, чтобы углубиться в объект. Это может запутать.
Вы также можете закрепить определенные свойства, которые вы найдете в глубине, чтобы вам не приходилось искать их снова и снова (кнопка закрепления появляется с правой стороны каждого свойства при наведении курсора на свойство)
Вот пример того, как это выглядит (переменная - books):
Источник: http://blogesh.wordpress.com/2008/09/09/visual-studio-debugging-tips-and-tricks/
Редактировать: есть способ получить все свойства и их значения, к которым вы обращаетесь с помощью ручного метода наведения-и-щелчка (т. Е. На изображении выше, вы можете получить ISBN и его значение с помощью кода). Однако вы должны использовать код Visual Basic. Затем вы можете выполнить поиск по результатам для определенного значения.
Во-первых, вам нужно прочитать сведения о точках трассировки и пользовательских макросах: щелкните и перейдите к "TracePoints - Запуск пользовательского макроса". Также здесь
Далее вам нужно сделать макрос, чтобы делать то, что вы хотите. В Visual Studio перейдите в Инструменты -> Макросы -> Макросы IDE... Добавить новый макрос. Должен быть предустановленный пустой модуль под названием Module 1. Здесь вы добавляете подпрограммы, чтобы делать то, что вы хотите. Ниже приведен макрос, который я сделал, чтобы пройти через некоторую переменную и вывести ее свойства (в основном, вывести данные, полученные с помощью метода cover-and-click). Это выводит в окно вывода, которое вы можете открыть через View -> Output.
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 раньше, так что там, вероятно, есть ошибки... Поиграйте с ним и посмотрите, может ли он делать то, что вы хотите (то есть выводить только те свойства, которые вам нужны). Хорошая часть заключается в том, что вы можете изменить код макроса в процессе отладки, поэтому нет необходимости останавливать проект во время редактирования макроса!
Чтобы использовать Макрос, вам нужно поместить точку останова где-нибудь в вашем коде, которая будет поражена и сможет получить доступ к нужному объекту. -> Щелкните правой кнопкой мыши точку останова и перейдите к пункту Когда нажимаете ... Отметьте галочкой Запустить макрос: и выберите свой макрос из выпадающего списка.
Когда вы находитесь в режиме отладки, зайдите в Debug в строке меню и перейдите в выпадающее меню окон. Там вы увидите местных жителей. Это скажет вам, какие значения у ваших переменных в ваших текущих точках останова. Вы также можете погрузиться глубоко во все ваши объекты, а также через древовидное меню. Чтобы найти конкретный объект, вы можете посмотреть, а затем ввести переменную, которую вы хотите просмотреть там. Убедитесь, что у вас есть точки останова в нужном месте. Удачи!