Как отладить процесс узла, разветвленный изнутри службы Windows, используя VSCode
Я использую нод-окна с Node v10.0.0
создать службу Windows, которая запускает цель app.js
в качестве службы Windows. На высоком уровне эта библиотека создает оболочку .exe
файл, который регистрируется как служба Windows, которая затем порождает node
как дочерний процесс с некоторыми параметрами командной строки. Однажды раковина .exe
устанавливается как служба Windows, вы можете построить app.js
как обычный node
приложение и просто перезапустите службу Windows, чтобы отразить изменения. (Довольно круто!!)
Обычно командная строка ребенка node
процесс выглядит так:
node --harmony <other node command line args, which are optional> app.js
Поскольку в этой командной строке нет флагов отладки, я решил использовать VSCode's Attach by ProcessID
Функция и настройка конфигурации запуска отладки, как показано ниже:
{
"type": "node",
"request": "attach",
"name": "Attach by Process ID",
"processId": "${command:PickProcess}",
"stopOnEntry": true,
"protocol": "auto"
}
Я также проверяю, что я запускаю VSCode от имени Администратора и, конечно же, когда я запускаю службу Windows и запускаю отладчик "Attach by Process ID", VSCode показывает мне средство выбора с перечисленным процессом узла.
Однако, когда я пытаюсь присоединиться к этому процессу узла, я получаю ошибку:
Attach to process: cannot enable debug mode for process'5744'(Error: Command failed:
node -e process._debugProcess(5744)
[eval]:1
process.debugProcess(5744)
^
Error: Access is denied
at [eval]:1:9
....
....
Я пытался сделать это с node
дочерний процесс порождался как отдельный процесс, но это не имело никакого значения. Я догадываюсь, что каким-то образом процесс Windows поддерживает своего рода блокировку node
тем самым предотвращая взаимодействие любого другого процесса с ним.
Если я сконфигурирую свое развертывание службы Windows, по сути, получу дочерний процесс со следующей командной строкой:
node --harmony --inspect app.js
Тогда я могу сделать обычное подключение к порту 9229
(Порт отладки VSCode по умолчанию) и может пройти по коду, но app.js не удается, потому что служба Windows пытается запустить его несколько раз и время ожидания. Это особенность node-windows
предотвратить постоянные повторные попытки, если app.js
Вы пытаетесь выполнить хост, так как служба Windows имеет ошибки.
Обратите внимание, что нет ничего плохого в app.js и без --inspect
Отметьте, что служба Windows работает нормально, и все функции app.js работают как положено. express
сервис с одним корневым маршрутом получения, который отвечает "Hello World", если вы должны знать).
Кроме того, даже если я не пытался подключиться, служба Windows не запускается, если я использовал --inspect
флаг в командной строке дочернего процесса.
Я вспоминаю из моих дней Visual Studio / C#, когда-то был параметр отладки, который фактически отключал бы все таймеры, когда пользователь находился в сеансе отладки, чтобы объяснить именно такую проблему, но не уверен, будет ли это работать здесь, так как мы действительно пытаемся подключиться к node
процесс, который не зависит от управляемого процесса Windows.
Поэтому я просто хотел поделиться с сообществом и посмотреть, могли ли другие успешно справиться с этой проблемой.