2013-11-21 24 views
7

语境改变VM元

当我们想要改变的菲罗VM使用对象表,看看会发生什么一个大学项目在调试时解释在VM。

我们使用pharo-vm clone from 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所以我们不需要编译,看看它是没有工作的VM。

喜欢的东西:

StackInterpreter test: '1 inc' 

然后,我可以调试原始错误或发生错误。当然需要做更多的事情,但我怎么能做到这一点?

我们试图

  1. 类别VMMaker-InterpreterSimulationStackInterpreterSimulator。试图代码中的注释

    DoIt 
        ^(StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    

    错误:

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

    的字节串不明白asDisplayText

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

    错误:

    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-表与CogVM相比,它没有JIT编译器,总体来说它相当慢。然而,它仍然可以提供一些关于如何处理事情的见解。 – smarr

回答

4

你的项目有多久了,你有多少人?对我而言,你试图做的是相当一些工作。你对低层次行为有很好的了解吗?

要回答你的问题,这里的主要问题是齿轮模拟器没有维护在pharo虚拟机fork中。这是因为pharo船员中没有人使用模拟器。我们只使用gdb的外部调试。实际上,Pharo人主要在VM插件上工作,VM的核心主要由Eliot Miranda在Squeak工作的维护和开发。因此,当VM核心发生错误时,我们会向他报告。

为你的项目,你就必须把它在至少2个步骤分为:

步骤1:用栈对象表工作VM

第2步:使你的对象表中的JIT工作

请注意,对于第2步,我建议不要改变对象访问其标题的方式,因此需要一个类似VW的对象表,其中对象表中的对象表具有固定大小的标题,并且字段堆中的对象(也可能是头扩展)。

所以使用StackVMSimulator并首先构建StackVM。当一切都会正常工作时(包括上下文),你可以考虑对JIT进行黑客攻击。最近,Guillermo Polito将堆栈虚拟机移植到构建过程中(请参阅PharoSVMBuilder而不是PharoVMBuilder),一位家伙报告说这个构建者存在问题,但您可以稍微修改它以使其工作。

现在让模拟器在Pharo 2.0上工作(这是Pharo版本的生成器映像),您必须打开monticello浏览器并从Eliot的分支合并Cog包(repo MCHttpRepository location:'http: // source。squeak。org/VMMaker'),但不是最新的Cog,与当前Pharo-vm的VMMaker软件包大致相同,因为Eliot分支的最新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,Eliot展示了他如何使用模拟器来拆卸x86,打印堆栈并检查堆。

另一个提示,请在Pharo邮件列表(Pharo用户或Pharo开发者)上提问,因为这里没有人会注意到你的问题(幸运的是这次有人指出我的问题)。

并告诉Pharo邮件列表,如果您在Pharo 2.0中运行模拟器,一些人(如我)对此非常感兴趣。我打算在某个时候做到这一点。

祝你好运!好的项目无论如何。