Портирование приложения Unix ada в Linux: ошибка при запуске программы до ее запуска - PullRequest
1 голос
/ 29 июня 2009

Я - стажер, которому предложили перенести тестовое приложение из Solaris в Red Hat. Приложение написано на Аде. Это прекрасно работает на стороне Unix. Я скомпилировал его на стороне Linux, но теперь он дает мне ошибку в сегменте. Я запустил отладчик, чтобы увидеть, где была ошибка, и получил это:

Warning: In non-Ada task, selecting an Ada task. => runtime tasking structures have not yet been initialized. <non-Ada task> with thread id 0b7fe46c0 process received signal "Segmentation fault" [11] task #1 stopped in _dl_allocate_tls at 0870b71b: mov edx, [edi] ;edx := [edi]

Эта ошибка сегмента происходит до того, как будут сделаны какие-либо вызовы или что-либо инициализировано. Мне сказали, что «задания» в ada запускаются до остальной части программы, и проблема может быть в задаче, которая выполняется.

Но вот кикер. Эта программа просто генерирует некоторый код для использования другой программой. ДРУГАЯ программа, скомпилированная под linux, выдает тот же тип ошибки seg с тем же типом сообщения об ошибке. Это наводит меня на мысль, что может быть какая-то небольшая хитрость, которую я могу использовать, чтобы исправить все это, но у меня просто недостаточно знаний о Unix, Linux и Ada, чтобы понять это самостоятельно.

Ответы [ 3 ]

1 голос
/ 07 июля 2009

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

Есть несколько способов исправить это. Один из способов - переместить все локальные данные задачи в глобальные области пакета. Другой - динамически распределять все это.

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

for My_Task_Type_Name'Storage_Size use Some_Huge_Number;

заявление. Вы также можете использовать «pragma Storage_Size (My_Task_Type_Name)», но я думаю, что выражение «для» предпочтительнее.

Наконец, с Gnat вы также можете изменить размер стека задач по умолчанию с флагом -d на gnatbind.

0 голосов
/ 29 декабря 2009

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

(Какова вероятность выяснить, в чем заключалась настоящая проблема, спустя месяцы после того, как вопрос был задан?)

0 голосов
/ 29 июня 2009

От всей души, если код использовался на машинах Sparc, и теперь вы работаете на компьютере с архитектурой x86, у вас могут возникнуть проблемы с порядком байтов.

Это не очень помогает, но это распространенная ошибка при переходе на мультиплату.

...