Точка останова, которая прерывается при изменении данных на управляемом языке

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

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

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

Любые идеи о том, как это сделать?

Ответы

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Я предполагаю, что Visual Studio - это IDE.

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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