2010-05-26 2 views
5

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

+0

Почему отладчик не является опцией? Именно для этого и есть. –

+0

@ 0xA3 Поскольку мне нужно получить доступ к этим значениям из моего приложения во время выполнения, только когда они меняются. – luvieere

+0

Как записать значения изменений переменной в простой файл журнала. – Shivam

ответ

3

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

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

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

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

+0

⁺¹ для ответа, однако я немного не согласен с точкой большого замедления простой условной точки останова. Поскольку C# преобразуется в байт-код, наиболее подходящим способом для отладчика является просто создание и вставка байт-кода, который печатает значение вместо значения. Я не вижу причины, почему это невозможно сделать именно таким образом - и, следовательно, другая реализация точки останова отладчика, которую я бы назвал ошибкой производительности. –

+2

Нет, C# преобразуется в машинный код, IL - это только промежуточный шаг. Используйте Debug> Windows> Демонтаж, чтобы увидеть его. Особенность, а не ошибка. –

0

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

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

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

+0

Как отладчик делает это для любых переменных? Разве нет библиотеки отладки, которая могла бы помочь мне достичь такого же уровня отслеживания? – luvieere

3

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

http://www.sharpcrafters.com/postsharp

0

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

Для образца, как реализовать это увидеть

How to: Implement the INotifyPropertyChanged Interface

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

+0

Я упомянул в вопросе, что меня интересуют произвольные переменные, а не свойства. Я знаю об INotifyPropertyChanged, я не знаю, как отслеживать произвольные переменные, как это делает отладчик. – luvieere

1

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

Смежные вопросы