Smalltalk 更改VM原语时调试VM中的解释器

Smalltalk 更改VM原语时调试VM中的解释器,smalltalk,pharo,squeak,vm-implementation,Smalltalk,Pharo,Squeak,Vm Implementation,上下文 作为一个大学项目,我们希望更改pharo vm的使用对象表,看看会发生什么 我们使用和VMMaker。构建虚拟机运行良好 首先,我们添加了一个返回递增整数的原语: InterpreterPrimitives>>primitiveIntegerIncrement "increments an integer" self pushInteger: self popInteger + 1 . 并相应地修改了stackexplorer类>>初始化primitivet

上下文

作为一个大学项目,我们希望更改pharo vm的使用对象表,看看会发生什么

我们使用和VMMaker。构建虚拟机运行良好

首先,我们添加了一个返回递增整数的原语:

InterpreterPrimitives>>primitiveIntegerIncrement
    "increments an integer"
    self pushInteger: self popInteger + 1 .
并相应地修改了
stackexplorer类>>初始化primitivetable

MaxPrimitiveIndex := 576.
"... and so on ..."
    (575 primitiveFail)
    (576 primitiveIntegerIncrement))
它是有效的

问题

当我们对VM进行更改时,我们希望已经在SmalltalkImage中测试运行,这样我们就不需要进行编译,并且看到它不工作

比如:

StackInterpreter test: '1 inc'
然后我可以调试原语是否错误或是否发生错误。当然,还需要做更多的工作,但我如何才能做到这一点

我们尝试过的

  • 类别
    VMMaker解释器模拟
    class
    StackTranslatorSimulator
    。正在尝试注释中的代码

    DoIt
        ^ (StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    
    错误:

        displayForm := 'Display has not yet been installed' asDisplayText form.
    
    ByteString无法理解
    asDisplayText

  • 错误:

        PrimitiveFailed: primitive #basicNew: in Array class failed
    
  • 我还发现了此屏幕转换,但它仅使用gbd从外部调试VM:

    我们的项目位于:

    当前状态


    我们开始实现一个对象表。属性的查找可以遍历对象表。完全对象表支持和不使用直接指针是非常棘手的,因为到处都需要指针。因此,我们使用指向对象表的指针来确定查找何时应该通过OT。我们还找到了所有对象创建原语,并将新对象添加到表中。

    我上一次尝试使用模拟器大约是一年前,我没有让它工作。 但是,有一些补丁可能会有所帮助,我认为这些补丁从未集成:


    第107期包括您的
    asDisplayText
    期的补丁。

    您的项目有多长,您有多少人?对我来说,你要做的是相当艰巨的工作。你对低级行为有很好的了解吗

    为了回答您的问题,这里的主要问题是在pharo vm fork中没有维护cog模拟器。这是因为法老号机组中没有人使用模拟器。我们只使用来自gdb的外部调试。事实上,pharo的人主要在VM插件上工作,VM的核心主要由Eliot Miranda维护和开发,Eliot Miranda在Squeak上工作。因此,当VM核心出现错误时,我们会向他报告

    对于您的项目,您必须将其至少分为两个步骤:

    步骤1:使对象表与堆栈VM一起工作

    步骤2:使JIT与对象表一起工作

    请注意,对于步骤2,我建议不要更改对象访问其头的方式,因此要有一个类似VW的对象表,其中对象表中的头有固定大小的头,堆中的对象字段(可能还有头扩展名)

    因此,首先使用StackVMSimulator并构建StackVM。当一切正常时(包括上下文),您可以考虑修改JIT。最近Guillermo Polito将Stack VM移植到构建过程中(请参见PharoSVMBuilder而不是PharoVMBuilder),有人报告了该构建器存在的问题,但您可以对其进行一些修改以使其正常工作

    现在,要使模拟器在Pharo 2.0上工作(这是您拥有的生成器映像的Pharo版本),您必须打开monticello浏览器并从Eliot的分支合并Cog包(repo MCHttpRepository location:'http://source.squeak.org/VMMaker'),但不是最新的Cog,由于Eliot分支机构的最新Cog和VMMaker不稳定,因此该版本与pharo vm的当前VMMaker包的日期大致相同

    另一种选择是从艾略特的建筑形象开始,合并法罗分支的东西。下面是关于如何构建squeak开发映像()的信息

    然后艾略特给了我一个剧本:

    | cos |
    cos := CogVMSimulator newWithOptions: #(Cogit SistaStackToRegisterMappingCogit).
    cos desiredNumStackPages: 8.
    cos openOn: 'my/favourite.image'.
    cos openAsMorph; toggleTranscript; halt; run
    
    您不需要SistaStackToRegisterMappingCogit选项。我想一些与StackVMSimulator类似的脚本应该可以工作

    最后,有一些关于模拟器的文档,但仅适用于CogSimulator(这些文档希望您已经知道StackSimulator是如何工作的,并为您提供有关如何在JIT中使用它的提示): 在一个名为“Cog VM(part x)”的视频中,x从1到6,Eliot展示了他如何使用模拟器分解x86、打印堆栈和检查堆

    另一个技巧,在pharo邮件列表(pharo用户或pharo开发人员)上询问您的问题,因为这里可能没有人注意到您的问题(幸运的是,这次有人指出了您的问题)

    在pharo邮件列表中告诉我们,如果您成功地在pharo 2.0中运行了模拟器,有些人(如我)对它非常感兴趣。我打算在某个时候做这件事


    祝你好运!无论如何,这是一个不错的项目。

    仅供参考,您可能想看看RoarVM,它通常有一个对象表,但也有一个没有对象表的变体:与CogVM相比,它没有JIT编译器,而且一般来说速度相当慢。然而,它可能仍然会提供一些关于如何处理问题的见解。
    | cos |
    cos := CogVMSimulator newWithOptions: #(Cogit SistaStackToRegisterMappingCogit).
    cos desiredNumStackPages: 8.
    cos openOn: 'my/favourite.image'.
    cos openAsMorph; toggleTranscript; halt; run