2012-02-29 57 views
7

我使用节点客户端的调试器,像这样:在子进程上使用Node.js命令行调试器?

节点调试myscript.js

但这个过程使用生成子:

VAR孩子=要求(“child_process “).fork(cmd,args);

有没有办法让这个孩子也可以在“调试”模式下启动?

+0

也许你可以在主进程处于调试模式时检查myscript内部,然后将'--debug'作为'args'之一传递。 – loganfsmyth 2012-03-01 01:20:37

+0

并且不要忘记更改调试器端口,因为默认情况下已经忙于父进程调试器 – 2012-03-01 03:16:13

+0

添加--debug或--debug = 5859(新端口)fork cmd或args导致错误。我认为这是因为--debug是Node进程的选项,而不是被分叉的进程。任何其他想法? – user836003 2012-03-02 01:36:59

回答

0

没问题。您只需将调试信号发送到正在运行的进程。看看节点检查文档做一个找到启用调试模式

我不能老是告诉你如何做一个调试BRK,我不知道你可以,但你总是可以做一些事情,从这样的代码

while(true){debugger}

因此,您可以捕获调试语句,然后手动跳出循环。肮脏我知道=)

3

是的。您必须在新的端口中产生您的流程。有一种变通方法与集群进行调试,以同样的方式,你可以这样做:

var debug = process.execArgv.indexOf('--debug') !== -1; 
if(debug) { 
    //Set an unused port number. 
    process.execArgv.push('--debug=' + (5859)); 
} 
var child = require("child_process").fork(cmd, args); 

.... 调试器监听端口5859

+0

我挣扎在此,因为我影响了child_process模块​​到一个名为process的局部变量,隐藏了节点process全局变量,因此process.execArgv没有被定义。 Beaware“process”是一个节点全局变量! – 2014-09-30 09:55:10

-1

这里的另一种方式,这会让一个孩子可调试自由端口:

// Determine if in debug mode. 
// If so, pass in a debug-brk option manually, without specifying port. 
var startOpts = {}; 
var isInDebugMode = typeof v8debug === 'object'; 
if(isInDebugMode) { 
    startOpts = {execArgv: ['--debug-brk']}; 
} 
child_process.fork('./some_module.js', startArgs, startOpts); 
+0

对不起,这对我没有用,我认为你需要明确地告诉它听一个未使用的端口,像这样execArgv.push(' - debug ='+(5303 + processId ++)); – 2016-03-20 03:39:12

+0

@ davidforneron的回答是更正确的 – 2016-03-20 03:39:59