调试 gf3/sandbox 模块

Debugging gf3/sandbox module

我正在 node.js 中做我的初级步骤,我正在尝试了解沙盒机制。

目前我正在使用 node 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);
        });

为了方便调试,我也在sandbox.js文件中注释了timeout函数:

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

问题是调试不会在 shovel.js 的任何行代码上中断,我 100% 确定模块正在使用它的代码。

这是为什么?我该怎么做才能调试 shovel.js?

sandbox.jsspawning shovel.js as child process 未启用调试(例如,没有 --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'] });    
    
  3. 在调试模式下启动 example.js。默认情况下,它从 5858 端口开始:

    node --debug-brk example.js
    
  4. 现在通过连接到 5858 调试 sandbox.js:

    node debug localhost:5858
    
  5. 子进程启动后,您可以启动单独的终端并在端口 5859:

    上开始调试 shovel.js
     node debug localhost:5859
    

对于节点检查器,我认为您需要对子进程使用 node-debug 命令而不是 this.options.node。还 there are options 明确设置调试端口。


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

  1. 同上
  2. 打开 sandbox.js 文件并像下面这样更改 this line 以在生成子进程时传递调试选项。注意端口是 5859:

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

    node-debug example.js
    
  4. 现在前往浏览器调试父进程:

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

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

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