Означает ли сбой приложения со STATUS_STACK_OVERFLOW в приложении .Net, что переполнение стека произошло в машинном коде?

Я получаю сбой приложения с кодом выполнения c00000fd (STATUS_STACK_OVERFLOW) в ntdll.dll.

Означает ли это, что где-то в собственном коде, за пределами моего управляемого кода, произошло переполнение стека? Потому что для управляемого кода у нас есть System.StackOverflowException. Но в моем случае их нет, и нет никакой трассировки стека, которая могла бы дать подсказку.


person Evgeniy Berezovsky    schedule 25.10.2018    source источник
comment
посмотрите на стек вызовов: вероятно, у вас есть рекурсия в вашем .Net-коде. Часто это происходит, когда свойство ссылается на себя....   -  person Mitch Wheat    schedule 25.10.2018
comment
@MitchWheat Я бы хотел, чтобы был стек вызовов - мне нечего было исследовать   -  person Evgeniy Berezovsky    schedule 25.10.2018
comment
@MitchWheat для не носителя языка - к чему это относится? Я бы тоже хотел посмеяться!   -  person Evgeniy Berezovsky    schedule 25.10.2018


Ответы (1)


Вы больше не можете поймать System.StackOverflowException

Начиная с .Net 2.0 их можно поймать только при следующих обстоятельствах.

  • CLR запускается в размещенной среде, где хост специально разрешает обработку исключений StackOverflow.
  • Исключение переполнения стека возникает из-за пользовательского кода, а не из-за фактической ситуации переполнения стека (ссылка)

Хотя в сообщении об ошибке говорится, что она возникла в ntdll.dll, скорее всего, она вызвана вашим кодом.

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

Второй идентификатор начинает отладку (подключение отладчика) и тщательно изучает этот класс метода, пока не найдет его. Скорее всего, это связано с некоторой рекурсией, это первое место, где ищет id.


Дополнительные ресурсы и ссылки

C# перехватывает исключение переполнения стека

Как найти источник StackOverflowException в моем приложение

Как отлаживать System.StackOverflowException без ссылки на исходный код?

Как предотвратить и/или обработать исключение StackOverflowException?

Как отладить исключение stackoverflowexception в .NET

Устранение неполадок с исключениями: System.StackOverflowException

Класс StackOverflowException

В .NET Framework 1.0 и 1.1 можно было перехватывать объект StackOverflowException (например, для восстановления после неограниченной рекурсии). Начиная с .NET Framework 2.0, вы не можете перехватить объект StackOverflowException с помощью блока try/catch, и соответствующий процесс завершается по умолчанию. Следовательно, вы должны написать свой код для обнаружения и предотвращения переполнения стека. Например, если ваше приложение зависит от рекурсии, используйте счетчик или условие состояния, чтобы завершить рекурсивный цикл.

person TheGeneral    schedule 25.10.2018