Есть ли в VS2008 способ найти часы или часы для определенного значения? - PullRequest
2 голосов
/ 01 декабря 2009

Предположим, я что-то наблюдаю в VS2008 и хочу найти объект, за которым слежу, за экземпляром определенного значения.

Например, скажем, я смотрю this, и я хочу найти внутри него элемент управления с именем mycontrol или я хочу найти string, который в настоящее время имеет значение "Hello World".

Я знаю, что это своего рода грубый метод действий, но я нахожу, что это был бы быстрый способ определить, где что-то идет не так во время отладки. Предупреждение: я собираюсь поклясться ... Когда я использовал PHP, я мог видеть все переменные, которые в настоящее время были установлены с помощью get_defined_vars(). Это было грязно, но это было быстро, и я хотел бы знать, могу ли я сделать что-то подобное в VS.

Извините, если бы я был немного расплывчатым, я был бы рад уточнить, если у вас есть вопросы.

Приветствие Иэн

Edit: На самом деле я пытаюсь выяснить текущее состояние приложения и быстро найти различные классы, которые я хочу отлаживать. То, что я делаю, - это попытка отладки там, где у меня нет исходного кода (я пишу элемент управления для CMS). Так что я знаю, какой должна быть ценность чего-либо, но я не знаю, где в структуре это существует - вот что я хочу найти.

например. Приложение создает исключение, поскольку foo должен быть списком типа bar. Я хочу выяснить, где определен foo, чтобы я мог осмотреться и посмотреть, какие другие переменные в этом классе установлены.

Снова извините, мне трудно объяснить: (

Редактировать # 2: Я считаю, что хорошее дерево может помочь мне лучше представить его ...

Quickwatch
-this
 -var1
   +var1a
   +var1b
   -var1c
    -base
     -foo = "Hello World"
    +var1ca
 +var2
 +var3

В приведенном выше, как бы я быстро просверлил структуру, чтобы найти foo?

Ответы [ 4 ]

2 голосов
/ 05 сентября 2011

Вы можете использовать BugAid (надстройка для Visual Studio), которая позволяет искать членов, которые вы хотите видеть из подсказки on-hover-Data или Окно QuickWatch.

См. Пример на следующем скриншоте:

Search Feature

В приведенном вами примере, если вы введете "foo" в строку поиска, Поиск найдет его при поиске как по именам свойств, так и по их значениям.

Полное раскрытие : я являюсь одним из создателей "BugAid".

2 голосов
/ 01 декабря 2009

Звучит так, как будто вы хотите условную точку останова :

Когда местоположение точки останова достигнуто, выражение оценивается и точка останова поражена, только если Выражение верно или изменилось.

Создайте новую точку останова, щелкните ее правой кнопкой мыши и выберите «Условие ...». Введите условие, которое вы хотите дождаться. Это будет что-то вроде:

this.MyString == "Hello World"

РЕДАКТИРОВАНИЕ: Хорошо, теперь я понимаю, что вы хотите опросить другое работающее приложение. Предполагая, что он построен на управляемом языке, вас может заинтересовать Ястребиный глаз :

Ястребиный глаз - единственный инструмент .Net, который позволяет просматривать, редактировать, анализировать и вызвать (почти) любой объект из .Net приложение. Всякий раз, когда вы пытаетесь отлаживать, тестировать, изменять или понимать приложение, Соколиный Глаз может помочь.

Free. Не обновлялся некоторое время.

1 голос
/ 01 декабря 2009

Я написал это на днях. Он сделал свою работу достаточно хорошо (однако это только некоторый служебный код для отладки, поэтому используйте на свой страх и риск -> дизайн довольно плохой> _ <). Сбрасывает поля и выполняет итерацию вниз. Это может быть не идеально, но это решило мою проблему в то время. </p>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

public static class Dumper
{
    public class Dump
    {
        public Dump(bool spacesInsteadOfTab)
        {
            _spacesIndeadOfTab = spacesInsteadOfTab;
        }

        private readonly StringBuilder _sb = new StringBuilder();

        public string Result
        {
            get
            {
                return _sb.ToString();
            }
        }

        private readonly bool _spacesIndeadOfTab;

        private int _currentIndent;
        public int CurrentIndent
        {
            get
            {
                return _currentIndent;
            }
            set
            {
                _currentIndent = value > 0 ? value : 0;
            }
        }

        public void IncrementIndent()
        {
            CurrentIndent += 1;
        }

        public void DecrementIndent()
        {
            CurrentIndent -= 1;
        }

        private void AppendIndent()
        {
            if (_spacesIndeadOfTab)
                _sb.Append(' ', _currentIndent * 4);
            else
                _sb.Append('\t', _currentIndent);
        }

        public void Log(string logValue)
        {
            AppendIndent();
            _sb.AppendLine(logValue);
        }

        public void Log(string logValue, params object[] args)
        {
            AppendIndent();
            _sb.AppendFormat(logValue, args);
            _sb.AppendLine();
        }
    }

    public static Dump TakeDump(object objectToDump, int maxDepth)
    {
        Dump result = new Dump(false);

        int currentDepth = 0;

        TakeDump(ref result, ref currentDepth, maxDepth, objectToDump);

        return result;
    }

    private static void TakeDump(ref Dump result, ref int currentDepth, int maxDepth, object objectToDump)
    {
        currentDepth++;
        if (currentDepth > maxDepth)
        {
            result.IncrementIndent();
            result.Log("MaxDepth ({0}) Reached.", maxDepth);
            result.DecrementIndent();
            return;
        }

        var objectType = objectToDump.GetType();
        result.Log("--> {0}", objectType.FullName);

        result.IncrementIndent();
        var fields = objectType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

        if (fields.Count() == 0)
            result.Log("No fields");

        foreach (var fieldInfo in fields)
        {
            var fieldValue = fieldInfo.GetValue(objectToDump);

            if (fieldValue == null)
                result.Log("{0} is null", fieldValueType.FullName, fieldInfo.Name);

            var fieldValueType = fieldValue.GetType();

            if (fieldValueType.IsValueType)
                result.Log("{2} as {0} (ToString: {1})", fieldValueType.FullName, fieldValue.ToString(), fieldInfo.Name);
            else
                TakeDump(ref result, ref currentDepth, maxDepth, fieldValue);
        }
        result.DecrementIndent();
    }
}
0 голосов
/ 01 декабря 2009

Похоже, вы представляете функцию, которая спускается вниз по дереву, представленному в пользовательском интерфейсе отладчика, в поисках введенного значения. Это не особенность отладчика в настоящее время (хотя на первый взгляд это звучит удобно). Это будет иметь проблемы, хотя в случаях, когда выражение имеет бесконечные расширения.

Например, круговые ссылки вызовут бесконечное расширение. Их довольно легко отследить, но есть и другие гнусные уловки, которые можно сделать, чтобы сделать бесконечное расширение труднее / невозможно отследить. Правда, мы могли бы, вероятно, контролировать глубину и тому подобное ...

Я думаю, что вам лучше всего написать механизм поиска, основанный на отражении, с механизмом контроля глубины. Затем вызовите этот API из окна отладчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...