Как изменить размер стека по умолчанию для управляемого исполняемого файла.

Мы обнаружили, что одна из наших автоматически сгенерированных сборок бросает StackOverflowException в new(). Этот класс имеет (по-моему, мне) 400+ простых свойств, которые инициализируются (большинство по умолчанию (строка) и т.д.) В конструкторе.

Мы замечаем, что его штраф на 64 бита, но на 32 бита он бьет!

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

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

Пояснения к стеку над потоком. Мы сузили ошибку в соответствующем конструкторе. Мои первые впечатления были также типом бесконечной рекурсии. Однако мы воспроизвели ошибку с помощью 3-строчного консольного приложения, которое:

  • создает пустой экземпляр класса.
  • вызывает нестатический метод (Clone) для класса, для которого первым заданием является создание и пустой экземпляр, готовый передать свойства.

Он идет, когда он попадает во второй конструктор.

теперь отлаживая исходный код .net, мы видим, что переполнение стека находится в Guid.NewGuid(), который передается в качестве второго параметра конструктору. Фактическая строка кода - это вызов собственного вызова CoCreateGuid().

Поэтому, хотя это может быть ошибка в CoCreateGuid(), мы хотим исключить наш код из проблемы. Моя первая мысль состоит в том, чтобы увеличить размер стека в массовом порядке и посмотреть, повторяется ли эта ошибка. Затем, поскольку я думаю, что мы можем контролировать все варианты использования, заменяет конструктор инициализацией объекта - думаю, это может уменьшить давление на стек.

Nb. Мы можем остановить эту ошибку, удалив только из свойства int из класса.

Ответ 1

Вы можете использовать editbin для изменения размера стека для исполняемого файла. Вы не можете сделать это в app.config, насколько мне известно.

Другой вариант (также упоминаемый на этой странице) заключается в создании нового потока с "правильным" размером стека. На странице упоминаются плюсы и минусы этого подхода.

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

EDIT: Альтернативное предложение...

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

Если бы вы могли дать нам представление о том, как выглядит конструктор, это очень поможет. Вы также можете использовать ildasm, чтобы узнать, что он утверждает, что размер стека будет для этого конструктора.

Просто, чтобы проверить, это класс, а не структура, правильно?