OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 11 Июль, 2020 03:44

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Отладочная печать в A2
СообщениеДобавлено: Пятница, 15 Ноябрь, 2019 23:19 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Логично вынести из темы про LSP (viewtopic.php?f=22&t=6482&start=20)

Так вот, оказывается, что для меня предельная версия - это, согласно viewtopic.php?f=22&t=1410#p108422 , версия от 2016-05-01, а Reflection.Report появилась позже.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Суббота, 16 Ноябрь, 2019 14:08 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Чтобы было ясно, о чём идёт речь, речь идёт о возможности вывести куда-нибудь содержимое полей объекта, например, так, как это происходит в просмотровщике Trap в Blackbox - там можно раскрыть запись и посмотреть её поля. Красный экран в A2 куда более аскетичен - показывается только тип и адрес объекта, но не его поля.

Что-то я пока не понимаю, как решить задачу для 2014 года, учитывая временность данного решения и необходимость, чтобы патч был устойчив к слияниям. В Heaps имеется информация только об указателях в записи.
В принципе, есть нужная инфа в символьных файлах, к-рые генерируют TFAOParser и иже с ним.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Понедельник, 16 Декабрь, 2019 16:33 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Поскольку моя ветка перевалила за грань нового формата объектных файлов, вопрос снова актуален. Может ли кто-нибудь более знающий придумать, как реализовать печать записи? Общий смысл - в том, что нужно получить список полей записи, способов их прочитать и типов данных в формате, понятном для Reflection.WriteVar . Дальше я уже справлюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Воскресенье, 29 Декабрь, 2019 18:12 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
http://вики-ч115.программирование-по-русски.рф/Ч115/Рефлексия

вече.программирование-по-русски.рф/viewtopic.php?f=5&t=195


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Пятница, 03 Январь, 2020 02:05 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Похоже на то, что нельзя эффективно напечатать значение, если оно расположено на стеке или выделено статически, поскольку инфа о типе находится где-то вдали.


Но я сделал вот что (https://gitlab.com/budden/jaos/commit/e ... 7ac4ec5d11)
расширил SYSTEM.TYPECODE, чтобы оно могло принимать не только имя типа, но и выражение. При этом будет возвращён адрес описателя типа для этого выражения. После этого можно, хоть и с костылями, но сделать полиморфизм для записей, выделенных статически (стек я пока не пытался обрабатывать, несмотря на сообщение фиксации).

Печать записи с полями выглядит так:

Цитата:
Reflection2.PrintTopLevelByAddrs(o, ADDRESS OF myRecordVar, SYSTEM.TYPECODE(myRecordVar));


Честно сказать, не очень ясна причина, по которой TYPECODE находится в модуле SYSTEM. Не вижу криминала получить адрес, если без модуля SYSTEM нельзя по нему ни прочитать, ни записать. Если вынести TYPECODE из модуля SYSTEM, можно будет делать отладочную печать статически выделенной записи и не портить код импортом модуля SYSTEM, нужного только для этой отладочной печати.

Но в общем-то я не буду особо защищать эти пункты, когда в меня полетят тапки. Возможны два варианта:

а) я где-то ошибся по сути и мой механизм вообще не может работать.
б) выступят консерваторы. Консерваторам я напомню, что я не пытаюсь улучшать A2, а работаю над собственным форком и не планирую ничего не отправлять в "апстрим". Мой репозиторий открыт, если кому-то надо - можно взять, если не надо - можно не брать :)

Всех с Новым Годом!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Пятница, 03 Январь, 2020 02:45 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 250
budden, отладочная печать - это терминологический перевод слова дамп?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Пятница, 03 Январь, 2020 11:07 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Печать записей с именами и значениями полей. Как это правильно назвать - я не знаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Воскресенье, 12 Январь, 2020 01:30 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Что-то я плотно застрял с массивами. Зело много там вариантов, соответствующие знания размазаны в исходниках рантайма и компилятора, и в одном месте в FoxIntermediateBackend.Mod попался комментарий "не понял, почему такое выравнивание, скопировал с CPC". Для некоторых частных случаев удаётся напечатать, для других - пока что никак. Всё ещё усложняется тем, что не удаётся найти большой кусок времени, когда никто не дёргает и ещё есть какие-то силы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Воскресенье, 12 Январь, 2020 18:31 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Уф, вроде прорвался.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Суббота, 18 Январь, 2020 22:42 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Думаю, что на данном этапе я приостановлю эту работу. Вылизывать можно до безконечности, но вроде сейчас инструмент уже более-менее сносно работает. Идея в том, что можно печатать либо объект (ANY), используя динамическую инфу о его типе, либо модуль (состояние модуля), либо стек выполнения, снятый за счёт вставки особого вызова в код процедуры.

При этом рекурсивно печатается граф объектов, записей и массивов с отслеживанием повторов. Если какой-то адрес один раз напечатался, то при повторной печати вместо рекурсивной печати содержимого по этому адресу выводится просто ^адрес.

Некоторые типы данных не печатаются.

Также можно задать ограничение на глубину рекурсии и на длину массивов. При превышении глубины печатается некий замещающий текст. Идея в целом позаимствована из лиспового print, print-length, print-circle и т.п. См, напр,

http://filonenko-mikhail.github.io/cltl ... 139-188031

Печать выделяет (как я надеюсь) данные только на стеке, поэтому теоретически можно применять её в обработчике TRAPов вместо стандартной.


Пример модуля Proba:
Код:
MODULE Proba; IMPORT Commands, Modules, PodrobnajaPechatq, Streams, Objects (* ,Debugging ,SYSTEM , Heaps, Reflection *);

TYPE myRec1* = POINTER TO RECORD
   txt* : ARRAY 7 OF CHAR END;

TYPE myRecPtrType* = POINTER TO myRecType;
       myRecType* = RECORD
      text* : ARRAY 4 OF CHAR;
      pointerToArrayOfAny* : POINTER TO ARRAY OF ANY END;
      
TYPE myObjType* = OBJECT
   VAR mrt* : myRecType;
   END myObjType;
   
PROCEDURE zin() : myRecPtrType;
VAR item : myRec1; res : myRecPtrType;
BEGIN
   NEW(res);
   NEW(res.pointerToArrayOfAny, 2);
   NEW(item);
   item.txt := "ITEM0";
   res.pointerToArrayOfAny[0] := item;
   NEW(item);
   item.txt := "ITEM1";
   res.pointerToArrayOfAny[1] := item;
   RETURN res END zin;
   
VAR ptr0 : POINTER TO ARRAY OF myRecPtrType;
VAR ptr0a : POINTER TO ARRAY OF myRecType;
VAR ptr1 : POINTER TO ARRAY 4 OF POINTER TO ARRAY 3 OF CHAR;
VAR ptr2 : POINTER TO ARRAY OF CHAR;
VAR ptr3 : POINTER TO ARRAY 4 OF CHAR;
VAR a3 : ARRAY 5 OF CHAR;
VAR ptr5 : POINTER TO ARRAY 5 OF BOOLEAN;
VAR a5 : ARRAY 5 OF BOOLEAN;
VAR p6 : POINTER TO ARRAY OF ARRAY 4 OF CHAR;
VAR p9 : POINTER TO ARRAY OF ANY;
VAR any10 : ANY;
VAR any11 : ANY;


PROCEDURE z*(context : Commands.Context);
VAR m: Modules.Module;
VAR res : LONGINT; msg : ARRAY 4096 OF CHAR; o : Streams.Writer;
   (* ty : Modules.TypeDesc; *)
   k : PodrobnajaPechatq.KontekstPechati;

   LOCALobj7 : myObjType;
   LOCALany8 : ANY;

BEGIN
   o := context.out;
   PodrobnajaPechatq.ZadajjKontekstPechatiPoUmolch(k);
   k.w := o;
   PrimerStackTraceBack(o);
   o.Ln; o.String("======== TraceBack END =========");
   o.String("Loading the module"); o.Ln;
   m := Modules.ThisModule("Proba", res, msg);
   IF (m = NIL) OR (res # 0) THEN
      o.String("z: Failed to load module:"); o.String(msg); o.Ln;
      RETURN END;
      

   NEW(ptr0, 3);
   NEW(ptr0[0]);
   ptr0[0].text := "LLL";
   NEW(ptr0[2]);
   ptr0[2].text := "SSS";
   o.Ln; o.String("======= PodrobnajaPechatq.PechVKontektse ptr0 ========: "); o.Ln; PodrobnajaPechatq.PechVKontekste(k, ptr0);
   
   NEW(ptr0a,3);
   ptr0a[0].text := "LLL";
   ptr0a[2].text := "SSS";
   o.Ln; o.String("======= PodrobnajaPechatq.PechVKontektse ptr0a ========: "); o.Ln; PodrobnajaPechatq.PechVKontekste(k, ptr0a);

   
   NEW(ptr1);
   (* o.String("Address of ptr1 = "); o.Address(SYSTEM.VAL(ADDRESS, ptr1)); o.Ln; *)
   NEW(ptr1[0]);
   (* o.String("Value of ptr1[0] = "); o.Address(SYSTEM.VAL(ADDRESS, ptr1[0])); o.Ln; *)
   ptr1[0]^ := "AB";   
   NEW(ptr1[2]);
   (* o.String("Value of ptr.1[2] = "); o.Address(SYSTEM.VAL(ADDRESS, ptr1[1])); o.Ln; *)
   ptr1[2]^ := "CD";
   ptr1[3] := ptr1[2];
   o.Ln; o.String("======= PodrobnajaPechatq.PechVKontektse ptr1 ========: "); o.Ln; PodrobnajaPechatq.PechVKontekste(k, ptr1);

   NEW(ptr2,3);
   ptr2^ := "AB";
   o.Ln; o.String("======= PodrobnajaPechatq.PechVKontektse ptr2 ========: "); o.Ln; PodrobnajaPechatq.PechVKontekste(k, ptr2); 
   
   
   NEW(ptr3);
   ptr3^ := "DEF";
   o.Ln; o.String("======= PodrobnajaPechatq.PechVKontektse ptr3 ========: "); o.Ln; PodrobnajaPechatq.PechVKontekste(k, ptr3); 
   
   a3 := "ABC";
   
   NEW(ptr5);
   ptr5[0] := TRUE;
   ptr5[4] := TRUE;
   a5[0] := TRUE;
   a5[4] := TRUE;
   (* o.String("========= PodrobnajaPechatq.Report ==========="); o.Ln;
   Reflection.Report(o, m.refs, 0);  *)
   
   NEW(p6, 2);
   p6[0] := "AAA";
   p6[1] := "BBB";
     
   NEW(LOCALobj7);
   LOCALany8 := LOCALobj7;
   NEW(LOCALobj7);

     NEW(p9, 2);
     p9[0] := LOCALobj7;
     p9[1] := LOCALany8;

   any10 := zin();
   any11 := Objects.ActiveObject();
   
   (* o.Ln; o.String("========= PodrobnajaPechatq.Pech(o, obj) ======="); o.Ln;

   PodrobnajaPechatq.Pech(o, obj); *)
   
   o.Ln; o.String("========= PodrobnajaPechatq.ModuleState ======="); o.Ln;
   
   PodrobnajaPechatq.ModuleState(o, m);
   
   


   (* o.String("====== Printing individual values =========="); o.Ln;
   ASSERT(SYSTEM.TYPECODE(myPtrToRecordVar) = SYSTEM.TYPECODE(myPtrToRecordType));
   PodrobnajaPechatq.Pech(o, myPtrToRecordVar);
   (* Alqternativa:
      PodrobnajaPechatq.PechPoAdr(o, SYSTEM.VAL(ADDRESS,myPtrToRecordVar), SYSTEM.TYPECODE(myPtrToRecordVar)); *)
   PodrobnajaPechatq.PechPoAdr(o, ADDRESS OF myRecordVar, SYSTEM.TYPECODE(myRecordVar)); *)
   END z;


PROCEDURE PrimerStackTraceBack(o : Streams.Writer);
VAR m : ARRAY 5 OF INTEGER;
BEGIN
   m[0] := 5;
   m[4] := 33;
   PodrobnajaPechatq.TraceBack(o, 1, 1);
END PrimerStackTraceBack;

END Proba.


(SystemTools.DoCommands
   SystemTools.FreeDownTo PodrobnajaPechatq~
   Proba.z~
   WMKernelLog.Open~~)


В результате выполнения команды печатается примерно такая простыня.
Код:
(StackTraceBack 1 1
  (KADR 0 PodrobnajaPechatq.TraceBack:28 pc=248280478 [0ECC759EH] = 248280450 + 28 crc=00000000
  )
  (KADR 1 Proba.PrimerStackTraceBack:41 pc=248332873 [0ECD4249H] = 248332832 + 41 crc=00000000
 
 
  v o
   ( r.STz &0EABE160 Streams.Writer ~(
      f tail 67
      f buf (&0EABE1A0 [128] CHAR : "")
      f res 0
      f send (DELEGATE)
      f sent 394))

 
  v m (&0B8DAED2 [5] INTEGER : (
     0: 5
     1: 0
     2: 0
     3: 0
     4: 33))
)
  (KADR 2 Proba.z:86 pc=248330487 [0ECD38F7H] = 248330401 + 86 crc=00000000
  )
  (KADR 3 Commands.Runner.@Body:718 pc=4430640 [00439B30H] = 4429922 + 718 crc=00000000
  ){ [P 13896 Commands.Runner] 22:38:43}
======== TraceBack END =========Loading the module

======= PodrobnajaPechatq.PechVKontektse ptr0 ========:
(&0ECD5420 DT[3] : (
 0: (&0ECD5460  :vidObjqekta 6 :type Proba.myRecType (
    f text "LLL"
    f pointerToArrayOfAny NIL))
 1: NIL
 2: (&0ECD54A0  :vidObjqekta 6 :type Proba.myRecType (
    f text "SSS"
    f pointerToArrayOfAny NIL)))
======= PodrobnajaPechatq.PechVKontektse ptr0a ========:
(IzuchiMassivSUkazateljamiVElemente: vidObjqektaMassivSElementamiIzvestnogoTipa)
(&0ECD54E0  :vidObjqekta 5 :type Proba.myRecType (
  f text ""
  f pointerToArrayOfAny NIL))
======= PodrobnajaPechatq.PechVKontektse ptr1 ========:
(&0ECD5540 DT[4] : (
 0: (neKhvataetST 0ECD5580)
 1: NIL
 2: (neKhvataetST 0ECD55C0)
 3: (neKhvataetST 0ECD55C0))
======= PodrobnajaPechatq.PechVKontektse ptr2 ========:
(neKhvataetST 0ECD5600)
======= PodrobnajaPechatq.PechVKontektse ptr3 ========:
(neKhvataetST 0ECD5640)
========= PodrobnajaPechatq.ModuleState =======

(SOSTOJANIE MODULJA 'Proba'

 
 v ptr0 (&0ECD5420 [3] (POINTER TO DT RECORD)) : (
    0:
    ( r.STz &0ECD5460 Proba.myRecType ~(
       f text "LLL"
       f pointerToArrayOfAny NIL))
    1: NIL
    2:
    ( r.STz &0ECD54A0 Proba.myRecType ~(
       f text "SSS"
       f pointerToArrayOfAny NIL))))

 
 v ptr0a (&0ECD54E0 [3] (RECORD Proba.myRecType) : (
    0: Record ((
      f text "LLL"
      f pointerToArrayOfAny NIL))
    1: Record ((
      f text ""
      f pointerToArrayOfAny NIL))
    2: Record ((
      f text "SSS"
      f pointerToArrayOfAny NIL))))

 
 v ptr1 (&0ECD5540 [4] POINTER TOARRAY 3 OF CHAR : (
    0: (&0ECD5580 [3] CHAR : "AB")
    1: NIL
    2: (&0ECD55C0 [3] CHAR : "CD")
    3: (^0ECD55C0)))

 
 v ptr2 (&0ECD5600 [3] CHAR : "AB")

 
 v ptr3 (&0ECD5640 [4] CHAR : "DEF")

 
 v a3 "ABC"

 
 v ptr5 (&0ECD5680 [5] BOOLEAN : (
    0: true
    1: false
    2: false
    3: false
    4: true))

 
 v a5 (&0ECD42B0 [5] BOOLEAN : (
    0: true
    1: false
    2: false
    3: false
    4: true))
)


Последний раз редактировалось budden Суббота, 18 Январь, 2020 22:45, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Суббота, 18 Январь, 2020 22:44 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Код соответствует этому коммиту (но здесь A2 не собрана, придётся повозиться).

https://gitlab.com/budden/jaos/commit/1 ... 4e2b66cbd8

Код можно использовать по той же лицензии, под которой лицензирована сама A2.

Критиковать использование транслита, либо подходы к открытию данных через рефлексию в целом не имеет смысла. Я сделал инструмент для себя, если он кому-то ещё пригодится - используйте. Если не пригодится - проходите мимо. Ваше мнение меня не особо интересует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отладочная печать в A2
СообщениеДобавлено: Воскресенье, 19 Январь, 2020 00:13 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 880
Добавил описание, как это использовать (возможно, некорректное):

http://вики-ч115.программирование-по-русски.рф/Ч115/ОтладочнаяПечать


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

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


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

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


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

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