更改虚拟机原语时调试虚拟机解释器

7

背景

作为一项大学项目,我们想要改变pharo虚拟机使用一个对象表,并观察其结果。

我们使用了从github克隆的pharo虚拟机和VMMaker。构建虚拟机很顺利。

为了开始,我们添加了一个返回递增整数的原语:

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

并相应修改StackInterpreter类的initializePrimitiveTable方法

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

而且它有效。

问题

当我们对虚拟机进行更改时,我们希望在SmalltalkImage中先进行测试运行,这样我们就不需要编译并发现它没有起作用。

类似于:

StackInterpreter test: '1 inc'

如果原始组件出现错误或故障,我可以对其进行调试。当然,还需做更多工作,但我该如何实现呢?

我们尝试过的方法

  1. category VMMaker-InterpreterSimulation class StackInterpreterSimulator. Trying the code in the comments

    DoIt
        ^ (StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    

    errors:

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

    the ByteString does not understand asDisplayText

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

    error:

        PrimitiveFailed: primitive #basicNew: in Array class failed
    

我也找到了这个屏幕录制视频,但它只能使用gbd从外部调试VM:http://vimeo.com/22485382#

我们的项目托管在这里:http://smalltalkhub.com/#!/~kirstin/PharoObjectTable

当前状态

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


1
仅供参考,您可能想查看RoarVM,它通常具有对象表,但也有一个没有对象表的变体:https://github.com/smarr/RoarVM/tree/features/without-object-table 与CogVM相比,它没有JIT编译器,并且总体上速度较慢。然而,它仍然可能提供一些处理事物的见解。 - smarr
2个回答

4
你们的项目时间有多长?团队人数是多少?对我来说,你们试图做的工作相当繁重。你是否对低级行为有良好的了解?
回答你的问题,主要问题在于COG模拟器没有在Pharo VM分支中得到维护。这是因为Pharo团队中没有人使用该模拟器。我们只使用来自gdb的外部调试。实际上,Pharo团队主要从事VM插件开发,VM核心主要由Eliot Miranda负责维护和开发,他正在Squeak上工作。因此,如果VM核心出现错误,我们会向他报告。
对于你的项目,你至少需要分两步进行:
第一步:使对象表与堆栈VM配合工作。
第二步:让JIT与你的对象表配合工作。
请注意,在第二步中,我建议不要改变对象访问其头文件的方式,因此具有类似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,而是与当前pharo-vm的VMMaker包大致相同日期的那个,因为Eliot的分支的最新Cog和VMMaker不稳定。
另一种选择是从Eliot的构建图像开始,并从pharo分支合并事物。以下是有关如何构建squeak开发图像的信息(http://www.mirandabanda.org/cogblog/build-image/)。
然后Eliot曾经给我这个脚本:
| 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,Eliot展示了他如何使用模拟器来反汇编x86,打印堆栈并检查堆。
另一个提示是,在pharo邮件列表上提出您的问题(pharo用户或pharo dev),因为这里可能没有人注意到您的问题(幸运的是,这次有人指出了您的问题)。
如果您成功在Pharo 2.0中运行模拟器,请在pharo邮件列表上告诉大家,一些人(比如我)非常感兴趣。我计划在某个时候做到这一点。
祝好运!无论如何都是一个不错的项目。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接