Когда точки останова могут изменить выполнение вашего кода? - PullRequest
1 голос
/ 21 апреля 2009

Сегодня я столкнулся с очень странной ошибкой. У меня есть кнопка в форме, нажатие на которую приводит к заполнению сетки на моей форме данными. Если дважды щелкнуть кнопку, произойдет сбой, когда «Ссылка на объект не установлена ​​для экземпляра объекта».

В итоге я установил точку останова в начале подпрограммы, которая обрабатывает население этой сетки, и обнаружил, что ... она больше не падает. Я нажимал кнопку, нажимал «F5» в Visual Studio, и он не падал. Я сделал это, по крайней мере, 10 раз, это было исправлено.

Затем я удалил точку останова, нажал F5, нажал кнопку, и она вылетела. Добавление точки останова обратно позволяет ей работать.

Может кто-нибудь объяснить, что здесь происходит? Используемая мной сетка - это сторонний элемент управления (Infragistics), а приложение - приложение WinForms. Я не делаю никаких потоков - моя единственная мысль - что-то вроде «состояния гонки»? Но даже это не имеет смысла для меня.

РЕДАКТИРОВАТЬ: Это приложение VB.Net / Visual Studio 2008

Ответы [ 4 ]

5 голосов
/ 21 апреля 2009

Здесь может происходить некоторая асинхронная загрузка данных. Добавление точки останова дает асинхронной части время для завершения. Когда вы нажимаете на него слишком быстро, он все еще ожидает окончания загрузки данных или чего-то еще, поэтому возникает ошибка. Возможно, вы не реализовали это, но сторонний элемент управления может иметь.

4 голосов
/ 21 апреля 2009

Звучит как проблема синхронизации, и на заднем плане должно быть какое-то многопоточность - возможно, в стороннем контроле.

Можете ли вы получить стек вызовов из исключения?

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

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

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

1 голос
/ 21 апреля 2009

Еще одна возможность ...

Зачастую точки останова могут изменить поведение процесса во время выполнения, ЕСЛИ вы смотрите на код в точке останова. Например, если вы наводите указатель мыши на свойство или открываете окно locals, свойства будут оцениваться на лету, прежде чем переходить к следующему коду.

Поскольку метод получения свойства в действительности является просто методом, плохо написанный класс может фактически выполнять «дополнительную» работу со свойством, которое предотвращает сбой кода.

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

1 голос
/ 21 апреля 2009

Я думаю, это связано со временем, которое требуется для ручной отладки. Возможно, у вас есть что-то тяжелое, работающее (возможно, соединение с базой данных), которое при отладке успевает завершиться, но когда не отлаживается, происходит сбой приложения

...