【问题标题】:Debugging gf3/sandbox module调试 gf3/沙盒模块
【发布时间】:2015-10-18 19:07:06
【问题描述】:

我正在 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文件中注释了超时功能:

// 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

【问题讨论】:

    标签: javascript node.js sandbox node-inspector


    【解决方案1】:

    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. 子进程启动后,打开另一个浏览器窗口调试shovel.js

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

    【讨论】:

    • 您好,感谢您的详细解答。 1. 我应该把这行放在哪里: self.child = spawn(this.options.node, ['--debug-brk=5859',this.options.shovel], { stdio: ['pipe', 'pipe' , '管道', 'ipc'] }); 2.什么是“调试-brk”?为什么不只使用“调试”? 3. 在第 4 和第 5 段中,您的意思是“node-debug”而不是“node debug”吗?谢谢。
    • 1.检查我的答案中的第一个链接。 2,3:我的答案是内置debugger 模块。这就是--debug-brk 的原因。对于node-inspector,您需要使用它自己的命令和参数,但步骤相同。我在 Windows 上,无法测试,因为 node-inspector 在 Window 上的播放效果不佳。
    • 为节点检查器添加了未经测试的步骤。让我知道它是否有效。
    猜你喜欢
    • 2012-08-31
    • 2013-07-21
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多