web-dev-qa-db-fra.com

Comment déboguer les processus fils Node.JS?

J'essaie de déboguer le processus enfant Node.JS créé à l'aide de:

var child = require('child_process');
child .fork(__dirname + '/task.js');

Le problème est que lors de l'exécution dans IntelliJ/WebStorm, les processus parent et enfant démarrent sur le même port.

debugger listening on port 40893
debugger listening on port 40893

Donc, il ne débogue que le processus parent.

Existe-t-il un moyen de configurer IntelliJ pour déboguer le processus enfant ou de le forcer à démarrer sur un autre port afin que je puisse le connecter au débogage distant?

25
Guy Korland

C'est un bogue connu dans node.js qui a récemment été corrigé (bien que non rétroporté à la v0.10).

Voir ce numéro pour plus de détails: https://github.com/joyent/node/issues/5318

Il existe une solution de contournement dans laquelle vous modifiez la ligne de commande pour chaque processus de travail, bien que l'API ne soit pas conçue pour être utilisée de cette façon (la solution de contournement risque de ne plus fonctionner). Voici le code source du problème github:

var cluster = require('cluster');
var http = require('http');

if (cluster.isMaster) {
  var debug = process.execArgv.indexOf('--debug') !== -1;
  cluster.setupMaster({
    execArgv: process.execArgv.filter(function(s) { return s !== '--debug' })
  });
  for (var i = 0; i < 2; ++i) {
    if (debug) cluster.settings.execArgv.Push('--debug=' + (5859 + i));
    cluster.fork();
    if (debug) cluster.settings.execArgv.pop();
  }
}
else {
  var server = http.createServer(function(req, res) {
    res.end('OK');
  });
  server.listen(8000);
}
19
Miroslav Bajtoš

Oui. Vous devez générer votre processus dans un nouveau port. Il existe une solution pour déboguer avec des clusters, comme vous pouvez le faire:

Démarrez votre application avec la commande --debug puis: 

var child = require('child_process');
var debug = typeof v8debug === 'object';
if (debug) {   
    //Set an unused port number.    
    process.execArgv.Push('--debug=' + (40894));    
}    
child.fork(__dirname + '/task.js');

debugger listening on port 40894

24
davidforneron

Solution simple et rapide (en utilisant chrome: // inspect/# devices)

var child = require('child_process');
child.fork(__dirname + '/task.js',[],{execArgv:['--inspect-brk']});

Ensuite, lancez votre application without any --inspect-brk et le processus principal ne déboguera pas, mais le processus créé ne contiendra aucun conflit.

Pour empêcher un fork de créer un conflit lors du débogage du processus principal;

child.fork(__dirname + '/task.js',[],{execArgv:['--inspect=xxxx']});

xxxx est un port non utilisé pour déboguer le processus principal. Bien que je n’aie pas réussi à me connecter facilement aux deux en même temps dans le débogueur, même s’il signale qu’il est à l’écoute.

6
Bob

si "process.execArgv" ne fonctionne pas, vous devez essayer:

if (debug) {
    process.argv.Push('--debug=' + (40894));
}

cela a fonctionné pour moi ..

3
kaasbaardje

Je trouve que définir l'attribut 'execArgv' dans la fonction fork fonctionnera:

const child = fork('start.js', [], {
cwd: startPath,
silent: true,
execArgv: ['--inspect=10245'] });
1
Jar Lin

Il existe une méthode plus moderne de débogage des processus enfants (ou de tout processus) avec Chrome DevTools.

Commencez votre application avec arg 

--inspect

comme ci-dessous:

node --debug=9200 --inspect app/main.js

Vous verrez le message avec l'URL pour chaque processus enfant:

Debugger listening on port 9200.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
    chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9200/207f2ab6-5700-4fc5-b6d3-c49a4b34a311
Debugger listening on port 9201.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
    chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9201/97be3351-2ea1-4541-b744-e720188bacfa
Debugger listening on port 9202.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
    chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9202/8eb8384a-7167-40e9-911a-5a8b902bb8c9

Si vous souhaitez déboguer les processus distants, remplacez simplement l'adresse 127.0.0.1 par la vôtre.

1
VooVoo