gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:28:07 25 4
gpt4 key购买 nike

上下文

作为一个大学项目,我们希望更改 pharo 虚拟机以使用对象表,看看会发生什么。

我们使用pharo-vm clone from github和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. 类别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

我还发现了这个屏幕截图,但它仅使用 gbd 从外部调试虚拟机:http://vimeo.com/22485382#

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

当前状态

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

最佳答案

您的项目需要多长时间?有多少人?对我来说,你尝试做的事情是相当艰巨的工作。您对低级行为了解吗?

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

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

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

第 2 步:使 JIT 与您的对象表配合使用

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

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

现在要使模拟器在 Pharo 2.0(这是您拥有的生成器镜像的 Pharo 版本)上工作,您必须打开 monticello 浏览器并从 Eliot 的分支合并 Cog 包(存储库 MCHttpRepository 位置:'http:///source.squeak.org/VMMaker'),但不是最新的 Cog,它与 pharo-vm 的当前 VMMaker 包的日期大致相同,因为 Eliot 分支的最新 Cog 和 VMMaker 不稳定。

另一种选择是从 Eliot 的构建镜像开始,并合并 pharo 分支中的内容。以下是有关如何构建 Squeak 开发镜像的信息 ( 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 中运行模拟器,有些人(如我)对此非常感兴趣。我本来计划在某个时候这样做。

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

关于smalltalk - 更改 vm 原语时在 VM 中调试解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com