Зарегистрировать StackOverflowException в .NET.
Недавно у меня было исключение в моем приложении .NET(веб-сайт asp.net), который я знаю, потому что он появился в моем EventLog. Я понимаю, что исключение StackOverflow невозможно поймать или обработать, но есть ли способ зарегистрировать его до того, как он уничтожит ваше приложение? У меня есть 100k строк кода. Если бы я знал трассировку стека или только часть трассировки стека, я мог бы отслеживать источник бесконечного цикла/рекурсии. Но без какой-либо полезной диагностической информации, похоже, что потребуется много догадок и тестов.
Я попытался настроить обработчик обработанных исключений в моем домене приложения (в global.asax), но это, похоже, не выполнялось, что имеет смысл, если переполнение стека должно заканчиваться и не запускать блоки catch/finally,
Есть ли способ зарегистрировать их или есть какой-то секретный параметр, который я могу включить, который сохранит фреймы стека на диск при сбое приложения?
Ответы
Ответ 1
Лучше всего использовать ADPlus.
Отладочная команда ядра Windows NT имеет приятный пост в блоге о том, как с ним перехватывать исключения CLR. Есть много подробностей о том, что там существуют разные варианты конфигурации.
ADPlus будет контролировать приложение. Вы можете указать, что он запускается в режиме сбоя, чтобы вы могли сообщить ADPlus, что он берет дамп памяти так же, как происходит исключение StackOverflowException.
Как только у вас есть дамп памяти, вы можете использовать WinDbg и управляемое расширение отладки, например Psscor, чтобы узнать, что происходит во время.
Ответ 2
Очень разумно спросить о StackOverFlowException в StackOverflow:)
AFAIK, о единственном, что вы можете сделать, это получить свалку при аварии. CLR собирается отнять вас, если вы не разместите свою собственную среду CLR.
Связанный вопрос о получении дампа рабочего процесса IIS при сбое:
Вот пара других связанных с SO потоков:
Надеемся, что эти указатели помогут.
Ответ 3
Вы можете попробовать зарегистрировать сообщения в ключевых точках приложения и вынуть часть, в которой ломается поток сообщений журнала.
Затем попробуйте и скопируйте его в этот раздел кода, используя модульные тесты.
Единственный способ получить трассировку для ошибки, о которой я знаю, заключается в том, чтобы иметь промежуточный уровень, делающий моментальные снимки текущего кода и записывая это. Это всегда имеет большое влияние на производительность.