Исключительная среда выполнения 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 вам просто не нужно включать файл оболочки в вашу сборку.

Другие вопросы по тегам