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

时间:2013-11-21 22:48:03

标签: smalltalk pharo squeak vm-implementation

上下文

作为一个大学项目,我们想要改变pharo vm以使用对象表,看看会发生什么。

我们使用pharo-vm clone from github和VMMaker。构建VM工作正常。

为了开始,我们添加了一个返回增量Integer的原语:

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

并相应修改StackInterpreter class>>initializePrimitiveTable

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

它有效。

问题

当我们对VM进行更改时,我们想要在SmalltalkImage中进行测试运行,这样我们就不需要编译并看到它不起作用。

类似的东西:

StackInterpreter test: '1 inc'

然后我可以调试原语是错误还是发生错误。当然需要做得更多,但我怎样才能做到这一点?

我们尝试了什么

  1. 类别VMMaker-InterpreterSimulationStackInterpreterSimulator。尝试评论中的代码

    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
    
  3. 我也找到了这个屏幕,但它只使用gbd从外部调试VM:http://vimeo.com/22485382#

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

    当前状态

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

2 个答案:

答案 0 :(得分:4)

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

要回答你的问题,这里的主要问题是cog模拟器没有在pharo vm fork中维护。这是因为pharo工作人员中没有人使用模拟器。我们只使用gdb的外部调试。实际上,pharo人主要使用VM插件,VM的核心主要由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位置:'http:/ / source.queque.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(第x部分)”的视频中,x为1到6,Eliot展示了他如何使用模拟器来反汇编x86,打印堆栈并检查堆。

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

如果你设法在Pharo 2.0中运行模拟器,请告诉pharo邮件列表,有些人(对我而言)对它很感兴趣。我计划在某个时候这样做。

祝你好运!反正很好的项目。

答案 1 :(得分:1)

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

问题107包含针对asDisplayText问题的补丁。