Отладка интерпретатора в ВМ при изменении примитивов ВМ

Контекст

В качестве университетского проекта мы хотим изменить pharo vm для использования таблицы объектов и посмотреть, что произойдет.

Мы используем клон pharo-vm из github и VMMaker. Создание виртуальной машины работает нормально.

Для начала мы добавили примитив, который возвращает увеличенное целое число:

InterpreterPrimitives>>primitiveIntegerIncrement
    "increments an integer"
    self pushInteger: self popInteger + 1 .

и изменил StackInterpreter class>>initializePrimitiveTable соответственно

MaxPrimitiveIndex := 576.
"... and so on ..."
    (575 primitiveFail)
    (576 primitiveIntegerIncrement))

И это работает.

Проблема

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

Что-то вроде:

StackInterpreter test: '1 inc'

И тогда я могу отлаживать, если примитив неверен или возникает ошибка. Конечно, нужно сделать гораздо больше, но как я могу этого добиться?

Что мы пробовали

  1. категория VMMaker-InterpreterSimulation класс StackInterpreterSimulator. Пробуем код в комментариях

    DoIt
        ^ (StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    

    ошибки:

        displayForm := 'Display has not yet been installed' asDisplayText form.
    

    ByteString не понимает asDisplayText

  2. (CogVMSimulator new openOn: Smalltalk imageName) test 
    (InterpreterSimulator new openOn: Smalltalk imageName) test
    

    ошибка:

        PrimitiveFailed: primitive #basicNew: in Array class failed
    

Я также нашел этот снимок экрана, но он только отлаживает виртуальную машину извне с помощью gbd: http://vimeo.com/22485382#< /а>

Наш проект размещен здесь: http://smalltalkhub.com/#!/~kirstin/PharoObjectTable

Текущий статус

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


person User    schedule 21.11.2013    source источник
comment
Просто для справки, вы можете посмотреть на RoarVM, у него обычно есть таблица объектов, но есть и вариант без: github.com/smarr/RoarVM/tree/features/without-object-table По сравнению с CogVM у него нет компилятора JIT, и он скорее вообще медленно. Тем не менее, это все же может дать некоторое представление о том, как подходить к вещам.   -  person smarr    schedule 22.11.2013


Ответы (2)


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

Чтобы ответить на ваш вопрос, основная проблема здесь заключается в том, что симулятор cog не поддерживается в форке pharo vm. Это потому, что никто из команды фаро не использует симулятор. Мы используем только внешнюю отладку из gdb. На самом деле ребята из pharo работают в основном над плагинами для виртуальных машин, ядро ​​виртуальной машины в основном поддерживается и разрабатывается Элиотом Мирандой, который работает над Squeak. Поэтому мы сообщаем ему, когда есть ошибка в ядре виртуальной машины.

Для вашего проекта вам придется разделить его как минимум на 2 этапа:

шаг 1: заставить таблицу объектов работать со стековой виртуальной машиной

шаг 2: заставить JIT работать с вашей таблицей объектов

Обратите внимание, что для шага 2 я бы рекомендовал не изменять способ доступа объекта к своему заголовку, поэтому иметь таблицу объектов, подобную VW, где у вас есть заголовок фиксированного размера для заголовка в таблице объектов и поля объектов ( и, возможно, расширения заголовков) в куче.

Поэтому используйте StackVMSimulator и сначала создайте StackVM. Когда все заработает (включая контекст), можно подумать о взломе JIT. Недавно Гильермо Полито перенес виртуальную машину стека в процесс сборки (см. PharoSVMBuilder вместо PharoVMBuilder), парень сообщил о проблемах с этим компоновщиком, но вы можете немного взломать его, чтобы заставить его работать.

Теперь, чтобы заставить симулятор работать на Pharo 2.0 (который является версией образа генератора Pharo, который у вас есть), вы должны открыть браузер monticello и выполнить слияние из ветки Элиота с пакетом Cog (расположение репозитория MCHttpRepository: 'http://source. squeak.org/VMMaker'), но не последний Cog, тот, который выпущен приблизительно той же датой, что и текущий пакет VMMaker для pharo-vm, потому что последний Cog и VMMaker из ветки Элиота нестабильны.

В качестве альтернативы можно начать с образа сборки Элиота и объединить вещи из ветки pharo. Вот информация о том, как создать образ разработки скрипа (http://www.mirandabanda.org/cogblog/build-image/).

Затем Элиот однажды дал мне этот сценарий:

| cos |
cos := CogVMSimulator newWithOptions: #(Cogit SistaStackToRegisterMappingCogit).
cos desiredNumStackPages: 8.
cos openOn: 'my/favourite.image'.
cos openAsMorph; toggleTranscript; halt; run

Вам не нужна опция SistaStackToRegisterMappingCogit. Я думаю, что какой-то аналогичный скрипт со StackVMSimulator должен работать.

Наконец, есть некоторая документация по симулятору, но она предназначена только для CogSimulator (эта документация предполагает, что вы уже знаете, как работает StackSimulator, и просто дает вам подсказки о том, как использовать его с JIT): http://www.mirandabanda.org/cogblog/2008/12/12/simulate-out-of-the-bochs/ и в одном из видео под названием "Cog VM (part x)", где x равно от 1 до 6, Элиот показывает, как он использует симулятор для дизассемблирования x86, напечатайте стек и осмотрите кучу.

Еще один совет: задавайте свои вопросы в списке рассылки pharo (пользователи pharo или pharo dev), потому что здесь никто не может заметить ваш вопрос (к счастью, на этот раз кто-то указал мне на ваш вопрос).

И расскажите в рассылке pharo, удалось ли вам запустить симулятор в Pharo 2.0, некоторых людей (таких как я) это очень интересует. Я планировал сделать это в какой-то момент.

Удачи ! В любом случае хороший проект.

person Clement Bera    schedule 22.11.2013

В последний раз я пытался использовать симулятор примерно год назад, и у меня не получилось. Тем не менее, есть несколько патчей, которые, как я полагаю, так и не были интегрированы, которые могут помочь:

Проблема 107 включает в себя исправление для вашей проблемы asDisplayText.

person smarr    schedule 22.11.2013