美文网首页架构相关node
Nodejs 调试代码一

Nodejs 调试代码一

作者: dkvirus | 来源:发表于2019-10-15 21:03 被阅读0次

很长一段时间,调试 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

总结下目前了解的概念:

  • 安装的 Nodejs 软件包会包含很多子程序,比如 node 程序和调试器程序;
  • node 程序的特点是一下子将整个代码都跑完;
  • 调试器程序的特点是一行行执行代码;

调试器程序执行 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 中可以查看详细用法,这里简要列举下,就不一一介绍了。

  • restart 重启调试器
  • run 开始调试
  • kill 停止调试
  • s 单步跳进
  • o 单步跳出

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 代码的调试客户端。

  • 红字1:窗体标题表示这是 Nodejs 的调试客户端;
  • 红字2(Console):服务端打印的日志(console.log)也会在这里打印;
  • 红字3(Sources):服务端源代码,调试器并不会见所有服务端代码都推送到这里,只会推送用到的代码;
  • 红字4:源码文件,可以点击想要打断点的文件,在右侧打断点调试;
  • 红字5(Scope):变量的具体值在这里可以找到。
图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 的几个属性的含义:

  • type: "node",表示调试 Nodejs 代码,如果调试 PHP 代码,这里写成 type: php;
  • request: "launch",launch 表示由 调试器程序 执行 index.js,而不是由 node程序 执行 index.js,参考第一点调试器服务端。request 还有一个值 attach,下文再介绍;
  • name: "Launch Program",红字2左边有个下拉框,name 属性的值即为下拉框中的值;
  • program: "${workspaceFolder}/index.js",启动哪个文件,这里表示启动根目录下的 index.js 文件。
图8
  • 红字1(调试控制台):可以看到启动了调试器服务端,监听端口 26199,每次调试端口都不一样。Debugger attached 表示调试客户端也连接上服务端了;
  • 红字2:调试的相关操作都在这里;
  • 红字3:调试过程中变量和表达式的值可以在这里查看。

相关文章

  • vscode使用指南(代码调试)

    代码调试 vscode 原生支持nodejs的调试,其他语言需要安装拓展支持调试 代码调试界面 调试界面 调试配置...

  • Nodejs 调试代码一

    很长一段时间,调试 Nodejs 代码都是通过在代码里写 console.log() 进行的。在 infoq 上看...

  • 调试 nodejs 代码

    2016年,Node 决定将 Chrome 浏览器的”开发者工具”作为官方的调试工具,使得 Node 脚本也可以使...

  • Nodejs 调试代码二

    前文介绍了 Nodejs 调试代码的原理,本文讲解几个调试案例加深下理解,使用的是 Vscode 调试器客户端。 ...

  • mongo-express 远程代码执行漏洞分析

    搭建调试环境,调试 CVE-2019-10758 漏洞,学习nodejs 沙箱绕过,以及nodejs 远程调试。目...

  • vscode 配置 nodejs 调试环境

    vscode 配置 nodejs 调试环境 解决 1 侧边栏 调试按钮 添加 nodejs 配置 launch.j...

  • node.js 调试

    这两天折腾出了一些nodejs的调试方法,做个记录 断点调试 nodejs官方指定的调试工具是chrome,在使用...

  • vscode 单步调试 nodejs 代码

    纯nodejs的后台代码(即,不通过浏览器运行,仅跑在命令行上的nodejs程序),可以通过vscode的debu...

  • nodejs· 工具链 · webstorm调试代码

    一、增加webstorm的JavaScript Debug设置 1.输入Name名称 2.输入URL信息和项目的真...

  • nodemon

    为什么要使用nodemon 在编写调试Nodejs项目的时候,如果修改了项目的代码,则需要频繁的手动close掉,...

网友评论

    本文标题:Nodejs 调试代码一

    本文链接:https://www.haomeiwen.com/subject/kvdemctx.html