Node.js:如何附加到正在运行的进程并使用控制台调试服务器?

Cro*_*lio 31 console node.js

我使用'forever'来运行我的应用程序.我想附加到运行环境来检查我的应用程序.那我该怎么办?

Bil*_*ill 44

来自http://nodejs.org/api/debugger.html:

高级用法

可以通过使用--debug命令行标志启动Node或使用SIGUSR1发信号通知现有Node进程来启用和访问V8调试器.

找到你的node进程的PID 然后发送SIGUSR1应该做的诀窍:

kill -s SIGUSR1 nodejs-pid
Run Code Online (Sandbox Code Playgroud)

然后运行node-inspector并浏览到它指示的URL.本教程中的更多内容.


And*_*Mao 11

Node 6.3开始,节点有一个内置的调试器,可以通过执行以下操作来触发(即使在生产应用程序中):

kill -USR1 <node-pid>
Run Code Online (Sandbox Code Playgroud)

节点进程会吐出这样的东西:

Debugger listening on ws://127.0.0.1:9229/f3f6f226-7dbc-4009-95fa-d516ba132fbd
For help see https://nodejs.org/en/docs/inspector
Run Code Online (Sandbox Code Playgroud)
  • 如果您可以从浏览器访问服务器,则可以使用chrome://inspecton http://host.domain:9229.
  • 如果无法通过浏览器连接(即服务器位于防火墙生产集群中),则可以激活REPL以检查命令行:

    node inspect -p <node-pid>
    
    Run Code Online (Sandbox Code Playgroud)

在此版本之前,它node-inspector是用于调试节点进程的单独工具.但是,正如在其自己的页面上所记录的那样,它主要被弃用,因为现在捆绑的调试器被主动维护并提供更高级的功能.有关此更改的更多信息,请参阅此主题.


小智 6

对我来说,运行节点版本 6.9.10 我必须:

kill -USR1 <node-pid>

然后

node debug -p <node-pid>

node inspect -p <node-pid>此版本节点的命令失败。


dan*_*ugh 5

您可以在应用中添加REPL.例如,如果您添加REPL以侦听localhost端口5001,则照常启动应用程序并使用telnet登录:telnet localhost 5001.这将带您到一个提示,您可以直接与您的应用程序进行交互.

或者,如果您的应用需要在达到某个状态时"暂停",则需要添加"调试器"; 将代码区域划分到您想要这些断点的区域,然后以调试模式启动应用程序.

希望有所帮助.


Qwe*_*rty 5

Windows 用户

如果您使用的 Windows 不支持 POSIX 信号,则可以从另一个 cmd.

node -e "process._debugProcess(PID)"
Run Code Online (Sandbox Code Playgroud)




如需详细指南或在 VSCode 中设置调试,请按照以下简单步骤操作:

  1. 在 VSCode 中,launch.json通过单击滚轮打开配置或创建新配置
    (这是调试视图CtrlShiftD

在此处输入图片说明

  1. 节点默认会监听 9229 端口,所以添加这个配置:
{
  "type": "node",
  "request": "attach",
  "name": "Attach to 9229",
  "port": 9229
},
Run Code Online (Sandbox Code Playgroud)
  1. 打开任务管理器并找到您的节点进程的 PID
    我可以通过"build"所在的文件夹识别我的index.js在此处输入图片说明
  2. 打开另一个 cmdgit-bash运行此命令,您的进程的 PID
    在哪里21392
node -e "process._debugProcess(21392)"
Run Code Online (Sandbox Code Playgroud)
  1. 你应该看到这个调试器监听 ws:9229
  2. 从 VSCode Attach to 9229开始调试
    在此处输入图片说明

现在一切都应该准备好了。