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 Спасибо Евгению Темиргалееву за наводку
|
Автор: | Пётр Кушнир [ Суббота, 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/ |