如何使用断点和其他工具来调试Node.js应用程序?

44

我安装了node-inspector,结果发现它不支持断点 :| 考虑到大部分node代码是异步的,你根本无法一步一步地跟踪它,这个东西有什么用呢?

我肯定是错过了什么关键点...

有没有办法通过断点等方式调试node代码?


可能是重复问题:https://dev59.com/NXI-5IYBdhLWcg3wVWti - beny23
我从那边来 - 在node-inspector中断点不起作用,并且没有人回答我的问题。有吗? - jayarjo
1
它确实支持断点。只是在刷新检查器页面时不会“记住”它们。 - JP Richardson
可能是如何调试Node.js应用程序?的重复问题。 - Ciro Santilli OurBigBook.com
调试Node.js应用程序现在变得更加出色。因此,这个问题和答案可能已经过时了。 - jayarjo
5个回答

26

是的,我已成功使用了node-inspector。如果您想要永久断点,请在代码中插入debugger;即可。请参见http://nodejs.org/api/debugger.html

使用node --inspect-brk script.js (以前是node --debug-brk script.js) 使node等待调试器附加也很有帮助。


1
带有调试器;它崩溃了:node(31848,0x7fff70e12cc0)malloc:***错误对象0x10010f690:释放的指针未被分配 ***设置断点在malloc_error_break以进行调试 中止陷阱 - jayarjo
我从未见过那个错误,很抱歉。你的应用程序进程崩溃了还是node-inspector出了问题?你正在运行哪些版本?你是否使用了任何可能导致崩溃的本地节点模块? - rdrey
4
针对 Node.js 的后续版本,--debug-brk 已被废弃,请使用 --inspect-brk 替代。 - Matt

20

(适用于Node 8及更高版本)

Node.js内置了调试器。通常情况下,您可以通过以下两种方式打开调试器:

  1. 使用--inspect--inspect-brk开关启动您的Node.js应用程序或脚本。例如:

    $ node.js --inspect index.js

(注意: --inspect-brk会在用户代码启动之前中断执行)

  1. 如果由于某些原因您无法使用--inspect开关启动您的Node.js应用程序或脚本,则仍然可以通过向其发送SIGUSR1信号(在Linux和OS X上)来指示Node.js进程开始侦听调试消息。对于Node 8及更高版本,它将激活Inspector API,与--inspect开关相同

    $ kill -sigusr1 23485

(注意: 您需要将23485替换为您自己的Node.js进程ID)

打开调试器后,您可以打开Google Chrome浏览器,并在地址栏中输入chrome://inspect

然后,您应该看到“远程目标”下列出的一个条目。继续并单击“检查”。

现在,您可以设置断点并开始调试代码。

参考:

  1. https://nodejs.org/zh-cn/docs/guides/debugging-getting-started/ | Node.js 调试指南
  2. 相关问题请参考 stackoverflow: Chrome Devtools 专门的 Node.js 检查器不会在断点处停止

1
要在终端中执行所有操作,您需要使用node inspect,如https://dev59.com/4Wgu5IYBdhLWcg3wDS-j#55429798所述,从版本`v10.15.1`开始。 - Ciro Santilli OurBigBook.com
我制作了一个视频,展示了使用Node.js(如果需要还包括TypeScript)的检查设置:https://www.youtube.com/watch?v=bV-DHjmwuZ0 - Benny Code

10
为了调试Node.js应用程序,可以使用内置的调试方法:
(1)在要插入断点的位置插入debugger;语句
(2)使用命令$ node inspect <file name>运行文件
(3)使用一个键,例如c,继续到下一个断点
您甚至可以通过键入repl在那个断点调试与变量相关联的值。有关更多信息,请查看官方指南。

测试通过 v10.15.1 版本。 - Ciro Santilli OurBigBook.com
如果您不想修改您的代码,您可以使用函数 setBreakpointsb 来设置断点,例如 setBreakpoint('script.js', 1) (https://nodejs.org/api/debugger.html)。 - Jean Paul

2
你尝试使用过nodemon库吗?你可以在这里找到
为了开发目的,你可以使用nodemon来启动应用。我有这个脚本: "dev": "nodemon --inspect src/index.js" 它会在代码中达到debugger语句时中断。要打开控制台以查看服务器代码,请在Chrome中打开控制台并单击nodejs图标:enter image description here 它还可以帮助您在保存服务器上的任何文件时刷新服务器。
如果有问题,请告诉我!

1

这里稍作解释:

在想要设置断点的位置设置调试器,然后使用node debug script.js/index.js运行代码。

当调试器停在您的断点处时,您需要使用repl来检查变量。


我想在任何异常发生的地方设置断点(假设我事先不知道会发生在哪里)。我该怎么做? - Michael
你可以使用运行时观察器,而不是使用 REPL 命令。只需要输入例如 watch('count') 的观察器 API,当调试器停在该函数时,观察器 API 将打印该值。 - Tarandeep Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接