2015-09-21 4 views
0

Один из моих клиентов сообщил, что программное обеспечение, которое я разрабатываю, неожиданно прекращается. В журнале приложений доступен только текст: Process is terminated due to StackOverflowException. Нет никакой информации, которая помогла бы мне диагностировать и исправлять ее.Есть ли способ распечатать любую расширенную информацию о StackOverflowException?

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

+0

Я нашел URL-адрес, который может помочь http://www.forbeslindesay.co.uk/post/47974551480/a-tip-for-debugging-stack-overflow-exceptions-in, конечно, если вы можете его отладить – wudzik

+5

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

+1

@TimothyGroote Пожалуйста, ответьте как ответы, а не комментарии. Но если вы отправляете это как ответ, это должно быть уменьшено, поскольку это неправильно. Это просто не работает и не может работать для переполнения стека. – hvd

ответ

2

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

Единственный способ, которым вы могли бы обойти это, - отслеживать исключения извне кода, который имеет переполнение стека. Вам нужно будет создать приложение собственного кода для размещения CLR. Если вы это сделаете, вы можете указать, что StackOverflowException не является 100% смертельным исходом. Это кратко упомянуто на StackOverflowException MSDN page:

Если ваше приложение принимает общеязыковой среды выполнения (CLR), можно указать, что CLR должен выгрузить домен приложения, где происходит исключение переполнения стека и пусть соответствующий процесс продолжается. Для получения дополнительной информации см. ICLRPolicyManager Interface.

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

+0

Устраняет ли StackOverflow только конкретный AppDomain, в котором он встречается, или все CLR идет вниз? –

+0

@Asad Разве это не ответ на цитату в моем ответе? В нем говорится, что обычно весь процесс больше не может продолжаться, но если вы сами запускаете среду выполнения, вы можете изменить ее, так что только конкретный домен приложения будет убит. – hvd

+0

Ах да, извините. Не поняла цитату с первого раза, когда я ее прочитал. –

Смежные вопросы