Если я напишу это:
class Program
{
static void Main(string[] args)
{
throw new Exception("lol");
}
}
и запусту exe из командной строки, я получу две записи в моем журнале событий.Одна из них - ошибка приложения, которая говорит о том, что было необработанное исключение, а другая содержит трассировку стека с источником как .NET Runtime.
Если я напишу это:
class Program
{
static void Main(string[] args)
{
Recurse4Evr();
}
static void Recurse4Evr()
{
Recurse4Evr();
}
}
Я толькополучить одну запись в моем журнале событий, в которой говорится об ошибке приложения и исключении переполнения стека.Второй записи с трассировкой стека нет, поэтому она в принципе бесполезна.
Почему трассировка стека также не записывается в журнал?Если я установлю DebugDiag и прикреплю его к своему процессу, а затем произойдет переполнение стека, DebugDiag сможет записать трассировку стека.Очевидно, что трассировка стека в некотором роде доступна внешнему миру.Если среда выполнения завершает процесс, потому что он обнаружил переполнение стека, он также знает, что такое стек.
В больших приложениях, которые имеют много сложных взаимодействий, часто невозможно воссоздать условия, которые привели к переполнению стека.В этой ситуации трассировка стека является единственным способом выяснить, что произошло.Почему Microsoft решила, что не важно регистрировать эту информацию?Было ли законное дизайнерское решение, которое не очевидно?