Как я могу отслеживать значения переменной при их изменении во время выполнения на C#? Я заинтересован в том же функциональности, который предоставляет отладчик, когда я отслеживаю переменную с помощью шагов выполнения, только то, что мне нужно вызвать из моего кода. Некоторое наблюдение за ключевыми значениями, но для всех видов переменных (локальный, класс, статический и т. Д.) Не только свойства. Поэтому, в основном, получать уведомление, когда изменяется значение переменной.Как я могу отслеживать переменную во время выполнения на C#?
ответ
Вы работаете исходя из предположения, что отладчик может отслеживать изменения переменных. Это невозможно.
Возможно с неуправляемым кодом, процессор имеет выделенные регистры отладки, которые позволяют устанавливать точки останова данных. Предоставляются до трех. Он генерирует аппаратное прерывание, когда видит, что определенная ячейка памяти записывается. Однако это очень полезная функция недоступна в управляемом коде. Сборщик мусора полностью несовместим с ним, он перемещает объекты вокруг, давая им другой адрес.
Управляемый отладчик поддерживает условие «при попадании» на точку останова, что позволяет сбрасывать информацию в окно вывода. Однако для этого требуется точка останова, она не может быть вызвана изменением значения переменной. Он также действительно замедляет выполнение кода, так как отладчик фактически переходит в состояние прерывания перед выполнением условия.
Очевидное место, где можно поставить такую точку останова, находится в настройщике свойств. Это то, что вам нужно для реализации этой функции в коде. Вы можете делать все, что хотите, в этом сеттере, например, с помощью класса Trace.
⁺¹ для ответа, однако я немного не согласен с точкой большого замедления простой условной точки останова. Поскольку C# преобразуется в байт-код, наиболее подходящим способом для отладчика является просто создание и вставка байт-кода, который печатает значение вместо значения. Я не вижу причины, почему это невозможно сделать именно таким образом - и, следовательно, другая реализация точки останова отладчика, которую я бы назвал ошибкой производительности. –
Нет, C# преобразуется в машинный код, IL - это только промежуточный шаг. Используйте Debug> Windows> Демонтаж, чтобы увидеть его. Особенность, а не ошибка. –
Единственный разумный способ, которым Вы могли бы сделать это без отладчик будет: не использовать переменную, но использовать свойство, и (возможно, условно) добавить след в инкубаторе:
private int myValue;
public int MyValue {
get {return myValue;}
set {
SomeTraceMethod(myValue, value, ...);
myValue = value;
}
}
Очевидно, это не может быть использовано для произвольных полей/переменных.
Как отладчик делает это для любых переменных? Разве нет библиотеки отладки, которая могла бы помочь мне достичь такого же уровня отслеживания? – luvieere
Чтобы добавить к сказанному Марку, если вы хотите сделать это для множества свойств и методов, вы можете проверить методы аспектного программирования и библиотеки, такие как PostSharp.
Как другие упоминали механизм как это имеет смысл только при использовании свойства. В .NET вы можете использовать интерфейс INotifyPropertyChanged
.
Для образца, как реализовать это увидеть
ссылочного переговоры статьи явно о Windows Forms, но вы не обязаны, что (интерфейс фактически объявлен в пространство имен System.ComponentModel
в System.dll). Фактически, этот интерфейс широко используется для сценариев привязки данных, например. в WPF.
Я упомянул в вопросе, что меня интересуют произвольные переменные, а не свойства. Я знаю об INotifyPropertyChanged, я не знаю, как отслеживать произвольные переменные, как это делает отладчик. – luvieere
Управляемый отладчик использует COM API ICorDebug
для почти всего. Часть, которую вас интересует, это ICorDebugValue
и ее потомки. Обратите внимание, что LOT отладочного API требует, чтобы процесс не выполнялся (т. Е. Столкнулся с точкой останова), чтобы выполнялись различные проверки.Высокий уровень обзора ICorDebug
- here. Документация по этому вопросу немного редка, но некоторые из них могут помочь. Удачи.
- 1. Как отслеживать во время выполнения (flex)
- 2. Создать переменную во время выполнения
- 3. Изменить переменную на литерал во время выполнения?
- 4. Как отслеживать время выполнения процедуры?
- 5. Отслеживать процесс выполнения во время вызова метода.
- 6. Следить/контролировать переменную во время выполнения?
- 7. Как я могу изменить авторизацию уровня выполнения во время выполнения?
- 8. Как я могу запросить разрешение во время выполнения на Android?
- 9. Как я могу перегрузить функцию во время выполнения на Схеме?
- 10. C инициализаторы во время выполнения
- 11. Как я могу отслеживать, что происходит во время загрузки XAML?
- 12. как я могу отслеживать события на объектах времени выполнения
- 13. Java: Могу ли я внедрить исключение во время выполнения во произвольный метод класса во время выполнения?
- 14. Как я могу манипулировать docx во время выполнения
- 15. Проверить переменную, чтобы установить значение класса во время выполнения C#
- 16. Получить переменную времени компиляции во время выполнения
- 17. Как отслеживать Dsl/DslPackage во время выполнения (Visual Studio VS2012)
- 18. Создайте переменную типа, известного только во время выполнения (C#)
- 19. C++ компиляция во время выполнения
- 20. C++ devirtualization во время выполнения?
- 21. Как я могу получить имя запускающей очереди во время выполнения?
- 22. Как я могу увидеть, как выглядит winform во время выполнения?
- 23. Препроцессор C во время выполнения?
- 24. Должен объявить скалярную переменную во время выполнения
- 25. Как отслеживать сообщение об ошибке exeception во время выполнения процедуры
- 26. Как отслеживать отслеживание мыла во время выполнения в dll
- 27. Создать переменную во время выполнения в Objective-C
- 28. Как я могу отслеживать трафик приложения Время в объекте c
- 29. Как я могу получить данные комментария #pragma во время выполнения?
- 30. Как разбить символ C++ во время выполнения?
Почему отладчик не является опцией? Именно для этого и есть. –
@ 0xA3 Поскольку мне нужно получить доступ к этим значениям из моего приложения во время выполнения, только когда они меняются. – luvieere
Как записать значения изменений переменной в простой файл журнала. – Shivam