Отладка модуля gf3/sandbox

Я делаю свои маленькие шаги в node.js и пытаюсь понять механизм песочницы.

В настоящее время я использую узел v4.0.0 и узел-инспектор 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?


person ohadinho    schedule 22.09.2015    source источник


Ответы (1)


sandbox.js порождает shovel.js как дочерний процесс без включенной отладки( например, без опции --debug). Таким образом, дочерний процесс выполняется нормально, а ваши точки останова просто игнорируются. Вам также нужно запустить дочерний процесс в режиме отладки.

Если вы хотите одновременно отлаживать и sandbox.js, и shovel.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. Теперь отладьте sandbox.js, подключившись к 5858:

    node debug localhost:5858
    
  5. После запуска дочернего процесса вы можете запустить отдельный терминал и начать отладку shovel.js на порту 5859:

     node debug localhost:5859
    

Я думаю, что для инспектора узлов вам нужно использовать команду node-debug вместо this.options.node для дочернего процесса. Кроме того, существуют параметры для явного задания порта отладки.


Сверху это могут быть шаги для node-inspector. Примечание. Я не проверял:

  1. То же, что и выше
  2. Откройте файл sandbox.js и измените эту строку следующим образом: опция отладки при порождении дочернего процесса. Обратите внимание на порт 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

person hassansin    schedule 16.10.2015
comment
Привет, спасибо за ваш подробный ответ. 1. Где я должен поместить эту строку: self.child = spawn(this.options.node, ['--debug-brk=5859',this.options.shovel], { stdio: ['pipe', 'pipe' , 'pipe', 'ipc'] }); 2. Что такое debug-brk? Почему бы просто не использовать отладку? 3. В пунктах 4 и 5 вы имели в виду отладку узла вместо отладки узла?? Спасибо. - person ohadinho; 18.10.2015
comment
1. проверьте первую ссылку в моем ответе. 2,3: Мой ответ касается встроенного модуля debugger. Вот почему --debug-brk. Для node-inspector вам нужно использовать свои собственные команды и аргументы, но шаги будут такими же. Я работаю в Windows и не могу протестировать, так как node-inspector плохо работает в Windows. - person hassansin; 18.10.2015
comment
добавлены непроверенные шаги для инспектора узлов. дайте мне знать, если это работает. - person hassansin; 18.10.2015