如何调试通过命令行 (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) 启动的节点应用程序,例如永远或主管?的主要内容,如果未能解决你的问题,请参考以下文章