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

Posted

技术标签:

【中文标题】Node.js:如何附加到正在运行的进程并使用控制台调试服务器?【英文标题】:Node.js: How to attach to a running process and to debug the server with a console? 【发布时间】:2012-10-14 16:33:23 【问题描述】:

我使用“永远”来运行我的应用程序。我想附加到运行环境来检查我的应用程序。那么我能做什么呢?

【问题讨论】:

= = 不是真的。我只知道三个命令: 1.forever start my_script.js; 2.forever list//列出所有正在运行的节点进程; 3.forever stop my_pid //你可以通过运行'forever list'找到pid;对我来说足够了 -,- 。如有需要,我会去谷歌寻求帮助,这是我的风格^^ 【参考方案1】:

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

高级用法

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

找到node 进程的PID,然后发送SIGUSR1 应该可以解决问题:

kill -s SIGUSR1 nodejs-pid

然后运行 ​​node-inspector 并浏览到它指示的 URL。更多内容请参见this tutorial。

【讨论】:

我试过了:$ node debug my_script.js,但是脚本必须手动分步运行。我需要的是正常运行它并将其附加到已经运行的进程并使用交互式控制台对其进行测试。但真的很感谢你的帮助^^ @Croplio:比尔说的很管用。见this tutorial。 @Croplio,它是node --debug my_script.js,带有--debug,而不是debug(注意两个连字符) 这个答案已经过时,不再需要节点检查器 是否也可以通过信号禁用调试?【参考方案2】:

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

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

希望对您有所帮助。

【讨论】:

【参考方案3】:

即使这是一个古老但已回答的问题,也有一种更简单的方法,就是将参数传递给节点:

forever start -c 'node --debug-brk' main.js

如果您不想等待附加调试器,请将--debug-brk 替换为--debug

【讨论】:

【参考方案4】:

Node 6.3 开始,node 有一个内置的调试器,可以通过以下方式触发(即使在生产应用中):

kill -USR1 <node-pid>

node进程会吐出这样的东西:

Debugger listening on ws://127.0.0.1:9229/f3f6f226-7dbc-4009-95fa-d516ba132fbd
For help see https://nodejs.org/en/docs/inspector
如果您可以从浏览器访问服务器,则可以在http://host.domain:9229 上使用chrome://inspect

如果您无法通过浏览器连接(例如,服务器位于防火墙生产集群中),您可以激活 REPL 以通过命令行进行检查:

node inspect -p <node-pid>
如果您无法从浏览器访问服务器,但可以通过 SSH 连接到该服务器,则设置 SSH 端口转发 (ssh -nNTL 9229:localhost:9229 &lt;username&gt;@&lt;your_host&gt; -i &lt;keyfile&gt;.pem),几秒钟后您将在 chrome://inspect 下找到您的脚本。

在此版本之前,node-inspector 是用于调试 Node 进程的单独工具。但是,正如它自己的页面上所记录的那样,它大多已被弃用,因为现在捆绑的调试器得到积极维护并提供更高级的功能。有关此更改的更多信息,请参阅this thread。

【讨论】:

【参考方案5】:

要检查 nodejs 并对其进行调试,请使用此命令

forever -w -c 'node --inspect=IP:PORT' file.js

-c 如果用于自定义命令 如果文件被重新保存,则使用 -w 重新加载 您可以传递 ip 和端口以进行 外部检查 端口自定义是9229

【讨论】:

【参考方案6】:

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

kill -USR1 &lt;node-pid&gt;

然后

node debug -p &lt;node-pid&gt;

此版本节点的node inspect -p &lt;node-pid&gt; 命令失败。

【讨论】:

【参考方案7】:

Windows 用户

/edit 2022

这是我目前使用的,在 settings.json 中配置。这将提示您选择一个进程,它会自动向它发送调试信号。阅读下文以了解正在发生的事情。

  "launch": 
    "version": "0.2.0",
    "configurations": [
      
        "name": "Attach to Process (Pick)",
        "type": "node",
        "request": "attach",
        "processId": "$command:PickProcess",
        "port": 9229,
      
    ]
  ,

以前

如果您在不支持 POSIX 信号的 Windows 上,您可以从 另一个 cmd 使用此解决方法。

node -e "process._debugProcess(PID)"

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

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

    节点会监听9229端口by default,所以添加这个配置:

  "type": "node",
  "request": "attach",
  "name": "Attach to 9229",
  "port": 9229
,
    打开任务管理器并找到节点进程的 PID 我可以通过index.js 所在的"build" 文件夹来识别我的。 打开 另一个 cmdgit-bash 并运行此命令, 其中21392 是您的进程的PID。
node -e "process._debugProcess(21392)"
    你应该看到这个 从 VSCode 开始调试附加到 9229

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

【讨论】:

PS:这是在 WSL 模式下运行 VSCode 并连接到 linux 进程的方法。 code.visualstudio.com/docs/remote/wsl

以上是关于Node.js:如何附加到正在运行的进程并使用控制台调试服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 macOS Catalina 上使用 Instruments 附加进程?

如何将跟踪侦听器附加到正在运行的进程?

Node.js 调试 - 无法附加调试器子进程

如何找出 Node.js 进程的 % CPU 使用率?

如何杀死 node.js 上的打开进程?

如何在 gdb 中附加进程