Точка останова, которая прерывается при изменении данных на управляемом языке - PullRequest
14 голосов
/ 28 сентября 2010

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

Итак, я хотел бы установить точку останова Visual Studio, которая будет приостанавливать работу программы в момент изменения этого значения. Условная точка останова не будет работать в этом сценарии, так как я понятия не имею, что удаляет эту точку останова.

Другими словами, я хочу, чтобы моя программа остановилась в тот момент, когда myList.Count оценивает новый номер.

Есть идеи, как это сделать?

Ответы [ 9 ]

16 голосов
/ 28 сентября 2010

Это невозможно в C # и других языках .NET из-за ограничений CLR. Отладчик собственного кода Visual Studio поддерживает точки останова данных ( link ) для кода C ++, которые делают именно это, но это не поддерживается для управляемого кода. Вы можете попытаться прервать или перехватить вызовы методов Add и Remove для коллекции, как было предложено в другом ответе на этот вопрос.

9 голосов
/ 28 сентября 2010

Как насчет замены List<T> на ObservableCollection<T> и прослушивания события CollectionChanged?Он реализует интерфейс IList<T>, поэтому в доступных методах должно быть достаточно совпадений для обеспечения синтаксической и семантической совместимости.

2 голосов
/ 28 сентября 2010

Я предполагаю, что Visual Studio является IDE.

Установите точку останова, щелкните ее правой кнопкой мыши, выберите условие, введите myList.Count и выберите «Изменено».

2 голосов
/ 28 сентября 2010

Список подклассов со своим собственным классом, затем переопределите Count (или Add / Remove) и добавьте точку останова в метод, который вы создаете.

EDIT: Как упоминалось в комментариях, это потребовало бы большогомного усилий, так как методы Add и Remove не являются виртуальными;потребовалось бы полное переписывание методов.

Кроме того, создание подкласса Collection , по-видимому, было бы лучшим решением (хотя я не могу понять причину, по которой Add / Remove не являются виртуальными членами для Collection либо; комментарии?).

1 голос
/ 02 апреля 2019

Это теперь возможно в Visual Studio 2019. См. Примечания к выпуску здесь: https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes

В этой статье подробно рассматриваются предварительные версии 2. https://devblogs.microsoft.com/visualstudio/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

1 голос
/ 28 сентября 2010

Возможно, это больше вопрос, чем ответ, но вы можете войти в код Framework при отладке, если вы настроите Visual Studio таким образом.Возможно, вы сможете поместить точку останова в фактическую реализацию List.

1 голос
/ 28 сентября 2010

Найдите все случаи использования этого конкретного свойства и добавьте точку останова ко всем строкам, которые удаляют элементы из этого списка.

Или вы можете создать собственную реализацию IList и установить точку останова для метода Remove (вы не можете создать подкласс Listбез изменения всех ваших клиентов, потому что List :: Remove не является виртуальным).

1 голос
/ 28 сентября 2010

Вы можете установить точки прерывания данных в Visual Studio, но это будет трудно сделать для управляемого кода, так как сборщик мусора может перемещать объект. Тем не менее, вы все еще можете осуществить это. Вам нужно будет включить встроенную отладку для вашего процесса. Загрузите SOS в ближайшем окне и используйте! DumpObject, чтобы найти адрес резервного хранилища для свойства Count. Используя этот адрес, создайте новую точку останова данных с этим адресом, а затем продолжите и вызовите проблему.

0 голосов
/ 28 сентября 2010

это может звучать слишком необычно или сложно, но вы можете использовать таймер / фоновый поток, чтобы продолжать тестировать значение счетчика и делать Debugger.Break() всякий раз, когда обнаруживает, что значение отличается от предыдущего экземпляра.

...