如何使用node inspector正确地调试node.js?

41

我有一个用node.js构建的应用程序,我使用node inspector进行调试。

但是这很困难,因为:

  1. 重启服务器后,我的断点永远不会保存
  2. 我无法在尚未加载的文件上设置断点;所以我必须从第一个脚本步进到我想要的那个脚本,这真的很痛苦!

如何使用node inspector真正地调试node.js?

关于如何使用node.js的视频非常误导,因为一切都在一个模块中……
http://www.youtube.com/watch?v=AOnK3NVnxL8

或者,这些脚本已经加载在第一个脚本中
http://www.youtube.com/watch?v=HJOH0-g8f6E&feature=mfu_in_order&list=UL

编辑:

没有人能回答这个问题吗?:s


1
1和2都是关于node-inspector的有效投诉。还有其他调试方式,如插件到Eclipse或使用node --debug加上在代码中放置断点的方式来调试。 - Ryan Olds
我曾尝试使用Eclipse,但经过一周多的尝试后放弃了。现在我遇到了Sublime Text 2,对于我所需的功能来说,它确实比Eclipse好得多。我将搜索是否存在适用于Sublime Text的调试器。 - Totty.js
@Totty:你在 Sublime 中找到任何调试器了吗? - SharpCoder
不,我仍然使用Node Inspector。它非常慢,所以我尽可能使用console.log。这真的是Node.js中的一个痛点。 - Totty.js
可能是如何调试Node.js应用程序?的重复问题。 - Ciro Santilli OurBigBook.com
7个回答

26
在JavaScript中,您可以使用debugger;语句设置断点。然而,只有在实际附加了调试器时,它们才会暂停节点。因此,请使用以下方式启动节点脚本:
node --debug-brk myfile.js

然后启动 node-inspector 并按下播放按钮继续执行到下一个断点,这时它就会触发你的 debugger; 断点(至少对我来说是这样的)。

(如评论所述:在最近版本的 Node 中,您不再需要单独安装 node-inspector。如果您使用 node --debug-brk --inspect myfile.js 启动 Node,则会获得一个 URL,在您的浏览器中启动调试器)。

重新启动后仍需点击一次,但至少您的断点已保存。

如果您的断点不是自动触发的,而是在某些用户操作后才被触发,那么您当然不需要 --debug-brk 了。


我成功地使用了这些步骤使断点起作用。 - Aebsubis
1
我使用 $ node --inspect --debug-brk myfile.js - Troy
+1 给 @troyd 的回答;使用 --inspect --debug-brk 标志组合应该会打印出一个链接,你可以将其粘贴到浏览器中查看开发工具。 - Rafe Goldberg
从v8.9.0开始已被弃用。 - user124384

6
客户端断点的问题在于,当文件更改时很难跟踪断点位置。与编辑器不同,它无法跟踪行的变化等。

@RyanOlds建议使用调试器语句也是一个好主意,但您必须确保调试器在语句评估之前连接,否则会被忽略。以--debug-brk开头是一种强制方法,因为执行被暂停在第一行,允许您附加调试器,然后继续执行。

您可以尝试使用node的内部调试器进行调试。

编辑:根据v8 DebuggerProtocol的说法,可以在尚未加载的脚本上设置断点,并且您可以按函数、脚本等设置断点。因此,对于node-inspector来说,在会话或其他情况下跟踪您的断点应该是可能的。尽管它目前没有这样做。

也许如果v8允许某段代码触发断点,类似于node的debugger? 编辑:实际上是可以的,您可以通过抛出任何旧异常(已捕获或未捕获)来触发断点。

内部调试器的方便链接-我一直在想我要怎么做。 - iancrowther
2
实际上,我曾经使用调试器语句,并且v8按预期在它们上面中断。 - Paul
1
同事刚刚在这个答案中看到了我的名字。Node.js是否可能在连接node-inspector之前就已经通过了debugger;?我非常确定除非连接了调试客户端,否则V8会忽略断点和debugger;。您可以尝试使用--debug-brk,它告诉V8立即中断,从而有时间附加node-inspector。 - Ryan Olds
@RyanOlds 你说得对,显然在调试器连接之前就已经过了“debugger;”语句。我会更新我的答案。 - mtsr

5

1

建议尝试使用IntelliJ WebStorm - 它有免费试用版,而且许可证价格并不过高。它可以让你在启动自己的内部节点进程之前,在所有文件中保存断点,并在进程重新启动时记住它们。

我同意 - node-inspector看起来很棒,但是除非您的应用程序在顶层脚本中加载源文件后立即设置断点的明确位置,否则它就没什么用了。您可以按照这种方式构建自己的代码,但是对于其他有用的库,您可能就没有那么幸运了。此外...为什么调试工具要决定您的项目结构!

忘记断点非常不方便...我的大多数调试运行需要多次步骤,因为在其他人的代码中,很容易跨越您想要的位置。


有一个 node-inspector 的优点。它可以浏览 Closure 包含的文件(goog.provide/goog.require),而 WebStorm 的调试器则不能。 顺便说一句,现在 node-inspector 可以保存断点,详见我的回答。 - alehro

1

0

现在已经内置了包括保存断点。我刚刚在node 7.3.0中测试过。

node --inspect --debug-brk app.js

这将打印出以下URL:

要开始调试,请在Chrome中打开以下URL: chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/c3d5d93e-9d27-41b9-a4da-607e43c9d4f8

将其放入Chrome中,然后您就可以开始了。

如果您想跳过复制/粘贴URL,请执行以下操作:

npm install -g inspect-process inspect --debug-brk app.js

不幸的是,inspect-process方法无法保留断点 :-(。

这是我制作的视频:https://youtu.be/rtZKUnks6jI


同时将其放入文章格式中,尽管上面的信息已经很好地说明了它!https://medium.com/@theroccob/debug-node-js-with-chrome-devtools-aca7cf83af6b - RoccoB

0
值得一提的是,VS Code拥有一个出色的Node调试器。

https://code.visualstudio.com/

适用于Mac、Linux和Windows。

它可以在运行时设置断点(无需编写debugger;语句),支持变量监视,并且甚至有一个调用堆栈窗口(非常好用)。

一切都如此自动化,现在我在使用nodejs时更喜欢它而不是sublime text(我真的很喜欢sublime)。


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