架构相关node

Nodejs 调试代码一

2019-10-15  本文已影响0人  dkvirus

很长一段时间,调试 Nodejs 代码都是通过在代码里写 console.log() 进行的。在 infoq 上看到一篇文章,是说十倍效率工程师有哪些特质,其中一点就是擅长调试与测试。这给了我很大动力去弄明白这些之前模糊的概念。

调试服务端

创建 index.js,在服务端想要运行该文件,需要在终端输入 $ node index.js。
node 程序 会读取 index.js 源码,如果 index.js 中引用了其它 js 文件,依次读取源码,最后执行。

(安装的 Nodejs 软件里包含很多个子程序,node 是其中一个程序,用于执行 js 文件)

图1

在调试 Nodejs 代码时,我们希望代码能一行行执行,而不是像 node 程序那样将整个源码都跑完,这时候需要用 Nodejs 内置的 调试器程序 去运行 index.js。

图2

总结下目前了解的概念:

调试器程序执行 js 文件后,会启一个 websocket 的服务,调试器程序作为服务端,只提供与调试相关的底层功能,这样做的好处是开发人员可以自由选择调试客户端:你可以选择在终端中调试,也可以选择在谷歌浏览器中调试,甚至可以在 Vscode 中调试,只要你的调试客户端连接到调试服务端即可。

图3

创建 index.js 文件作为调试演示代码,内容如下:

const add = require('./add')

const a = 1
const b = 2

debugger
console.log(add(a, b))

下面分别介绍用不同的调试器客户端进行调试。

终端中调试

Nodejs 也自带了一个调试器客户端,在终端中进行调试。

$ node inspect index.js

node inspect 表示启动调试器服务端,并在终端打开调试器客户端。

$  node inspect index.js
< Debugger listening on ws://127.0.0.1:9229/858f5307-2af1-472a-bd73-a2fbe5b8578b
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in index.js:1
> 1 const add = require('./add')
  2
  3 const a = 1
debug>

第一行 Debugger listening on ws://127.0.0.1:9229/,表示调试服务端已经启动了,并且监听着 9229 这个端口。
第三行 Debugger attached,表示调试器客户端已经连接到调试器服务端了。

输入 help 可以查看调试器有哪些用法。

debug> help
run, restart, r       Run the application or reconnect
kill                  Kill a running application or disconnect

cont, c               Resume execution
next, n               Continue to next line in current file
step, s               Step into, potentially entering a function
out, o                Step out, leaving the current function
backtrace, bt         Print the current backtrace
list                  Print the source around the current line where execution
                      is currently paused

setBreakpoint, sb     Set a breakpoint
clearBreakpoint, cb   Clear a breakpoint

......

debug>

输入 n,执行下一行代码。

debug> n
break in index.js:3
  1 const add = require('./add')
  2
> 3 const a = 1
  4 const b = 2
  5

输入 c,跳转到下一个断点处。

debug> c
break in index.js:6
  4 const b = 2
  5
> 6 debugger
  7 console.log(add(a, b))
  8

还有一些常用的命令,在 help 中可以查看详细用法,这里简要列举下,就不一一介绍了。

Chrome Devtool 中调试

谷歌浏览器的开发者工具也可以作为调试客户端调试 Nodejs 代码,只要连接到调试器服务端即可。

$ node --inspect-brk index.js
Debugger listening on ws://127.0.0.1:9229/7513b18d-7a62-44c7-a963-84a90eb826a9
For help, see: https://nodejs.org/en/docs/inspector

node --inspect-brk 表示只启动了调试器服务端,监听端口 9229。此时还没有任何调试器客户端连接哦~~

打开谷歌浏览器的开发者工具,左上角可以看到 nodejs 的 logo,点它。

图4

点击之后弹出的新窗口就是Chrome Devtools 中调试 Nodejs 代码的调试客户端。

图5

此时回到终端,可以看到多打印一条消息,最后一行表示调试器客户端连接到调试器服务端了。

$  node --inspect-brk index.js
Debugger listening on ws://127.0.0.1:9229/0a233e15-573b-40a0-956f-76c8e074b5a1
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.      <=============

为什么打开谷歌浏览器的 Chrome Devtools,会自动连接调试器服务端呢?

调试器服务端默认启动端口是 9229,而 Chrome Devtools 默认也会连接 9229 端口。
重新启动调试器服务端,并且指定一个不一样的端口,此时调试器服务端端口变成了 9222。

$  node --inspect-brk=9222 index.js 
Debugger listening on ws://127.0.0.1:9222/967b99ee-b726-4c2b-ba08-dec16f1a531a
For help, see: https://nodejs.org/en/docs/inspector

再次打开浏览器,可以看到 Nodejs 的 logo 变成灰色了,也不会主动连接到调试器服务端了。此时需要我们手动设置下 Chrome Devtools 去连接哪个端口。

点击 Nodejs 的 logo 图像,在弹出的窗体中选择 Connection(红字1),点击 Add connection(红字2),在上方的输入框输入要监听的端口号保存即可。

图6

Vscode 中调试

大多数开发者调试代码都会选择 IDE(开发工具) 进行调试,这里以 Vscode 为例进行说明。

用 Vscode 打开 index.js 所在的目录。

图7

这里主要介绍下红字 3 的几个属性的含义:

图8
上一篇 下一篇

猜你喜欢

热点阅读