使用 mocha 的 --debug-brk 开关启用节点调试器的正确方法是啥?

Posted

技术标签:

【中文标题】使用 mocha 的 --debug-brk 开关启用节点调试器的正确方法是啥?【英文标题】:What's the right way to enable the node debugger with mocha's --debug-brk switch?使用 mocha 的 --debug-brk 开关启用节点调试器的正确方法是什么? 【发布时间】:2012-12-30 10:18:29 【问题描述】:

我在我的待测模块中有一些调试器语句,我想在设置--debug-brk 的情况下运行 mocha 并点击我的断点,以便我可以检查我的模块的状态。不幸的是,每当我使用此选项运行 mocha 时,下一行都会出现空白光标。我可以输入文本,但似乎没有任何东西在处理我的命令(它肯定不像节点调试器):

$ mocha --debug-brk tests.js -R spec
debugger listening on port 5858
[BLANK CURSOR]

我在启动 mocha 的方式上做错了吗?

【问题讨论】:

顺便说一句,--debug--debug-brk 之间存在差异。 --debug-brk 在启动时停止应用程序。 --debug 启动应用程序并在您的第一个断点处停止。 【参考方案1】:

使用最新版本的 nodejs (>=v6.3.0) 和 mocha (>=3.1.0),您可以使用 V8 inspector integration。

V8 Inspector 集成允许将 Chrome DevTools 附加到 Node.js 用于调试和分析的实例

用法

--inspect 激活 V8 检查器集成,--debug-brk 在开头添加断点。由于nodejs v7.6.0 和mocha v3.3.0,您可以使用--inspect-brk 简写为--inspect --debug-brk

$ mocha --debug-brk --inspect
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/remote/serve_file/@62cd277117e6f8ec53e31b1be58290a6f7ab42ef/inspector.html?experiments=true&v8only=true&ws=localhost:9229/node

使用 npm 脚本

如果你有一个使用 mocha 的 npm 测试脚本,你可以使用 选项分隔符结尾将选项从 npm 传递到你的 mocha 脚本--:

$ npm test -- --inspect --debug-brk

Chrome 提示

不要每次都复制粘贴网址,而是转到chrome://inspect,然后单击“远程目标”部分中的相应链接。

【讨论】:

2016年底最有用的答案 请注意,自 mocha v3.1.0 起支持此功能 感谢@busticated。我已将此添加到答案中,以及 v8 检查器集成所需的 nodejs 版本 @JørgenTvedt 我试了一下,但我无法让 --inspect--watch 一起工作。 npm test -- --inspect --debug-brk for nodev6.3+ 是绝对正确的,我开始怀疑它,但正如@busticated 指出的那样,您需要升级 mocha 版本。就我而言,我从3.0.2 转到3.5.0【参考方案2】:

要回答最初的问题,尽管我也建议您查看node-inspector:您可以使用带有debug 选项的mocha 内置于node 中的CLI 调试器,而不是--debug--debug-brk 标志。 (注意没有破折号。)

在您的示例中,它将是:

$ mocha 调试 tests.js -R 规范
侦听端口 5858 的调试器
连接...好的
中断 node_modules/mocha/bin/_mocha:7
  5 */
  6
  7 var program = require('commander')
  8、sprintf = require('util').format
  9、路径=需要('路径')
调试> [CURSOR]

同样,debug 如上所述,以粗体显示,没有破折号。 (=

相关:https://github.com/visionmedia/mocha/issues/247

【讨论】:

为什么在node_modules/mocha/bin/_mocha 中使用mocha debug 而不是在我放置debugger 语句的代码中中断?如何在代码中删除 debugger 语句的位置获得 REPL? 这行得通(我必须c 一次才能到达我的断点,但NBD。)但令人讨厌的是,当我坐在断点处时似乎无法检查任何东西。就像我可以拥有var foo='bar'; debugger;,如果我在提示符下输入foo,我会得到ReferenceError: foo is not defined debugger 命令行是 javascript REPL,但它不是在与您的代码相同的环境中实例化的 REPL。 (是的,我知道这简直令人困惑。)您必须记住在调试器的命令行中键入 repl 以获得您自己的代码的实际交互环境!【参考方案3】:

我可以使用node-inspector 来实现它。我像你在一个 shell 中显示的那样运行我的测试:

mocha --debug-brk mocha/test.js

然后在第二个 shell 中运行节点检查器:

node-inspector

在浏览器中调出 node-inspector 吐出的 URL 允许我使用 Web 检查器进行调试。

http://127.0.0.1:8080/debug?port=5858

【讨论】:

谢谢 - 希望只使用 Node 的本机交互式调试器,但似乎 node-inspector 是大多数人的方向。 我这样做了,调试器从 mocha 源代码的第一行开始。我找不到打开测试并在那里设置断点的方法。如何方便地进入我的测试代码? @MedicineMan 在代码中任何需要断点的地方添加行debugger;。更多信息在这里:nodejs.org/api/debugger.html【参考方案4】:

如果你安装了 node-inspector,你可以调试你的 Mocha 测试,而无需先实际运行 node-inspector。最简单的方法是

node-debug _mocha

这应该开始在 chrome 中调试节点测试(也适用于 Safari)

我看到测试不起作用的一个原因是有时您尝试尝试http://localhost:8080/debug?port=5858 或http://127.0.0.1:8080/debug?port=5858

【讨论】:

这对大多数人来说是最简单的答案。 如果你也在使用 Babel,the babel-node-debug package/command 可能会有所帮助。 您可能需要运行“node-debug _mocha --no-timeouts”以确保在测试中断时不会发生超时。【参考方案5】:

使用标志 --inspect-brk 运行 mocha,然后在页面 chrome://inspect 中单击 chrome 中的“为节点打开专用 DevTools”。在专用的 DevTools 窗口中添加连接 localhost:9229 以自动连接。

还要在要调试的文件中添加debugger 语句。

(这是使用截至 2017 年 10 月的最新版本的 node 和 chrome)

【讨论】:

以上是关于使用 mocha 的 --debug-brk 开关启用节点调试器的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

以“node --debug-brk”启动时,节点不会在第一行中断

使用mocha测试

使用 mocha 的内置承诺支持测试失败的承诺 [重复]

使用 mocha 运行节点检查器

如何使用 Mocha 运行单个测试?

接口测试自动化测试,我推荐使用Mocha