Исключительная среда выполнения GNAT = сообщение EXCEPTION_STACK_OVERFLOW
Я пытаюсь запустить свое приложение после компиляции с помощью AdaCores GPS (Gnat Programming Studio).
Я получаю ошибку во время выполнения
Exception name: STORAGE_ERROR
Message: EXCEPTION_STACK_OVERFLOW
Я получаю эти ошибки во время выполнения, несмотря на установку размера стека в опциях связующего с помощью
-d65535 (размер стека задач) и -D65535 (размер вторичного стека) (я также пробовал 65535k на обоих, а также на 655 м).
Приложение хорошо работает при компиляции с помощью компилятора Aonix Object Ada. В компиляторе Aonix я установил размер стека - 65535, размер вторичного стека - 65535, а размер стека задач - 46345.
Моя главная цель - перенести приложение на компилятор GNAT Ada.
Я заметил, что -d устанавливает размер стека задач и -D размер вторичного стека, но я не вижу, где установить размер основного стека, и я предполагаю, что это проблема с приложением, но, пожалуйста, исправьте меня, если я глядя в неправильном направлении.
Любые указатели будут с благодарностью оценены.
Bearslumber
2 ответа
Если проблема действительно является главной задачей, обходной путь - перенести основную процедуру в тело вспомогательной задачи.
Во-первых, скомпилируйте для отладки (-g) (могут быть и другие релевантные опции; публикация неверной информации - самый быстрый способ их найти;-), и вы должны получить больше информации: исходная строка и файл, вызвавший исключение. Или трассировку стека, которую вы можете проанализировать через addr2line.
Это должно помочь понять, почему это поднимает...
- Вы выделяете сотни МБ в стеке? В прошлом у меня было около 200 МБ...
- Это повышение в одном из контейнерных классов или в RTS?
- Является ли сообщение на самом деле вводящим в заблуждение и
new()
выделение кучи не удалось? Другие вещи, кроме стека, могут вызвать Storage_Error, и мне не ясно, как или если обработчик по умолчанию различает причину...
Мы не можем идти дальше по этому пути без дополнительной информации: отредактируйте его в вопросе, и я еще раз посмотрю.
Установка размера стека для задачи среды напрямую невозможна в Gnat. Это часть взаимодействия gcc с ОС и предполагается использовать систему ulimit
настройки для получающегося исполняемого файла (в Linux; другие ОС могут отличаться)...
К сожалению, примерно за период времени gcc/gnat 4.5 я нашел доказательства того, что они игнорировались, хотя, возможно, это было исправлено, и я не возвращался к этой проблеме.
Я видел ответ Алекса, опубликованный в другом месте, как жизнеспособный обходной путь, если настройки трассировки отладки и ulimit не дают ответа, или если вам нужно нажать вместо того, чтобы тратить время на отладку. Чтобы сохранить кодовую базу в чистоте, я бы предложил оболочку, просто создав необходимую задачу и вызвав вашу текущую основную процедуру. Для Aonix вам просто не нужно включать файл оболочки в вашу сборку.