Обработка грубых прерываний приложений в .NET - PullRequest
5 голосов
/ 04 февраля 2010

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

У меня естьПриложение C #, которое не работает на клиентском сайте таким образом, что я не могу воспроизвести локально.К сожалению, мне очень трудно (невозможно) получить какую-либо информацию, которая вообще помогает изолировать источник проблемы.

У меня есть довольно обширная структура мониторинга ошибок, которая отслеживает необработанные исключения ввсе обычные места:

  • Обработчик исключений Backstop в потоках, которыми я управляю
  • Application.ThreadException для исключений WinForms
  • AppDomain.CurrentDomain.UnhandledException

Который регистрирует подробную информацию в месте, где у меня есть к ней доступ.

В прошлом это было очень полезно для выявления проблем в рабочем коде, но не давало мне никакой информации о текущемсерия проблем.

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

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

Я надеялся, что смогу реализовать класснаследуется от CriticalFinalizerObject и заставляет его выдавать сообщение об ошибке последнего шанса при его удалении, но, похоже, это не срабатывает в сценарии StackOverflow, который я тестировал.

Я не могу использовать Windows Error Reporting и друзей из-за отсутствия сертификата для подписи кода.

Я не пытаюсь «восстановиться» от произвольных исключений, я просто пытаюсьчтобы записать, что пошло не так на пути вниз.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Если вы сделали то, что заявляете:

  • Try-Catch в приложении. Запуск
  • Необработанные доменные исключения
  • Исключения необработанных потоков
  • Попробуйте обработчики Catch во всех потоках

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

Вы, конечно, не дали достаточно информации.

  • Какие события, по словам клиента, приводят к исключению?
  • Какие COM или сторонние компоненты вы используете? (Правильно ли вы создаете экземпляр этих компонентов и ссылаетесь на них? Передаете ли вы действительные аргументы для вызовов функций COM?)
  • Используете ли вы какой-либо неуправляемый - небезопасный код?
  • Вы уверены, , что все вызовы с возможностью броска покрыты try-catch?

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

Посмотрите на ваш код свежим взглядом.

Некоторые ошибки не могут быть обнаружены при ведении журнала.

См. Этот же вопрос для более подробной информации:

StackOverflowException в .NET

Вот ссылка, объясняющая асинхронные исключения (и почему вы не можете восстановить их):

http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=c1898a31-a0aa-40af-871c-7847d98f1641

1 голос
/ 04 февраля 2010

Вы можете попробовать создать файл minidump . Это API C ++, но должна быть возможность написать небольшую программу на C ++, которая запускает ваше приложение, сохраняет дескриптор процесса, ожидает дескриптор процесса, а затем использует дескриптор процесса для создания мини-дампа, когда приложение умирает.

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