Подтвердить что ты не робот

Поиск в режиме отладки внутри объекта

Можно ли искать внутри объекта значения и/или другое поле при отладке приложения С#? Я ищу глубокий поиск, который может развернуть объект для многих уровней.

То, что я ищу, - это способ поиска (например, F3 для поиска документов) внутри очень сложных объектов (при отладке, например, в окне Quick watch).

4b9b3361

Ответ 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 в строке меню и перейдите в раскрывающееся меню окон. Там вы увидите локальных жителей. Это скажет вам, какие значения ваши переменные находятся на ваших текущих контрольных точках. Вы также можете глубоко погрузиться во все ваши объекты, а также через древовидное меню. Чтобы найти конкретный объект, вы можете посмотреть, а затем ввести переменную, которую вы хотите посмотреть там. Убедитесь, что у вас есть точки останова в нужном месте. Удачи!