OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 12:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 23 Декабрь, 2011 06:36 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Ошибка сегментирования при запросе памяти в Linux
У меня тут выходит ошибка сегментирования с таким сообщением
Код:
~/work$ ./BlackBox
****
* BlackBox
* illegal memory read [ad = BFF42A88]
- Kernel.CheckCandidates  (pc=00002194, fp=BFF429CC)
- Kernel.MarkLocals  (pc=00002389, fp=BFF429E8)
- Kernel.FastCollect  (pc=00002855, fp=BFF429F8)
- Kernel.NewBlock  (pc=00002A52, fp=BFF42A1C)
- Kernel.NewArr  (pc=00000BFC, fp=BFF42A48)
- FibDriver.SetCacheSize  (pc=000004CC, fp=BFF42A70)
- FibDriver.InitCache  (pc=00000576, fp=BFF42A84)
- FibDriver.Driver.EndExec  (pc=00002A78, fp=BFF42AA8)
- FibSqlDB.DoEndExec  (pc=00002419, fp=BFF42AD0)
- FibSqlDB.StdTable.Exec  (pc=000029BA, fp=BFF42B68)
- MyjfsLinFiles.WriteNewFile  (pc=00000331, fp=BFF42BB8)
- MyjfsLinFiles.Process  (pc=0000045B, fp=BFF439EC)
****
Ошибка сегментирования


при попытке запуска
t.Exec('SELECT DATA FROM BIN WHERE BIN_ID=:MyjfsLinFiles.n.n');

DATA - BLOB поле.
Причем, маленькие тесты с BLOB полями проходят нормально.
До этого в программе были многократные выборки из обычных таблиц (без BLOB).
Ошибка обнаруживается как с fb2.1 так и с fb2.5 в Linux (в Windows все проходит нормально.)

Проверял, FibDriver.SetCacheSize размер запрашиваемой через NEW памяти всегда > 0
Видимо, проблема с нехваткой памяти.

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


Последний раз редактировалось Евгений Темиргалеев Пятница, 17 Февраль, 2012 10:19, всего редактировалось 2 раз(а).
изменён заголовок темы


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Декабрь, 2011 07:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Это ошибка при сборке мусора. У Вас нарушена структура памяти.
Где-то "переиграно" с SYSTEM, возможно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Декабрь, 2011 07:32 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Илья Ермаков писал(а):
Это ошибка при сборке мусора. У Вас нарушена структура памяти.
Где-то "переиграно" с SYSTEM, возможно?


Это от прежних структур данных (до вызова запроса с BLOB)?

Я попробовал в LinKernel заменить ассемблерную вставку на закоментированный код на КП
Код:
   PROCEDURE Next (b: Block): Block;   (* next block in same cluster *)
      VAR size: INTEGER;
   BEGIN
      SYSTEM.GET(SYSTEM.VAL(INTEGER, b.tag) DIV 4 * 4, size);
      IF ODD(SYSTEM.VAL(INTEGER, b.tag) DIV 2) THEN INC(size, b.last - SYSTEM.ADR(b.last)) END;
      RETURN SYSTEM.VAL(Block, SYSTEM.VAL(INTEGER, b) + (size + 19) DIV 16 * 16)
   END Next;
(*

   PROCEDURE [code] Next (b: Block): Block   (* next block in same cluster *)
(*
   MOV   ECX,[EAX]   b.tag
   AND   CL,0FCH   b.tag DIV * 4
   MOV   ECX,[ECX]   size
   TESTB   [EAX],02H   ODD(b.tag DIV 2)
   JE   L1
   ADD   ECX,[EAX,4]   size + b.last
   SUB   ECX,EAX
   SUB   ECX,4   size + b.last - ADR(b.last)
   L1:
   ADD   ECX,19   size + 19
   AND   CL,0F0H   (size + 19) DIV 16 * 16
   ADD   EAX,ECX   b + size
*)
   08BH, 008H,
   080H, 0E1H, 0FCH,
   08BH, 009H,
   0F6H, 000H, 002H,
   074H, 008H,
   003H, 048H, 004H,
   029H, 0C1H,
   083H, 0E9H, 004H,
   083H, 0C1H, 013H,
   080H, 0E1H, 0F0H,
   001H, 0C8H;
*)
   
[/code]

Теперь на самый верх выходит Kernel.Next

[code]

****
* BlackBox
* illegal memory read [ad = 00000000]
- Kernel.Next  (pc=00002049, fp=BFAAF0E0)
- Kernel.CheckCandidates  (pc=000021E0, fp=BFAAF10C)
- Kernel.MarkLocals  (pc=000023BE, fp=BFAAF128)
- Kernel.FastCollect  (pc=0000286F, fp=BFAAF138)
- Kernel.NewBlock  (pc=00002A6C, fp=BFAAF15C)
- Kernel.NewArr  (pc=00000BFC, fp=BFAAF188)
- FibDriver.SetCacheSize  (pc=000004CC, fp=BFAAF1B0)
- FibDriver.InitCache  (pc=00000576, fp=BFAAF1C4)
- FibDriver.Driver.EndExec  (pc=00002A78, fp=BFAAF1E8)
- FibSqlDB.DoEndExec  (pc=00002419, fp=BFAAF210)
- FibSqlDB.StdTable.Exec  (pc=000029BA, fp=BFAAF2A8)
- MyjfsLinFiles.WriteNewFile  (pc=00000331, fp=BFAAF2F8)
****
Segmentation fault


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Декабрь, 2011 13:35 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Вот, гадаю: может, это как-то перекликается с реализацией модуля (Lin)HostFiles?

В моём проекте консольный компилятор в Линуксе вылетает с той же ошибкой при попытке перекомпляции модуля Kernel.
Причём, после многочисленных исследований я обнаружил, что каким-то образом повреждается служебная структура данных и затем на этапе кодогенерации падает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Декабрь, 2011 15:37 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Скорее всего, проблема с инициализацией Kernel.baseStack. См. viewtopic.php?p=68857#p68857


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 24 Декабрь, 2011 06:21 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Все заработало, спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 15 Февраль, 2012 19:00 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
В файле BlackBox.c из (LinConsole в первом сообщении) есть такие строки:
Код:
asm ("movl %%esp, %[res]" : [res] "=m" (res) );
skbsProc(res - 8);
// <return adr> <caller ebp> -> base stack = locals of main proc
mainProc()

Что означает эта ассемблерная вставка? Верно ли, что здесь в переменную res сохраняется вершина стека?

(модератор) перенесено из темы: viewtopic.php?f=34&t=1159


Последний раз редактировалось Евгений Темиргалеев Пятница, 17 Февраль, 2012 09:44, всего редактировалось 1 раз.
инф. о переносе


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 15 Февраль, 2012 22:21 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
Что означает эта ассемблерная вставка? Верно ли, что здесь в переменную res сохраняется вершина стека?
Да.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Февраль, 2012 16:51 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Хотел бы прояснить кое-что насчёт запуска через пускач BlackBox.c.
Исходя из описания специфики загрузки библиотеки .so, приведённой выше, корректный сбор мусора сборщиком зависит от корректного значения вершины стека в переменной Kernel.baseStack. Тут понятно.

Цитата:
В результате Kernel.baseStack, запомненный в Kernel.Init, оказывается не верен после возврата управления в сишный пускач и вызова "главной" процедуры Init.
Хотел бы знать: почему?
То есть, если не использовать приладу в виде SetKernelBaseStack, с помощью SYSTEM.GETREG(SP, baseStack) мы получаем некорректное значение. Так выходит?

С другой стороны, какое отношение имеет вершина стека пускача к вершине стека вызываемой библиотеки? У них ведь могут использоваться разные менеджеры памяти, каждый со своим сборщиком мусора.

Вдобавок хотел бы понять, почему в baseStack передаётся значение вершины стека со смещением 8 байт.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Февраль, 2012 10:03 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Код:
// <return adr> <caller ebp> -> base stack = locals of main proc
Роман М. писал(а):
Вдобавок хотел бы понять, почему в baseStack передаётся значение вершины стека со смещением 8 байт.
Роман, изучите соглашения о вызове процедур http://en.wikipedia.org/wiki/Calling_convention, и, думаю, комментарий станет Вам понятен. Если времени мало, более конкретный случай, ближе к теме, с картинкой: http://en.wikipedia.org/wiki/Call_stack


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Февраль, 2012 10:18 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
Цитата:
В результате Kernel.baseStack, запомненный в Kernel.Init, оказывается не верен после возврата управления в сишный пускач и вызова "главной" процедуры Init.
Хотел бы знать: почему?...
Есть только предположение ЕИЕ: когда ядро линуха грузит библиотеку, то вызывает код её инициализации, предоставляя ему стэк, который не совпадает со стэком приложения, для которого библиотека грузится. Код инициализации, на это дело не рассчитан; он ожидает, как в винде, что стэк один и тот же. У Оминка там кстати пометочка на этот счёт стоит:
Код:
SYSTEM.GETREG(SP, baseStack); (* TODO: Check that this is ok. *)
Предположение на практике подтвердилось, но теорию никто не проверял (хотя это плохо и не правильно...). Поэтому на Ваш вопрос "почему?" у меня ответа нет. Поищите и почитайте документацию, где описывается реализация механизма загрузки .so линухом. Нам потом расскажете. Dum docemus discimus :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB