调试gf3/sandbox模块

oha*_*nho 7 javascript sandbox node.js node-inspector

我在node.js做我的宝贝步骤,我正在尝试理解沙盒机制.

目前我使用的是节点v4.0.0和node-inspector v0.12.3.

我已经安装了gf3/sandbox模块并使用这个简单的代码运行它:

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

为了便于调试,我还在sandbox.js文件中注释了超时功能:

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

问题是调试不会破坏任何行代码shovel.js,并且我100%确定模块正在使用其代码.

这是为什么 ?我可以做些什么来调试shovel.js

has*_*sin 4

sandbox.js在没有启用调试的情况下作为子进程生成shovel.js(例如没有--debug选项)。因此子进程正常执行,并且您的断点将被忽略。您还需要在调试模式下启动子进程。

如果您想同时调试两者,请使用不同的调试端口sandbox.jsshovel.js我不确定节点检查器,但这里是如何使用调试器模块执行此操作的示例。我确信您可以稍微调整一下以使其与节点检查器一起使用。

  1. 像您已经做的那样注释超时代码
  2. 在 中生成子进程时传递调试选项sandbox.js。请注意端口是5859

    self.child = spawn(this.options.node, ['--debug-brk=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });    
    
    Run Code Online (Sandbox Code Playgroud)
  3. example.js以调试模式启动。默认情况下,它从端口启动5858

    node --debug-brk example.js
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在sandbox.js通过连接到进行调试5858

    node debug localhost:5858
    
    Run Code Online (Sandbox Code Playgroud)
  5. 子进程启动后,您可以启动单独的终端并开始shovel.js在端口上进行调试5859

     node debug localhost:5859
    
    Run Code Online (Sandbox Code Playgroud)

对于节点检查器,我认为您需要使用node-debug命令而不是this.options.node子进程。还有一些选项可以显式设置调试端口。


从上面来看,这些可能是 的步骤node-inspector注意:我还没有测试过

  1. 与上面相同
  2. 打开sandbox.js文件并更改此行,如下所示,以在生成子进程时传递调试选项。请注意端口是5859

    self.child = spawn('node-debug', ['--debug-port=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });    
    
    Run Code Online (Sandbox Code Playgroud)
  3. example.js以调试模式启动。默认情况下,它从端口启动5858

    node-debug example.js
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在前往浏览器调试父进程:

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

  5. 子进程启动后,打开另一个浏览器窗口进行调试shovel.js

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