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

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

Ответы [ 5 ]

3 голосов
/ 26 мая 2010

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

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

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

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

3 голосов
/ 26 мая 2010

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

http://www.sharpcrafters.com/postsharp

1 голос
/ 26 мая 2010

Управляемый отладчик использует COM-интерфейс ICorDebug почти для всего. Интересующая вас часть - ICorDebugValue и ее потомки. Обратите внимание, что МНОГО API отладки требует, чтобы процесс не выполнялся (то есть встретился с точкой останова), чтобы были выполнены различные проверки. Общий обзор ICorDebug здесь здесь . Документация по нему довольно скудная, но некоторые поиски в Google могут помочь. Удачи.

0 голосов
/ 26 мая 2010

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

Пример того, как это реализовать, см.

Как: реализовать интерфейс INotifyPropertyChanged

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

0 голосов
/ 26 мая 2010

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

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

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

...