Как я могу проследить переменную во времени выполнения в C#?

Как я могу отследить значения переменной, когда они изменяются, во времени выполнения, в C#? Я интересуюсь той же функциональностью, которую обеспечивает отладчик, когда я прослеживаю переменную через шаги выполнения, только что я должен призвать его из своего кода. Своего рода наблюдение значения ключа, но для всех видов переменных (локальный, класс, статичный, и т.д.), не только свойства. Так, в основном получите уведомление, когда значение переменной изменится.

5
задан luvieere 26 May 2010 в 10:47
поделиться

5 ответов

Вы работаете, исходя из предположения, что отладчик может отслеживать изменения переменных. Не может.

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

Управляемый отладчик поддерживает условие «при попадании» в точку останова, позволяя выгружать информацию в окно вывода. Однако для этого требуется точка останова, она не может быть вызвана изменением значения переменной. Это также действительно замедляет выполнение кода, поскольку отладчик фактически переходит в состояние прерывания перед выполнением условия.

Очевидное место для установки такой точки останова - средство задания свойств. Это то, что вам понадобится для реализации этой функции в коде. В этом сеттере вы можете делать все, что захотите, например, используя класс Trace.

3
ответ дан 14 December 2019 в 08:44
поделиться

Как отмечали другие, подобный механизм имеет смысл только при использовании свойств. В .NET вы можете использовать интерфейс INotifyPropertyChanged .

Пример его реализации смотрите в статье

Как: Implement the INotifyPropertyChanged Interface

В статье по ссылке явно говорится о Windows Forms, но вы не привязаны к этому (на самом деле интерфейс объявлен в пространстве имен System.ComponentModel в System.dll). На самом деле, этот интерфейс широко используется для сценариев связывания данных, например, в WPF.

0
ответ дан 14 December 2019 в 08:44
поделиться

Единственный разумный способ сделать это без отладчика: не использовать переменную, а использовать свойство и (возможно, условно) добавить трассировку к установщик:

private int myValue;
public int MyValue {
    get {return myValue;}
    set {
        SomeTraceMethod(myValue, value, ...);
        myValue = value;
    }
}

Очевидно, это не может затем использоваться для произвольных полей / переменных.

0
ответ дан 14 December 2019 в 08:44
поделиться

Чтобы добавить к тому, что сказал Марк, если вы хотите сделать это для множества свойств и методов, вам стоит обратить внимание на методы аспектно-ориентированного программирования и такие библиотеки, как PostSharp.

http://www.sharpcrafters.com/postsharp

3
ответ дан 14 December 2019 в 08:44
поделиться

Управляемый отладчик использует ICorDebug COM API практически для всего. Интересующая вас часть - это ICorDebugValue и его потомки. Обратите внимание, что многие из API отладки требуют, чтобы процесс не был запущен (т.е. встретил точку останова) для того, чтобы произошли различные проверки. Высокоуровневый обзор ICorDebug находится здесь. Документация по нему довольно скудная, но некоторое гугление может помочь. Удачи.

1
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: