Подтвердить что ты не робот

Зарегистрировать StackOverflowException в .NET.

Недавно у меня было исключение в моем приложении .NET(веб-сайт asp.net), который я знаю, потому что он появился в моем EventLog. Я понимаю, что исключение StackOverflow невозможно поймать или обработать, но есть ли способ зарегистрировать его до того, как он уничтожит ваше приложение? У меня есть 100k строк кода. Если бы я знал трассировку стека или только часть трассировки стека, я мог бы отслеживать источник бесконечного цикла/рекурсии. Но без какой-либо полезной диагностической информации, похоже, что потребуется много догадок и тестов.

Я попытался настроить обработчик обработанных исключений в моем домене приложения (в global.asax), но это, похоже, не выполнялось, что имеет смысл, если переполнение стека должно заканчиваться и не запускать блоки catch/finally,

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

4b9b3361

Ответ 1

Лучше всего использовать ADPlus.

Отладочная команда ядра Windows NT имеет приятный пост в блоге о том, как с ним перехватывать исключения CLR. Есть много подробностей о том, что там существуют разные варианты конфигурации.

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

Как только у вас есть дамп памяти, вы можете использовать WinDbg и управляемое расширение отладки, например Psscor, чтобы узнать, что происходит во время.

Ответ 2

Очень разумно спросить о StackOverFlowException в StackOverflow:)

AFAIK, о единственном, что вы можете сделать, это получить свалку при аварии. CLR собирается отнять вас, если вы не разместите свою собственную среду CLR.

Связанный вопрос о получении дампа рабочего процесса IIS при сбое:

Вот пара других связанных с SO потоков:

Надеемся, что эти указатели помогут.

Ответ 3

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

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

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