OberonCore
https://forum.oberoncore.ru/

[CPcc] сбой при попытке чтения памяти
https://forum.oberoncore.ru/viewtopic.php?f=34&t=3420
Страница 1 из 1

Автор:  Роман М. [ Воскресенье, 24 Апрель, 2011 21:56 ]
Заголовок сообщения:  [CPcc] сбой при попытке чтения памяти

При попытке компиляции некоторых модулей версией компилятора для линукса происходит сбой при попытке чтения памяти:

HostFiles
Код:
Compiling Files.cp ...
 
****
* BlackBox
* illegal memory read [ad = 09FFDE70]
- CDevCPV486.Check  (pc=000013FE, fp=BF92D14C)
- CDevCPV486.Check  (pc=0000141D, fp=BF92D178)
- CDevCPV486.stat  (pc=00005C82, fp=BF92D218)
- CDevCPV486.procs  (pc=00006B1C, fp=BF92D340)
- CDevCPV486.Module  (pc=00006F7B, fp=BF92D474)
****

При этом, тот же компилятор для виндоус компилирует успешно (в Wine), в той же директории. Что весьма странно.
Ввиду отсутствия в составе модуля StdDebug (ещё не перенесён), пока нет возможности увидеть состояние сбоя как в Блэкбоксе. С точки зрения отличия платформ - они в файлах LinDl, LinLibc, Kernel, HostFiles, основанных на файлах проекта OpenBUGS. Исходные коды на сайте проекта cp-dev @sf.net в хранилище SVN. А отличия от изначальной версии компилятора ББ касаются только внешнего интерфейса и они незначительны.

Что посоветуете?

Автор:  Илья Ермаков [ Воскресенье, 24 Апрель, 2011 22:37 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Вам в распечатке сбоя указывается адрес в коде (в квадратных скобах). В DevDebug есть некая процедурина, которая позволяет увидеть по такому адресу место в исходном тексте. Я использовал, только она для вызова с коммандера не годится, навернуть команду надо.

Автор:  Роман М. [ Суббота, 30 Апрель, 2011 18:25 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Никак не соображу как локализовать ошибку. Сбивает с толку факт, что в Windows компиляция происходит успешно. Наверно, модуль Kernel был неполноценно перенесён на Линукс.

Вот такой код сбоит компиляцию в Линуксе (основан на модуле Files):
Код:
MODULE TestOop2;

   IMPORT Kernel;
   
   CONST copyleft* = "Copyleft";
 
   TYPE
      Name* = ARRAY 256 OF CHAR;
      Type* = ARRAY 16 OF CHAR;

      FileInfo* = POINTER TO RECORD
         next*: FileInfo;
         name*: Name;
         length*: INTEGER;
         type*: Type;
         modified*: RECORD year*, month*, day*, hour*, minute*, second*: INTEGER END;
         attr*: SET
      END;

      LocInfo* = POINTER TO RECORD
         next*: LocInfo;
         name*: Name;
         attr*: SET;
      END;

      Data* = POINTER TO ABSTRACT RECORD
         init: BOOLEAN;
         f1: INTEGER
      END;

      Locator* = POINTER TO ABSTRACT RECORD
      END;

      File* = POINTER TO ABSTRACT RECORD
         type-: Type;
         (*init: BOOLEAN;*)
      END;

      Rec = POINTER TO RECORD END;

   VAR
      (*d: Data;*)
      v, v2, v3, v4, v5, v6: ARRAY 1 OF INTEGER;

   PROCEDURE (s: Data) Init*, NEW;
   BEGIN
      ASSERT(s.f1 # 0, 20);
      s.init := TRUE;
      s.f1 := 100;
   END Init;

   PROCEDURE (l: Locator) This* (IN path: ARRAY OF CHAR): Locator, NEW, ABSTRACT;
 
   PROCEDURE (f: File) InitType* (type: Type), NEW;
   BEGIN
      f.type := type$
   END InitType;

   PROCEDURE (f: File) Length* (): INTEGER, NEW, ABSTRACT;
   (*PROCEDURE (f: File) Length* (): INTEGER, NEW; BEGIN RETURN 1 END Length;*)
   (*PROCEDURE (f: File) Length2* (): INTEGER, NEW, ABSTRACT;*)

END TestOop2.


Практически любое изменение в объявлении символов для экспорта или в теле процедур может привести к исчезновению сбоя. Есть ощущение, что есть зависимость от размера данных и количества экспортируемых символов от наличия сбоя.

Кроме того, мне удалось адаптировать модуль StdDebug для консольного режима и теперь я могу немнгого более подробно знать об ошибке. Но это пока не помогло в выявлении ошибки.
Код:
Trying to compile module TestOop2 ...
illegal memory read (ad = B7362DFAH)

 CDevCPV486.procs   [00006A81H]
   .ch   SHORTCHAR   "�"
   .end   INTEGER   163345872
   .i   INTEGER   -1220564312
   .j   INTEGER   0
   .n   CDevCPT.Node   IllegalAddress0000003CH
   .name   CDevCPT.Name   "�x56��d"   ...
"�x56��d", 0X, 0X, "����", 1X, "56��ۼ", 9X, 0X, 0X, 0X, 0X, "��?�", 1CX, "���", 0CX, "���", 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "��?�", 1CX, "���,���F�7�", 0X, 0X, 0X, 0X, 10X, 90X, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���H���F�7��", 8FX, "�", 9X, 90X, 8FX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���d���F�7�0", 8FX, "�", 9X, 10X, 8FX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���", 80X, "���F�7��", 8EX, "�", 9X, 90X, 8EX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���", 9CX, "���F�7�0", 8EX, "�", 9X, 10X, 8EX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "����F�7��", 8DX, "�", 9X, 90X, 8DX, "�", 9X, "���", 0FX, "��?�", 1CX, "�������F�7�0", 8DX, "�", 9X, 0X, 0X, 0X, 0X, "��7���?�", 1CX, "�������F�7"   
   .obj   CDevCPT.Object   NIL
   .proc   CDevCPT.Object   NIL
   .useFpu   BOOLEAN   Undefined238
 CDevCPV486.Module   [00006F7AH]
   .aAd   INTEGER   163352240
   .end   INTEGER   0
   .n   CDevCPT.Node   NIL
   .name   CDevCPT.Name   "$$"   ...
"$$", 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "h�", 8BX, "6�0", 8EX, "�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "�", 0X, 9X, 0X, 9CX, "�", 8BX, "6��", 8DX, "�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "������", 8BX, "6�0", 8DX, "�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "0v�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 80X, "O", 4X, "�", 8BX, "6��u�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, " ��� ���m", 8DX, "6�Pu�", 9X, 80X, "m�", 9X, 1X, 3X, 7FX, 0X   
   .obj   CDevCPT.Object   NIL
   .p   CDevCPT.Object   NIL
   .prog   CDevCPT.Node   [09BC9D10H]
   .rAd   INTEGER   -1221162053
   .typ   CDevCPT.Struct   NIL
   .useFpu   BOOLEAN   FALSE


Что интересно, что сбой происходит если подключать модуль Kernel. Если же его не подключать, то всё скомпилируется без сбоя. Да и, вообще, сбой происходит именно в модулях с низкоуровневыми операциями. Во всех сбоях ловушка указывает на модуль CDevCPV486. Причём, именно на рекурсивных процедурах. Переполнение стека?

Автор:  Иван Денисов [ Суббота, 30 Апрель, 2011 19:53 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Может это и оффтоп, но у меня есть такая же проблема (illegal memory read) с использованием Kernel только в другой профиль, при компилировании программы в простом BB1.6rc6.

Чем моя программа провинилась? Может это поможет отловить ошибку.

При 10 000 работает, а при 14 000 нет! При создании массива любого размера (проверял до 50 000) руками без NEW() проблемы нет, прекрасно все работает.
Код:
MODULE OglLessonBall;

   TYPE
      Vector = ARRAY 3 OF REAL;
      Ball = RECORD
         pos: Vector;
         r: REAL;
         active: BOOLEAN;
      END;
   VAR
      system: POINTER TO ARRAY OF Ball;

   PROCEDURE Main;
   BEGIN
      NEW(system, 14000);
   END Main;
BEGIN
   Main;
END OglLessonBall.


проблема решена
добавлением NEW(starter) где stater: POINTER TO RECORD END;
http://forum.oberoncore.ru/viewtopic.php?f=2&t=2001&p=62906#p62906

Спасибо Евгению Темиргалееву за наводку

Вложения:
Снимок.png
Снимок.png [ 7.54 КБ | Просмотров: 7768 ]

Автор:  Пётр Кушнир [ Суббота, 30 Апрель, 2011 21:11 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

у меня всё работает

Автор:  Роман М. [ Суббота, 30 Апрель, 2011 21:39 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Давайте лучше обсудим проблему в Линуксе. :?

Автор:  Евгений Темиргалеев [ Суббота, 30 Апрель, 2011 21:43 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

divan писал(а):
При 10 000 работает, а при 14 000 нет!
посмотрите viewtopic.php?p=37250#p37250

Автор:  Илья Ермаков [ Суббота, 30 Апрель, 2011 21:50 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Роман, кстати, попробуйте отказаться от линковки своего компилятора, а спакуйте его DevPacker.

Там что-то с порядком инициализации при статической линковке хитрое...

Автор:  Роман М. [ Суббота, 30 Апрель, 2011 23:19 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Илья Ермаков писал(а):
Роман, кстати, попробуйте отказаться от линковки своего компилятора, а спакуйте его DevPacker.

Там что-то с порядком инициализации при статической линковке хитрое...

Разве DevPacker - не чисто решение для компоновки в исполняемые PE? Кроме того, DevLinker пока не умеет собирать исполняемые ELF (разве только неизвестным мне образом).

Автор:  Евгений Темиргалеев [ Воскресенье, 01 Май, 2011 07:52 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Роман М. писал(а):
Разве DevPacker - не чисто решение для компоновки в исполняемые PE?
Не пойму точно что Вы имеете ввиду...
DevPacker приписывает к exe виртуальную ФС, файлы из которой просвечиваются на самом нижнем уровне (после вторичного и первичного каталогов). Модули оттуда динамически грузятся, как если бы лежали рядом в ФС. Итого разница --- в количестве файлов.

Автор:  Роман М. [ Воскресенье, 01 Май, 2011 08:53 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Евгений Темиргалеев писал(а):
Роман М. писал(а):
Разве DevPacker - не чисто решение для компоновки в исполняемые PE?
Не пойму точно что Вы имеете ввиду...
DevPacker приписывает к exe виртуальную ФС, файлы из которой просвечиваются на самом нижнем уровне (после вторичного и первичного каталогов). Модули оттуда динамически грузятся, как если бы лежали рядом в ФС. Итого разница --- в количестве файлов.

Я о том, что мне нужно платформо-независимое решение. А, насколько мне известно, формат ELF не предназначен для хранения ресурсов.

Более того, каким образом помог бы DevPacker в решении вышеописанного вопроса касательно Линукса?

Автор:  Илья Ермаков [ Воскресенье, 01 Май, 2011 13:15 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Он легко доделывается до паковки в отдельный файл и монтирования его. Если нужно. Если уж дико хочется уменьшить количество файлов.

Автор:  Alexander Shiryaev [ Воскресенье, 23 Сентябрь, 2012 19:44 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Роман, проблема до сих пор не решена?

У меня похожая проблема. Даже заново портировал модуль Kernel (с 1.6-rc6)...

Код:
compiling "Views"
================================
TRAP:
--------------------------------
sig = $0000000B, baseStack = $CFBDB434
GS  = $8BD70063, FS  = $0000005B, ES  = $850A0033, DS  = $CFBD0033
EDI = $8069A2B1, ESI = $7CB965E1, EBP = $CFBD8F60, EBX = $CFBD900C
EDX = $5D64DA95, ECX = $0000033E, EAX = $0000192C, EIP = $085A0D99
CS = $0000002B, EFLAGS = $00010202, ESP = $CFBD8F54, SS = $00000033
ONSTACK = $00000000, MASK = $00000000, TRAPNO = $00000006, ERR = $00000004
================================

****
* BlackBox
* illegal memory read [ad = 0000192C]
- DevCPT.FPrintTProcs  (pc=00001BE1, fp=CFBD8F60)
- DevCPT.FPrintTProcs  (pc=00001BE8, fp=CFBD8F78)
- DevCPT.FPrintTProcs  (pc=00001D33, fp=CFBD8F90)
- DevCPT.FPrintTProcs  (pc=00001D33, fp=CFBD8FA8)
- DevCPT.FPrintTProcs  (pc=00001BE8, fp=CFBD8FC0)
- DevCPT.FPrintTProcs  (pc=00001BE8, fp=CFBD8FD8)
- DevCPT.FPrintStr  (pc=00001F4D, fp=CFBD900C)
- DevCPT.InStruct  (pc=0000376D, fp=CFBD9058)
- DevCPT.InObj  (pc=0000395B, fp=CFBD9084)
- DevCPT.Import  (pc=0000404A, fp=CFBD90B0)
- DevCPP.Module  (pc=00006089, fp=CFBD93E0)
- DevCompiler.Module  (pc=00000082, fp=CFBD93F4)
****

Код:
TRAP:
--------------------------------
sig = $0000000B, baseStack = $CFBDC308
GS  = $00000063, FS  = $0000005B, ES  = $00000033, DS  = $00000033
EDI = $CFBD9DEC, ESI = $800EFEA0, EBP = $CFBD9F60, EBX = $CFBDB004
EDX = $36F79FA5, ECX = $00000000, EAX = $7FFFFED0, EIP = $00000000
CS = $0000002B, EFLAGS = $00010202, ESP = $CFBD9F54, SS = $00000033
ONSTACK = $00000000, MASK = $00000000, TRAPNO = $00000006, ERR = $00000004
================================
 
****
* BlackBox
* illegal memory read [ad = 00000000]
- (pc=00000000, fp=CFBD9F60)
- DevCPM.NewObj  (pc=0000230A, fp=CFBDA17C)
- DevCPV486.Module  (pc=00006D36, fp=CFBDA2B4)
- DevCompiler.Module  (pc=000000DA, fp=CFBDA2C8)
- DevCompiler.Do  (pc=00000419, fp=CFBDA52C)
- DevCompiler.CompileList  (pc=00000EED, fp=CFBDA860)
- DevCompiler.CompileThis  (pc=000010CC, fp=CFBDA888)
- Kernel.Call  (pc=00002175, fp=CFBDA8B4)
- Meta.Item.ParamCallVal  (pc=00002B5F, fp=CFBDAD14)
- StdInterpreter.CallProc  (pc=00000475, fp=CFBDAD7C)
- StdInterpreter.Command  (pc=00000A61, fp=CFBDAE14)
- StdInterpreter.CallHook.Call  (pc=00000B0F, fp=CFBDB004)
***


Проявляется не при каждом запуске тестовой программы.

Даже такое бывает:
Код:
================================
TRAP:
--------------------------------
sig = $00000004, baseStack = $CFBCC448
GS  = $00000063, FS  = $0000005B, ES  = $00000033, DS  = $00000033
EDI = $CFBCA7A2, ESI = $8357DB1E, EBP = $CFBCA774, EBX = $CFBCB144
EDX = $28F9F2B8, ECX = $000000F2, EAX = $0C8A4729, EIP = $0C89A544
CS = $0000002B, EFLAGS = $00010293, ESP = $CFBCA4CC, SS = $00000033
ONSTACK = $00000000, MASK = $00000000, TRAPNO = $00000000, ERR = $00000000
================================

****
* BlackBox
* invalid with
- HostFiles.Directory.Old  (pc=00002919, fp=CFBCA774)
- ConsCompiler.Do  (pc=000002BA, fp=CFBCA998)
- ConsCompiler.Compile  (pc=0000038C, fp=CFBCA9B8)
- Kernel.Call  (pc=00002175, fp=CFBCA9F4)
- Meta.Item.ParamCallVal  (pc=00002B5F, fp=CFBCAE54)
- StdInterpreter.CallProc  (pc=00000475, fp=CFBCAEBC)
- StdInterpreter.Command  (pc=00000A61, fp=CFBCAF54)
- StdInterpreter.CallHook.Call  (pc=00000B0F, fp=CFBCB144)
- Dialog.Call  (pc=00003644, fp=CFBCB16C)
- ConsInterp.Call1  (pc=000000CA, fp=CFBCB19C)
- ConsInterp.Call0  (pc=0000023D, fp=CFBCB1B8)
- ConsInterp.Call  (pc=0000032F, fp=CFBCB1D0)
****


Пробовал увеличить размер стека с 4096 КиБ до 32000 КиБ (ulimit -s 32000) -- не помогает.

Автор:  Роман М. [ Воскресенье, 23 Сентябрь, 2012 21:20 ]
Заголовок сообщения:  Re: [CPcc] сбой при попытке чтения памяти

Проблема компиляции была решена установкой вершины стека с помощью SetKernelBaseStack по совету Темиргалеева, если не ошибаюсь. В моем варианте компилятор собирался в динамическую библиотеку.
Вот когда соберусь выпустить следующую версию фронтенда с патчем для Линукса, проверю компилятор на самосборке из исходников. А то последний раз падал на сборке Kernel.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/