2014-11-12 4 views
0

У меня есть страница, на которой я тестирую вещи, поэтому это не очень важно для исправления, но я хотел бы знать, что вызывает это исключение. Страница очень проста. У меня есть функция, называемая MakeTheData, что составляет около 38 000 строк с добавлением точек данных. Я заметил, что при запуске страницы я получал исключение переполнения стека.Исключение Stackoverflow без заметной причины

Здесь вы можете увидеть, что он достигает точки останова, чтобы вызвать функцию. Я затем продолжить ....

enter image description here

И теперь я получаю исключение переполнения стека, даже не попав в первую контрольную точку в функции. Как это происходит?

enter image description here

ответ

6

MakeTheData Split на несколько частей или попробовать сборку выпуска. Я думаю, что среда выполнения .NET пытается выделить пространство для 38000 локальных переменных (DataPoint) при входе в функцию, и это вызывает переполнение стека сразу.

Обновление: плюс, как @JonSkeet сказал, не делайте такие огромные функции вообще в первую очередь. Мне все еще интересно, исправлено ли это с помощью optmized build.

+9

Или, в идеале, поместите все эти данные в текстовый файл некоторого описания и загрузите его таким образом, а не поместите все в код вообще. Это упростит поддержку * и * избежать этой проблемы ... –

+0

Правда, это самая важная часть, никакая функция не должна быть такой большой. – fejesjoco

+0

@fejesjoco Да, я бы никогда не сделал такую ​​функцию для производственного кода. Это было просто быстро, что я собрал вместе. Ваше предложение работало, кстати, спасибо за помощь! – Justin

0

Исключение StackOverflowException может возникать по ряду причин; то, что на самом деле говорит об ошибке, заключается в том, что в потоке закончилось пространство стека для хранения локальных переменных. Так получилось, что тот, с кем мы больше всего знакомы, - это классический «рекурсивный призыв, который никогда не раскручивается».

Насколько возможно, ваша DataPoint является структурой? Возможно, что он выделяет локальную переменную для каждой строки «новый DataPoint», что означает, что размер будет размером структуры * 38000. Учитывая, что вы не будете иметь стек этого потока для себя (стек ASP.NET запрос-трубопровод будет сидеть прямо поверх вашего вызова метода), у вас может не хватить много места.

Один из способов (и, возможно, самый простой способ) - обойти это, чтобы разбить вызов метода на несколько методов; Таким образом, распределение памяти будет уменьшаться и избежать выдувания стека.

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