maple_uncle

调试器 | Node.js v7.1.0 文档

maple_uncle · 2016-11-29翻译 · 816阅读 原文链接

目录

调试器#

稳定性: 2 - 稳定

Node.js拥有一个功能全面的内置调试客户端,通过一个简单的基于TCP的协议来实现有效调试。要使用它,使用 debug 参数,并接着要调试的脚本的路径来启动 Node.js。命令后会有提示来表示调试器成功启动了。

$ node debug myscript.js
< debugger listening on port 5858
connecting... ok
break in /home/indutny/Code/git/indutny/myscript.js:1
  1 x = 5;
  2 setTimeout(() => {
  3   debugger;
debug>

Node.js 的调试器客户端的功能并不全,但是简单的步进控制和检查还是支持的。

插入 debugger; 语句到脚本的源代码中,将在代码中的那个位置启动断点:

// myscript.js
x = 5;
setTimeout(() => {
  debugger;
  console.log('world');
}, 1000);
console.log('hello');

一旦调试器运行,就会断点在第四行:

$ node debug myscript.js
< debugger listening on port 5858
connecting... ok
break in /home/indutny/Code/git/indutny/myscript.js:1
  1 x = 5;
  2 setTimeout(() => {
  3   debugger;
debug> cont
< hello
break in /home/indutny/Code/git/indutny/myscript.js:3
  1 x = 5;
  2 setTimeout(() => {
  3   debugger;
  4   console.log('world');
  5 }, 1000);
debug> next
break in /home/indutny/Code/git/indutny/myscript.js:4
  2 setTimeout(() => {
  3   debugger;
  4   console.log('world');
  5 }, 1000);
  6 console.log('hello');
debug> repl
Press Ctrl + C to leave debug repl
> x
5
> 2+2
4
debug> next
< world
break in /home/indutny/Code/git/indutny/myscript.js:5
  3   debugger;
  4   console.log('world');
  5 }, 1000);
  6 console.log('hello');
  7
debug> quit

repl 命令远程执行代码。 next 命令步进到下一行。输入 help 来查看其他可用的命令。

enter 键,不带有任何命令,将重复之前的调试器命令。

监听器#

可以在调试的时候监听表达式和变量的值。在每个断点处,监听列表里的每一个表达式都会在当前的上下文中执行,并立即显示在断点源代码之前。

输入 watch('my_wxpression'),开始监听一个表达式。这个 watchers 命令将打印出活跃的监视器。输入 unwatch('my_expression') 来移除一个监听。

命令参考#

步进#

  • cont, c - 继续执行

  • next, n - 下一步

  • step, s - 步入

  • out, o - 步出

  • pause - 暂停运行的代码 (类似 Developer Tools 中的暂停按钮)

断点#

  • setBreakpoint(), sb() -在当前行上设置断点

  • setBreakpoint(line), sb(line) -在指定行上设置断点

  • setBreakpoint('fn()'), sb(...) - 在函数体内的第一条语句上设置断点

  • setBreakpoint('script.js', 1), sb(...) - 在 script.js 的第一行上设置断点

  • clearBreakpoint('script.js', 1), cb(...) - 清除在 script.js 的第一行上的断点

也可以在一个还没有被加载的文件(模块)上设置断点:

$ node debug test/fixtures/break-in-module/main.js
< debugger listening on port 5858
connecting to port 5858... ok
break in test/fixtures/break-in-module/main.js:1
  1 var mod = require('./mod.js');
  2 mod.hello();
  3 mod.hello();
debug> setBreakpoint('mod.js', 23)
Warning: script 'mod.js' was not loaded yet.
  1 var mod = require('./mod.js');
  2 mod.hello();
  3 mod.hello();
debug> c
break in test/fixtures/break-in-module/mod.js:23
 21
 22 exports.hello = () => {
 23   return 'hello from module';
 24 };
 25
debug>

信息#

  • backtrace, bt - 打印当前执行帧的回溯

  • list(5) - 列出脚本源代码的5行上下文 ( 前后5行 )

  • watch(expr) - 添加表达式到监听列表

  • unwatch(expr) - 从监听列表里移除表达式

  • watchers - 列出所有的监视器和它们的值 (在每个断点出自动列出)

  • repl - 在调试脚本上下文中打开调试器的 repl

  • exec expr - 在调试脚本上下文中执行一条语句

执行控制#

  • run - 运行脚本 (开始调试的时候自动运行)

  • restart - 重启脚本

  • kill - 杀死脚本

其他#

  • scripts - 列出所有已经加载的脚本

  • version - 显示 V8 版本

高级用法#

启用和访问调试器有两个方法,带着 --debug 命令行标志来启动 Node.js, 或者通过使用 SIGUSR1 发信号给已存在的 Node.js 进程。

一旦一个进程已经以这种方式设置为调试模式,通过连接到运行中的进程的 pid 或者通过url指向监听调试器,来使用 Node.js 调试器检查这个进程。

  • node debug -p - 通过pid连接进程

  • node debug - 通过 URL 比如 localhost:5858 连接进程

Node.js的V8 Inspector集成#

注意: 这是一个试验性的功能

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

当启用一个 Node.js 程序的时候,传递 --inspect 标志可以启用 V8 Inspector。 也可以使用这个标志来提供一个自定义端口, 比如 --inspect=9222 将接受在 端口 9222 上的 DevTools 连接。

为了打断点到应用程序的第一行,除了 --inspect 之外还要提供 --debug-brk 标志

$ node --inspect index.js
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:[[email protected]](https://nodejs.org/cdn-cgi/l/email-protection)84980/inspector.html?experiments=true&v8only=true&ws=localhost:9229/node
相关文章