2015-09-22 12 views
7

Ich mache meine Baby-Schritte in node.js, und ich versuche, Sandbox-Mechanismus zu verstehen.Debugging gf3/Sandbox-Modul

Derzeit verwende ich Knoten v4.0.0 und Knoten-Inspector v0.12.3.

I GF3/Sandbox-Modul installiert haben und es mit diesem einfachen Code ausführen:

var s = new Sandbox(); 
s.run('1 + 1 + " apples"',function(output) { 
       console.log(output.result); 
     }); 

Um leicht zu debuggen, ich habe auch die Timeout-Funktion in sandbox.js Datei kommentiert:

// timer = setTimeout(function() { 
    // self.child.stdout.removeListener('output', output); 
    // stdout = JSON.stringify({ result: 'TimeoutError', console: [] }); 
    // self.child.kill('SIGKILL'); 
    // }, self.options.timeout); 

Das Problem ist, dass das Debug nicht auf jeden Zeilencode von shovel.js bricht, und ich bin 100% sicher, dass das Modul seinen Code verwendet.

Warum ist das? Und was kann ich tun, um shovel.js zu debuggen?

Antwort

3

sandbox.js ist spawning shovel.js as child process ohne Debugging aktiviert (z. B. keine --debug Option). Der Child-Prozess wird also normal ausgeführt und Ihre Breakpoints werden einfach ignoriert. Sie müssen den Child-Prozess auch im Debug-Modus starten.

Wenn Sie gleichzeitig sowohl sandbox.js als auch shovel.js debuggen möchten, verwenden Sie verschiedene Debug-Ports. Ich bin mir über den Knoten-Inspector nicht sicher, aber hier ist ein Beispiel, wie Sie es mit dem Debugger-Modul machen können. Ich bin mir sicher, dass Sie ein wenig zwicken können, damit es mit node-inspector funktioniert.

  1. Kommentar der Timeout-Code wie Sie haben bereits
  2. Pass Debug-Option während Kindprozess sandbox.js in Laichen. Hinweis ist die Port-5859:

    self.child = spawn(this.options.node, ['--debug-brk=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });  
    
  3. Start example.js im Debug-Modus. Standardmäßig startet es bei 5858 Häfen:

    node --debug-brk example.js 
    
  4. Jetzt sandbox.js debuggen, indem Sie eine Verbindung zu 5858:

    node debug localhost:5858 
    
  5. Sobald das Kind beginnt, können Sie separaten Terminal anwerfen und starten shovel.js Debuggen auf 5859 Hafen:

    node debug localhost:5859 
    

Für Node-Inspector, ich denke, Sie müssen node-debug Befehl anstelle von this.options.node für Kindprozess verwenden. Auch there are options Debug-Port explizit festlegen.


Von oben, Dies könnten die Schritte für node-inspector sein.Hinweis: Ich habe es nicht getestet:

  1. Wie oben
  2. öffnen sandbox.js Datei und ändern this line wie folgende Debug-Option passieren, während Kind Prozess Laichen. Hinweis ist die Port-5859:

    self.child = spawn('node-debug', ['--debug-port=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });  
    
  3. Start example.js im Debug-Modus. Standardmäßig startet es bei 5858 Häfen:

    node-debug example.js 
    
  4. Kopf nun an den Browser zu debuggen geordneten Prozess:

    http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5858

  5. Sobald das Kind beginnt, öffnen ein neues Browserfenster zu debuggen shovel.js:

    http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5859

+0

Hallo, Danke für Ihre ausführliche Antwort. 1. Wo sollte ich diese Zeile setzen: self.child = spawn (this.options.node, ['--debug-brk = 5859', this.options.shovel], {stdio: ['pipe', 'pipe', 'pipe', 'ipc'}}); 2. Was ist "debug-brk"? Warum nicht einfach "debuggen"? 3. In den Absätzen 4 & 5 meinen Sie "node-debug" statt "node debug"? Danke. – ohadinho

+0

1. Überprüfen Sie den ersten Link in meiner Antwort. 2,3: Meine Antwort ist für eingebautes ['debugger'] (https://nodejs.org/api/debugger.html) Modul. Deshalb ist das '--debug-brk'. Für 'node-inspector' müssen Sie eigene Befehle und Argumente verwenden, aber die Schritte sind gleich. Ich bin auf Windows und kann nicht testen, da 'node-inspector' auf Windows nicht gut spielt. – hassansin

+0

hinzugefügt ungetestete Schritte für Knoten-Inspektor. Lass mich wissen ob es funktioniert. – hassansin