如何调试通过命令行 (cli) 启动的节点应用程序,例如永远或主管?

Posted

技术标签:

【中文标题】如何调试通过命令行 (cli) 启动的节点应用程序,例如永远或主管?【英文标题】:how can I debug a node app that is started via the command line (cli) like forever or supervisor? 【发布时间】:2015-09-05 17:17:48 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

基本思想是,在 Node.js 中,即使您的 cli 应用程序也只是普通的节点应用程序,您将它们暴露给操作系统命令行界面。在 Unix 系统上,您正在使用这一行:

#!/usr/bin/env node

允许环境执行脚本。

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

npm install -g node-inspector

我个人更喜欢尽可能多地控制我的开发环境,所以我更喜欢打破一些约定,将我的 node_modules 签入源代码控制,同时通过删除 -g 在本地安装我可以安装的所有东西。

npm install node-inspector

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

node-inspector

相反,我必须在我的项目中显式调用它。我通过在我的 node_modules/.bin 文件夹中执行符号链接来做到这一点:

node_modules/.bin/node-inspector

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

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

node --debug-brk node_modules/.bin/hexo generate

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

node --debug-brk hexo generate

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

我希望这会有所帮助。

【讨论】:

我试过这个,debugger;./node_modules/hexo/lib/hexo/index.js:Hexo(),但我得到的只是标准输出上的“调试器在端口 5858 上侦听”,然后挂起。不进入交互式调试器,不生成。 我不确定我是否关注你...我只在终端中尝试过上面详述的命令。如果您使用带有内置调试器的 IDE 或其他我没有尝试过的东西......我也开始执行,就像常规命令只会更明确地说明 .bin 位置的路径。 不使用 IDE。我试图找出一个 hexo 插件中的错误,所以我的策略是在上面提到的文件中放置一个debugger;。当我运行/usr/local/bin/node --debug-brk node_modules/.bin/hexo generate 时,它只是挂起,不管有没有debugger;。知道为什么吗? 上次我这样做是在不久前,它有时会在实际连接到调试器之前挂起几分钟。你等了多久才宣布挂起?所有其他方法都失败了,您可以求助于穴居人调试打印,至少在您找出问题所在之前。我知道这不是很有帮助,但我确实记得它有点偶然。 @KFunk 你最终弄清楚如何调试你的 Hexo 插件了吗?我很想知道它是如何完成的。 B

以上是关于如何调试通过命令行 (cli) 启动的节点应用程序,例如永远或主管?的主要内容,如果未能解决你的问题,请参考以下文章

微服务Kong——CLI参考

Golang中基础的命令行模块urfave/cli

如何调试 Ngrok 不通过节点模块启动?

ganache-cli命令行参数说明

dockerphp-cli如何使用

以太坊之ganache命令行参数的详解