调试 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.js
是 spawning shovel.js
as child process 未启用调试(例如,没有 --debug
选项)。因此子进程正常执行,您的断点将被忽略。您也需要在调试模式下启动子进程。
如果要同时调试 sandbox.js
和 shovel.js
,请使用不同的调试端口。我不确定节点检查器,但这是一个如何使用调试器模块执行此操作的示例。我相信您可以稍微调整一下以使其与节点检查器一起使用。
- 像您一样评论超时代码
在 sandbox.js
中生成子进程时传递调试选项。注意端口是 5859
:
self.child = spawn(this.options.node, ['--debug-brk=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });
在调试模式下启动 example.js
。默认情况下,它从 5858
端口开始:
node --debug-brk example.js
现在通过连接到 5858
调试 sandbox.js
:
node debug localhost:5858
子进程启动后,您可以启动单独的终端并在端口 5859
:
上开始调试 shovel.js
node debug localhost:5859
对于节点检查器,我认为您需要对子进程使用 node-debug
命令而不是 this.options.node
。还 there are options 明确设置调试端口。
从上面看,这些可能是 node-inspector
的步骤。 注:我没测试过:
- 同上
打开 sandbox.js
文件并像下面这样更改 this line 以在生成子进程时传递调试选项。注意端口是 5859
:
self.child = spawn('node-debug', ['--debug-port=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });
在调试模式下启动 example.js
。默认情况下,它从 5858
端口开始:
node-debug example.js
现在前往浏览器调试父进程:
http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5858
子进程启动后,打开另一个浏览器window进行调试shovel.js
:
http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5859
我正在 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.js
是 spawning shovel.js
as child process 未启用调试(例如,没有 --debug
选项)。因此子进程正常执行,您的断点将被忽略。您也需要在调试模式下启动子进程。
如果要同时调试 sandbox.js
和 shovel.js
,请使用不同的调试端口。我不确定节点检查器,但这是一个如何使用调试器模块执行此操作的示例。我相信您可以稍微调整一下以使其与节点检查器一起使用。
- 像您一样评论超时代码
在
sandbox.js
中生成子进程时传递调试选项。注意端口是5859
:self.child = spawn(this.options.node, ['--debug-brk=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });
在调试模式下启动
example.js
。默认情况下,它从5858
端口开始:node --debug-brk example.js
现在通过连接到
5858
调试sandbox.js
:node debug localhost:5858
子进程启动后,您可以启动单独的终端并在端口
上开始调试5859
:shovel.js
node debug localhost:5859
对于节点检查器,我认为您需要对子进程使用 node-debug
命令而不是 this.options.node
。还 there are options 明确设置调试端口。
从上面看,这些可能是 node-inspector
的步骤。 注:我没测试过:
- 同上
打开
sandbox.js
文件并像下面这样更改 this line 以在生成子进程时传递调试选项。注意端口是5859
:self.child = spawn('node-debug', ['--debug-port=5859',this.options.shovel], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] });
在调试模式下启动
example.js
。默认情况下,它从5858
端口开始:node-debug example.js
现在前往浏览器调试父进程:
http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5858
子进程启动后,打开另一个浏览器window进行调试
shovel.js
:http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5859