Отладка .NET / C #: как отладить классический Heisenbug?

Недавно я столкнулся с классическим Гейзенбуг . Вот ситуация:

  • У меня есть древовидный список, главное представление на одной панели и подробное представление на другой панели справа, которое отображает информацию о текущем выбранном узле дерева. (Очень похоже на проводник Windows.)
  • Когда я добавляю новый узел в дерево (представьте, как щелкнуть правой кнопкой мыши папку в проводнике Windows и сказать «Создать -> Папка»), вновь созданный узел будет выбран.
  • И вот ошибка: подробный вид справа должен обновиться, чтобы показать новый узел. Однако это не так. Мне нужно переключиться на другой узел дерева один раз, прежде чем я смогу увидеть информацию о новом узле в подробном представлении.

Ошибка легко воспроизводима и возникает как в конфигурациях сборки «Release», так и «Debug». Но: как только я устанавливаю точку останова в обработчике событий (для пункта меню «Добавить новый узел») и включаю его, все работает нормально => Heisenbug! Мне не нужно заниматься настоящей отладкой. Достаточно щелкнуть «продолжить» после того, как точка останова будет достигнута.

Для лучшего понимания я сделал видео , которое должно проиллюстрировать, что происходит.

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

Я был бы очень признателен за любые предложения о том, что я мог бы попытаться определить причину проблемы . Или, может быть, кто-то догадывается о причине?

Я нацелен на фреймворк 3.5 и использую x86 в качестве платформы решения. Элемент управления древовидным списком взят из элементов управления WinForms DevExpress ; Версия Visual Studio - 2010.

Спасибо


Обновление 3: Проблема решена . Проблема заключалась в том, что вызов метода Focus () подробного представления не запускал событие GotFocus, которое имеет решающее значение для обновления подробного представления. (Я не знаю, почему, возможно, он уже был в фокусе.) Однако метод не отказал, он просто ничего не сделал.

Теперь я просто фокусирую другой элемент управления, прежде чем сфокусироваться на подробном представлении, и все. Причина, по которой все работало нормально во время отладки, заключалась в том, что переключение с Visual Studio обратно на мое приложение правильно установило фокус на подробном представлении.

Основным препятствием при поиске этой проблемы было то, что установка точки останова в обработчике событий GotFocus бесполезна : каждый раз, когда вы пытаетесь переключиться обратно с Visual Studio в приложение, событие GotFocus запускается повторно, и вы застреваете в бесконечном цикле. Комментарии о том, как это можно обойти, приветствуются.

В любом случае, моя конкретная проблема решена.

Большое спасибо всем, кто ответил или прокомментировал. Это мне очень помогло.


Обновление 2: В моем коде я выбираю только что созданный узел в дереве. Это вызывает событие FocusedNodeChangedEvent. В соответствующем обработчике событий я обновляю подробное представление и вызываю его метод Focus ().

Кажется, что это не удается, когда не установлена ​​точка останова. Я думаю, что правильное обновление во время отладки запускается тем, что подробное представление автоматически получает фокус.


Сообщения окна

Обновление 1: Вот сообщения окна, которые предоставил ответ Эдди. (Длинный список удаленных сообщений)

16
задан berntie 8 August 2011 в 13:34
поделиться