2015-07-16 3 views
4

Есть ли способ отслеживать один экземпляр в C# /. NET в Visual Studio при отладке? Я считаю, что это было бы действительно полезно иногда.Отслеживать экземпляр в C#?

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

В C++ эквивалентность будет контролировать часть памяти, где находится экземпляр, или просто указатель на экземпляр. Этот подход не работает с управляемым кодом, поскольку объекты в .NET перемещаются, поэтому мне нужна эквивалентность для указателей на C++.

Я знаю о WeakReferences в C#, но я не уверен, что они могут использоваться во время отладки?

Редактировать 1: Этот вопрос отличается от «При отладке, есть ли способ определить, является ли объект другим экземпляром?», Поскольку мне не интересно сравнивать две ссылки, но я хочу получить доступ к одному объекту.

ответ

1

Нет ничего, что я знаю из коробки, но VS поддерживает условные точки останова. Одним из вариантов было бы:

  1. Место точек останова на все методы на классе, что вы заинтересованы в
  2. отлаживать через код, пока первый из них не попал
  3. Найти Hashcode из экземпляр
  4. Сделать все точки останова coditional на GetHashCode() == the hash code you previously retrieved
  5. Пусть приложение работать, пока точка останова не будет снова ударил
  6. Посмотрите в окно Call Stack, чтобы увидеть, какая строка кода звонит Метод

Немного неуклюжий, но будет работать ...

0

Добавить часы, как это: https://msdn.microsoft.com/en-us/library/0taedcee.aspx

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

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

+0

Это весьма не работает. Если есть переменная с тем же именем, эта переменная будет показана. Кроме того, если моя переменная не соответствует контексту, часы ничего не показывают. Таким образом, окно просмотра имеет конкретную область действия. –

+0

Правильно, вам просто нужно сформулировать выражение часов в соответствии с тем, где вы хотите посмотреть экземпляр. Внутри класса это может быть «MyProperty», но снаружи это просто «instance.MyProperty». Ваш вопрос: «Есть ли способ отслеживать один экземпляр в C# /. NET в Visual Studio при отладке?» и это действительно самый простой способ сделать это. Если вы передаете экземпляр вокруг, это означает, что больше выражений для учета нового имени, но этот подход хорошо подходит для большинства ситуаций отладки. – Colin

+0

Что делать, если «экземпляр» в настоящее время недоступен из области, от которой я отлаживаю? Я просто хочу, чтобы глобальный способ доступа к одному и тому же объекту, какой бы ни выглядел мой callstak. Опять же, на C++ я могу просто сохранить адрес, т. Е. Указатель, и я всегда могу найти объект, но в указателях C# бесполезны вне небезопасной области. –

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