2013-11-21 13 views
7

ContextDebugging-Interpreter in VM, wenn vm Primitiven Projekt

Als Hochschule Ändern wir die die pharo vm verwenden, um ein Objekt-Tabelle ändern möchten, und sehen, was passiert.

Wir verwenden eine pharo-vm clone from github und VMMaker. Der Aufbau der VM funktioniert einwandfrei.

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

und modifizierte StackInterpreter class>>initializePrimitiveTable entsprechend

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

Und es funktioniert:

Um eine primitive wir hinzugefügt, die gibt einen Integer erhöht loszulegen.

Problem

Wenn wir an die VM machen Änderungen, die wir bereits in der SmalltalkImage zu Testlauf wollen so brauchen wir nicht zu kompilieren und sehen, daß es nicht funktioniert hat.

Etwas wie:

StackInterpreter test: '1 inc' 

Und ich kann dann debuggen, wenn die primitiven falsch ist oder ein Fehler auftritt. Natürlich muss noch viel mehr getan werden, aber wie kann ich das erreichen?

Was wir versucht

  1. Kategorie VMMaker-InterpreterSimulation Klasse StackInterpreterSimulator. Der Versuch, den Code in den Kommentaren

    DoIt 
        ^(StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    

    Fehler:

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

    der ByteString nicht asDisplayText

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

    Fehler nicht versteht:

    PrimitiveFailed: primitive #basicNew: in Array class failed 
    

fand ich auch diesen Bildschirm Guss aber es debuggt nur die VM von außen mit gbd: http://vimeo.com/22485382#

Unser Projekt hier gehostet: http://smalltalkhub.com/#!/~kirstin/PharoObjectTable

Aktuelle Stand

wir eine Objekttabelle begonnen Umsetzung . Das Nachschlagen von Attributen kann durch die Objekttabelle gehen. Vollständige Objekttabellenunterstützung und keine Verwendung von direkten Pointes ist sehr schwierig, da Zeiger überall erwartet werden. Also verwenden wir Zeiger in die Objekttabelle, um zu identifizieren, wann eine Suche den OT durchlaufen sollte. Wir haben auch alle Grundelemente der Objekterstellung gefunden und fügen der Tabelle neue Objekte hinzu.

+1

Nur als Referenz, möchten Sie vielleicht die RoarVM betrachten, es hat normalerweise eine Objekttabelle, aber es gibt auch eine Variante ohne: https://github.com/smarr/RoarVM/tree/features/without-object- Tabelle Im Vergleich zur CogVM hat sie keinen JIT-Compiler und ist im Allgemeinen ziemlich langsam. Es kann jedoch noch ein paar Einsichten geben, wie man etwas angeht. – smarr

Antwort

4

Wie lange ist Ihr Projekt und wie viele Menschen sind Sie? Was du versuchst zu tun ist ziemlich viel Arbeit. Haben Sie gute Kenntnisse über Low-Level-Verhalten?

Um Ihre Frage zu beantworten, ist das Hauptproblem hier, dass der Zahnsimulator nicht in der Pharo vm Gabel gehalten wird. Dies liegt daran, dass niemand in der Pharo-Crew den Simulator benutzt. Wir verwenden nur externes Debugging von gdb. Tatsächlich arbeiten die Pharo-Leute hauptsächlich mit VM-Plugins, der Kern der VM wird hauptsächlich von Eliot Miranda gepflegt und entwickelt, der auf Squeak arbeitet. Daher berichten wir ihm, wenn ein Fehler im VM-Kern vorliegt.

Für Ihr Projekt würden Sie es in mindestens zwei Schritten aufgeteilt haben:

Schritt 1: Die Objekttabelle Arbeit mit dem Stapel machen VM

Schritt 2: macht die JIT Arbeit mit Ihrem Objekttisch

Beachten Sie, dass ich für Schritt 2 empfehle, die Art und Weise nicht zu ändern, auf die ein Objekt auf seine Kopfzeile zugreift, also eine VW-ähnliche Objekttabelle mit der Kopfzeile fester Größe in der Objekttabelle und den Feldern der Objekte (und möglicherweise Header-Erweiterungen) im Heap.

Verwenden Sie den StackVMSimulator und erstellen Sie zuerst den StackVM. Wenn alles funktioniert (einschließlich Kontext), können Sie darüber nachdenken, das JIT zu hacken. Kürzlich hat Guillermo Polito die Stack-VM in den Build-Prozess portiert (siehe PharoSVMBuilder statt PharoVMBuilder), ein Typ hat Probleme mit diesem Builder gemeldet, aber Sie könnten ihn ein wenig hacken, damit er funktioniert.

Nun, um den Simulator auf Pharo 2.0 (das ist die Pharo-Version des Generatorbildes) zu machen, müssen Sie den Monticello-Browser öffnen und aus Eliots Zweig das Cog-Paket zusammenführen (Repo MCHTttPRepository location: 'http: // quelle.squeak.org/ VMMaker '), aber nicht das neueste Cog, das etwa zum selben Datum wie das aktuelle VMMaker-Paket von pharo-vm ist, weil die neuesten Cog- und VMMaker-Zweige von Eliot nicht stabil sind.

Die Alternative ist, von Eliots Build-Image zu starten und Dinge aus dem Pharo-Zweig zusammenzuführen. Hier finden Sie Informationen zum Erstellen des Quietschen-Entwicklungs-Images (http://www.mirandabanda.org/cogblog/build-image/).

Dann gab Eliot mir dieses Skript einmal:

| cos | 
cos := CogVMSimulator newWithOptions: #(Cogit SistaStackToRegisterMappingCogit). 
cos desiredNumStackPages: 8. 
cos openOn: 'my/favourite.image'. 
cos openAsMorph; toggleTranscript; halt; run 

Sie die SistaStackToRegisterMappingCogit Option nicht benötigen. Ich denke, ein ähnliches Skript mit dem StackVMSimulator sollte funktionieren.

Schließlich gibt es einige Dokumentation über den Simulator, aber es ist nur für den CogSimulator (diese Dokumentationen erwartet Sie bereits wissen, wie der StackSimulator funktioniert und nur geben Hinweise darüber, wie es mit dem JIT verwenden): http://www.mirandabanda.org/cogblog/2008/12/12/simulate-out-of-the-bochs/ und In einem Video mit dem Titel "Cog VM (part x)", wobei x von 1 bis 6 ist, zeigt Eliot, wie er mit dem Simulator x86 zerlegt, den Stapel druckt und den Heap prüft.

Noch ein Tipp, stellen Sie Ihre Fragen auf die Pharo-Mailingliste (Pharo-User oder Pharo-Entwickler), denn hier dürfte niemand Ihre Frage bemerken (zum Glück hat mir mal jemand Ihre Frage aufgezeigt).

Und erzählen Sie auf der Pharo-Mailing-Liste, wenn Sie es geschafft haben, den Simulator in Pharo 2.0 zu betreiben, sind einige Leute (wie ich) sehr daran interessiert. Ich hatte vor, es irgendwann zu tun.

Viel Glück! Nettes Projekt sowieso.

1

Das letzte Mal, als ich versuchte, den Simulator zu benutzen, ist ungefähr vor einem Jahr, und ich habe es nicht funktionieren lassen. Allerdings gibt es ein paar Flecken, die ich nie davon ausgehen, bekam integriert, die hilfreich sein könnten:

Ausgabe 107 enthält einen Patch für Ihre asDisplayText Problem.