如何调试通过命令行(cli)启动的节点应用程序(例如forever或supervisor)?

jco*_*lum 6 debugging node.js

我熟悉调试自己的节点应用程序(通常使用节点检查器)。今天想调试一下别人的程序。我正在尝试找出 的问题supervisor。因此,很自然地,我只是在命令调用中添加一个--debug(或debug-brk),但它会将其传递给它正在监督的代码。

我尝试debugger向主管的 js 文件添加行,但这不起作用(可能是因为当时没有附加调试器)。这里有一点竞争——我需要启动调试器,并将其在启动后但在处理来自命令行的参数之前将其附加到主管进程。

我真正想做的是supervisor在处理命令行参数之前停止并调试它。我怎样才能做到这一点?

Mat*_*ers 3

我在开发hexo博客时遇到了同样的问题。文档还不是很完整,所以我发现自己有时需要进行逆向工程。

基本思想是,在 Node.js 中,甚至您的 cli 应用程序也只是向操作系统命令行界面公开的普通节点应用程序。在 Unix 系统上,您使用这一行:

#!/usr/bin/env node
Run Code Online (Sandbox Code Playgroud)

允许环境执行脚本。

许多基于 cli 的节点应用程序尝试坚持要求您使用 -g 选项全局安装它们。

npm install -g node-inspector
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢尽可能多地控制我的开发环境,所以我更喜欢打破一些约定,将我的 node_modules 检查到源代码管理中,并通过删除 -g 在本地安装我可以安装的所有内容。

npm install node-inspector
Run Code Online (Sandbox Code Playgroud)

现在您不必执行此操作即可完成此操作,我只是描述此设置,因为它与您的问题相关。当我运行节点检查器时,我不能简单地使用:

node-inspector
Run Code Online (Sandbox Code Playgroud)

相反,我必须从我的项目中显式调用它。我通过执行 node_modules/.bin 文件夹中的符号链接来执行此操作:

node_modules/.bin/node-inspector
Run Code Online (Sandbox Code Playgroud)

现在我和你一样运行节点检查器。

接下来我需要做的就是在调试中启动 cli 进程并可选择将参数传递给它:

node --debug-brk node_modules/.bin/hexo generate
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里明确调用符号链接,而不是简单地调用:

node --debug-brk hexo generate
Run Code Online (Sandbox Code Playgroud)

如果我尝试上面的行,我会收到错误:“错误:找不到模块”。

我希望这有帮助。