OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 03:00

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 06 Декабрь, 2012 22:49 

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
добрый день.

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

т.е. где-то хранится информация, соответствие скомпилированной команды и ее расположении в исходнике?
как можно добраться?
нужно для такого эксперимента:
у исполнителя есть команды, если показываем в замедленном режиме анимацию робота(через Services.DoLater), то хотелось бы еще и команду, вызванную в этот момент подсвечивать в исходнике.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Декабрь, 2012 23:28 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Копните по направлению Kernel.SourcePos.


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

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Вот реализуете, и уже никто не скажет, что у нас нет пошагового отладчика :twisted:


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

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
Илья Ермаков писал(а):
Копните по направлению Kernel.SourcePos.

c Kenel сложно разбираться тк не документирован...

PROCEDURE SourcePos (mod: Module; codePos: INTEGER): INTEGER;
видимо возвращает позицию в исходнике модуля по позиции в кодовом файле?

кернел.модуль можем получить по имени модуля процедурой:
PROCEDURE ThisMod (IN name: ARRAY OF CHAR): Module;

а откуда получить codePos?


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
Код:
MODULE TmpSourcePos;

   IMPORT SYSTEM, Log, Kernel;

   CONST
      modName = "TmpSourcePos";

   PROCEDURE P;
   BEGIN
      Log.Int(934); Log.Ln
   END P;

   PROCEDURE Do*;
      VAR pc: INTEGER;
         mod: Kernel.Module;
   BEGIN
      pc := SYSTEM.ADR(Do);

      mod := Kernel.ThisMod(modName);

      Log.Int(Kernel.SourcePos(mod, pc - mod.code)); Log.Ln
   END Do;

END TmpSourcePos.


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

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
___ писал(а):
c Kenel сложно разбираться тк не документирован...
Посмотрите в http://oberoncore.ru/wiki/blackbox/kernel , может быть там есть всё необходимое?


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

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
Alexander Shiryaev писал(а):
Код:
MODULE TmpSourcePos;

   IMPORT SYSTEM, Log, Kernel;

   CONST
      modName = "TmpSourcePos";

   PROCEDURE P;
   BEGIN
      Log.Int(934); Log.Ln
   END P;

   PROCEDURE Do*;
      VAR pc: INTEGER;
         mod: Kernel.Module;
   BEGIN
      pc := SYSTEM.ADR(Do);

      mod := Kernel.ThisMod(modName);

      Log.Int(Kernel.SourcePos(mod, pc - mod.code)); Log.Ln
   END Do;

END TmpSourcePos.


модуль выдает число близкое к началу процедуры, но все равно не понятно, как работает:
почему если подставить pc := SYSTEM.ADR(Do); вместо Do -> P то будет выдавать нули?
почему "pc - mod.code" если "Возвращает позицию в исходном коде для машинной инструкции. mod - модуль, codePos - смещение от начала секции кода модуля (mod.code). "

Иван Кузьмицкий
спасибо за ссылку, всяко лучше, чем просто исходник. но пока не понятно%)

"Секция кода содержит исполняемый код процедур модуля."
"csize-: INTEGER - Размеры секции кода"
"code-: INTEGER - Указатели на начало секции кода"
указатель(адрес) в памяти если модуль загружен? или адрес(позиция) в кодовом файле модуля(если в начале кодового файла др инфа еще лежит)?
для чего:
"procBase-, varBase-: INTEGER
Базовые адреса для вычисления смещений процедур и переменных соответственно. "?


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

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
___ писал(а):
почему "pc - mod.code" если "Возвращает позицию в исходном коде для машинной инструкции. mod - модуль, codePos - смещение от начала секции кода модуля (mod.code). "


видимо mod.code - адрес начала кодовой части модуля в памяти
SYSTEM.ADR(P) - адрес процедуры (которая лежит в кодовой части, т.е. дальше начального адреса)
процедуре же требуется смещение (от начала кодовой части), поэтому "pc - mod.code"


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

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
попробовал такой модуль:
Код:
MODULE TmpSourcePos;
IMPORT SYSTEM, Log, Kernel;
CONST
modName = "TmpSourcePos";
PROCEDURE P;
BEGIN
Log.Int(934); Log.Ln;
END P;
PROCEDURE Do*;
VAR pc: INTEGER;
mod: Kernel.Module;
i:INTEGER;
BEGIN
P;
pc := SYSTEM.ADR(P);
mod := Kernel.ThisMod(modName);
FOR i :=0  TO 150 DO
Log.Int(Kernel.SourcePos(mod,i)); Log.Ln   
END;
END Do;

выдал адреса:
"TmpSetPos.SetCaret(100)"
"TmpSetPos.SetCaret(114)"
"TmpSetPos.SetCaret(122)"
"TmpSetPos.SetCaret(198)"
"TmpSetPos.SetCaret(201)"
"TmpSetPos.SetCaret(222)"
"TmpSetPos.SetCaret(258)"
"TmpSetPos.SetCaret(275)"
"TmpSetPos.SetCaret(309)"
"TmpSetPos.SetCaret(317)"
"TmpSetPos.SetCaret(272)"
:

MODULE TmpSourcePos;
IMPORT SYSTEM, Log, Kernel;
CONST
modName = "TmpSourcePos";
PROCEDURE P;
BEGIN
Log.Int(934); Log.Ln;
END P; ------------------------------------тут скрытый ретурн?
PROCEDURE Do*;
VAR pc: INTEGER;
mod: Kernel.Module;
i:INTEGER;
BEGIN
P;
pc := SYSTEM.ADR(P);
mod := Kernel.ThisMod(modName);
FOR i :=0 TO 150 DO------------------------------присваивание переменной(258) и скрытая проверка(272)?
Log.Int(Kernel.SourcePos(mod,i)); Log.Ln
END;--------------------------------------------------------------goto на начало цикла?
END Do; -------------------------------------------------------------нету ретурна как в процедуре P?


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

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


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

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


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

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