Как отловить исключение, которое не произойдет при отладке? - PullRequest
0 голосов
/ 31 марта 2009

У меня есть некоторый код обработки изображений, который выполняется в фоновом потоке и обновляет элемент управления изображения в потоке пользовательского интерфейса, когда он завершает обработку с помощью Dispatcher.BeginInvoke (). Когда я запускаю свое приложение вне отладчика, оно довольно часто вылетает. Как только я запускаю его в отладчике, я не могу этого добиться вообще. Видимо, разница во времени достаточна, чтобы сделать мою жизнь несчастной прямо сейчас; -)

Я пытался поместить блоки try / catch вокруг любого кода, который кажется актуальным, и регистрировать любые ошибки, которые появляются, но безрезультатно - он почему-то ускользает от меня, и я не уверен, где еще искать.

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

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

Любые предложения о том, как поступить?

Edit:

  1. Я использую System.Diagnostics.Trace.WriteLine () с DbgView во всех возможных местах. Я могу отследить, где, по-видимому, происходит исключение, я не могу выяснить, что такое , что является исключением, и это важно.
  2. Раньше я использовал WinDBG + SOS для отслеживания утечек памяти, но не для выявления труднодоступных исключений. Кто-нибудь может предложить ресурсы для использования WinDBG + SOS в этом качестве?

Ответы [ 3 ]

2 голосов
/ 31 марта 2009

Лишь с несколькими исключениями каждый BeginInvoke должен иметь соответствующий EndInvoke аналог (см. Здесь для более подробную информацию, почему , одно исключение, например, Control.BeginInvoke).

Отсутствие EndInvoke может быть причиной того, что исключение не перехватывается основным потоком и ваше приложение завершается.

Поскольку в вашем особом случае вы имеете дело с Dispatcher (который не реализует EndInvoke), вам придется обработать событие Dispatcher.UnhandledException , чтобы перехватить любое исключение, выданное во время выполнения делегата. .

Кстати, хороший инструмент для мониторинга сообщений System.Diagnostics.Trace - это DbgView от Sysinternals.

1 голос
/ 31 марта 2009

Как вы можете быть уверены, что это исключение, когда вы его никогда не ловили?

Кроме того, вместо размещения блоков try / catch повсеместно, размещайте их на границах, особенно на границах потоков. Поместите их вокруг любых методов ThreadStart или другого кода, вызываемого BeginInvoke, или методов обратного вызова и т. Д.

0 голосов
/ 31 марта 2009

Можете ли вы поместить один try / catch в статический Main, вызываемый при запуске приложения? Таким образом, при сбое приложения вы можете вывести информацию о трассировке стека и об исключении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...