2013-11-21 33 views
7

contestodebug interprete in VM quando si cambia primitive vm

Come un progetto universitario che vogliamo cambiare la vm del Pharo di utilizzare un oggetto-tavolo e vedere cosa succede.

Utilizziamo un pharo-vm clone from github e VMMaker. Costruire la VM funziona bene.

Per iniziare abbiamo aggiunto un primitivo che restituisce un intero incrementato:

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

e modificato di conseguenza StackInterpreter class>>initializePrimitiveTable

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

e funziona.

Problema

Quando facciamo modifiche al VM che vogliamo testare-run già nel SmalltalkImage quindi non abbiamo bisogno di compilare e vedere che non ha funzionato.

Qualcosa di simile:

StackInterpreter test: '1 inc' 

E poi posso mettere a punto se il primitivo è sbagliato o si verifica un errore. Ovviamente bisogna fare molto di più, ma come posso ottenerlo?

quello che abbiamo provato

  1. categoria VMMaker-InterpreterSimulation classe StackInterpreterSimulator. Cercando il codice nei commenti

    DoIt 
        ^(StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    

    errori:

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

    il ByteString non capisce asDisplayText

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

    errore:

    PrimitiveFailed: primitive #basicNew: in Array class failed 
    

Ho trovato anche questo cast schermo, ma esegue il debug solo il VM dall'esterno usando GBD: http://vimeo.com/22485382#

Il nostro progetto è ospitato qui: http://smalltalkhub.com/#!/~kirstin/PharoObjectTable

Stato corrente

Abbiamo iniziato ad attuare una tabella di oggetti . La ricerca degli attributi può passare attraverso la tabella degli oggetti. Il supporto completo della tabella degli oggetti e l'uso di punti diretti non sono molto complessi in quanto i puntatori sono attesi ovunque. Quindi usiamo i puntatori nella tabella degli oggetti per identificare quando una ricerca deve passare attraverso l'OT. Abbiamo anche trovato tutte le primitive di creazione di oggetti e aggiunto nuovi oggetti alla tabella.

+1

Solo per riferimento, si potrebbe voler guardare il RoarVM, normalmente ha una tabella oggetti ma c'è anche una variante senza: https://github.com/smarr/RoarVM/tree/features/without-object- tabella Rispetto al CogVM, non ha un compilatore JIT, ed è piuttosto lento in generale. Tuttavia, potrebbe comunque fornire alcune informazioni su come affrontare le cose. – smarr

risposta

4

Quanto è lungo il tuo progetto e quante persone sei? Per me quello che provi a fare è un po 'di lavoro. Hai una buona conoscenza del comportamento a basso livello?

Per rispondere alla tua domanda, il problema principale qui è che il simulatore di ingranaggi non viene mantenuto nella forcella pharo vm. Questo perché nessuno nella squadra di pharo usa il simulatore. Utilizziamo solo il debug esterno da gdb. In effetti i pharo lavorano principalmente su plugin VM, il nucleo della VM è principalmente mantenuto e sviluppato da Eliot Miranda che funziona su Squeak. Pertanto segnaliamo a lui quando c'è un bug nel nucleo della VM.

Per il progetto che avrebbe dovuto dividerlo in almeno 2 fasi:

Fase 1: far funzionare il tavolo oggetto con lo stack di VM

Fase 2: far funzionare il JIT con la vostra tabella di oggetto

Si noti che per il passaggio 2 si consiglia di non modificare il modo in cui un oggetto accede alla relativa intestazione, quindi con una tabella di oggetti di tipo VW in cui si ha l'intestazione di dimensione fissa su quella nella tabella degli oggetti ei campi degli oggetti (e forse delle estensioni dell'intestazione) nell'heap.

Quindi utilizzare StackVMSimulator e creare prima StackVM. Quando tutto funziona (incluso il contesto), puoi pensare a hackerare il JIT. Recentemente Guillermo Polito ha portato la pila VM al processo di compilazione (vedi PharoSVMBuilder invece di PharoVMBuilder), un ragazzo ha segnalato problemi con questo builder, ma è possibile modificarlo un po 'per farlo funzionare.

Ora per far funzionare il simulatore su Pharo 2.0 (che è la versione Pharo dell'immagine del generatore che hai), devi aprire il browser monticello e unire dal ramo di Eliot il pacchetto Cog (repository MCHttpRepository posizione: 'http: // source. squeak. org/VMMaker '), ma non l'ultimo Cog, quello a circa la stessa data dell'attuale pacchetto VMMaker di pharo-vm perché gli ultimi Cog e VMMaker del ramo di Eliot non sono stabili.

L'alternativa è iniziare dall'immagine di Eliot e unire le cose dal ramo pharo. Qui ci sono informazioni su come costruire l'immagine dello sviluppo del cigolio (http://www.mirandabanda.org/cogblog/build-image/).

Poi Eliot mi ha dato questo script una volta:

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

non ti servono l'opzione SistaStackToRegisterMappingCogit. Immagino che qualche script simile con StackVMSimulator dovrebbe funzionare.

Infine ci sono alcuni documentazione sul simulatore, ma è solo per il CogSimulator (queste documentazioni si aspetta già sa come funziona lo StackSimulator, e solo offrirti suggerimenti su come utilizzarlo con il JIT): http://www.mirandabanda.org/cogblog/2008/12/12/simulate-out-of-the-bochs/ e in uno dei video chiamati "Cog VM (part x)", x che va da 1 a 6, Eliot mostra come usa il simulatore per disassemblare x86, stampare lo stack e ispezionare l'heap.

Un altro consiglio, poni le tue domande sulla mailing list di pharo (utenti pharo o pharo dev), perché qui nessuno potrebbe notare la tua domanda (fortunatamente qualcuno mi ha segnalato la tua domanda questa volta).

E dire sulla mailing list di pharo se si è riusciti a eseguire il simulatore in Pharo 2.0, alcune persone (come me) sono molto interessate a questo. Stavo pensando di farlo ad un certo punto.

Buona fortuna! Bel progetto comunque.