写点什么

nodejs 的调试 debug

发布于: 2021 年 01 月 27 日
nodejs的调试debug

简介

对于开发者来说,在开发应用程序的过程中,往往为了开发方便和解决 bug 需要借助于编程语言的调试功能。一般来说我们需要借助于强大 IDE 的调试功能来完成这项工作。nodejs 也不例外。


今天我们来详细介绍一下如何调试 nodejs 程序。


开启 nodejs 的调试

还记得之前我们讲到的 koa 程序吗?本文将会以一个简单的 koa 服务端程序为例,来展开 nodejs 的调试。


先看下一个简单的 koa 服务 app.js:


const Koa = require('koa');const app = module.exports = new Koa();
app.use(async function(ctx) { ctx.body = 'Hello World';});
if (!module.parent) app.listen(3000);

复制代码

上面的程序开启了 3000 端口,建立了一个 http 服务。每次请求的时候,都会返回 hello World,非常的简单。


要想运行上面的程序,我们需要执行 node app.js。 这会执行 app.js 但是并不会开启调试功能。


怎么进行调试呢?


我们需要加上 –inspect 参数:


node --inspect app.js
复制代码

上面的代码将会开启 nodejs 的调试功能。


我们看下输出结果:


Debugger listening on ws://127.0.0.1:9229/88c23ae3-9081-41cd-98b0-d0f7ebceab5aFor help, see: https://nodejs.org/en/docs/inspector
复制代码

结果告诉了我们两件事情,第一件事情就是 debugger 监听的端口。默认情况下将会开启 127.0.0.1 的 9229 端口。并且分配了一个唯一的 UUID 以供区分。


第二件事情就是告诉我们 nodejs 使用的调试器是 Inspector。


Inspector 是 nodejs 8 之后引入的,如果是在 nodejs 7 之前,那么使用的是 legacy debugger。


调试的安全性

如果 debugger 连接到了 nodejs 运行环境中,如果有恶意攻击者的话,这个恶意攻击者可以在 nodejs 环境中运行任意代码。这会给我们的程序带来很大的安全隐患。


所以我们一定要注意调试的安全性。一般来说,我们不建议进行远程调试。


默认情况下 –inspect 绑定的是 127.0.0.1,这样就只允许本地程序访问。并且任何本地运行的程序都有权限进行该程序的调试。


如果我们真的想将 debug 程序暴露给外部程序的话,那么可以指明本机的外网 IP 地址或者 0.0.0.0(表示任何地址,无限制),这样远程机子就可以进行远程调试了。


如果我们想进行安全的 remote debug 该怎么处理呢?


首先,我们要开启本地的 debug:


node --inspect app.js
复制代码

然后我们可以搭建一个 ssh 隧道,将本地的 9221 端口映射到远程服务器的 9229 端口:


ssh -L 9221:localhost:9229 user@remote.example.com
复制代码

这样我们就可以通过连接本地的 9221 端口,进行远程调试了。


使用 WebStorm 进行 nodejs 调试

JetBrains 出品的 WebStorm 可谓是开发 nodejs 的利器,WebStorm 自带有 debug 选项,如果开启该选项,则会在后台开启 –inspect:



使用 WebStorm 来进行调试和使用 IDEA 来进行 java 程序调试类似,这里就不多介绍了。


使用 Chrome devTools 进行调试

使用 Chrome devTools 进行调试的前提是我们已经开启了 –inspect 模式。


在 chrome 中输入 chrome://inspect:



我们可看到 chrome inspect 的界面,如果你本地已经有开启 inspect 的 nodejs 程序的话,在 Remote Target 中就可以直接看到。


选中你要调试的 target,点击 inspect,即可开启 Chrome devTools 调试工具:



你可以对程序进行 profile,也可以进行调试。


这里我们关注的是调试,所以转到 source 一栏,添加你要调试的程序的源代码:



加入断点即可开始调试了。和在 chrome 中调试 web 端的 js 是一样的。


使用 node-inspect 来进行调试

其实 nodejs 有一个自带的调试工具,叫做 node-inspect,这是一个 cli 的调试工具。我们看一下怎么使用。


我们直接使用:


node inspect app.js
< Debugger listening on ws://127.0.0.1:9229/f1c64736-47a1-42c9-9e9e-f2665073d3eb< For help, see: https://nodejs.org/en/docs/inspector< Debugger attached.Break on start in app.js:1> 1 const Koa = require('koa'); 2 const app = module.exports = new Koa(); 3 debug>

复制代码

node inspect 做了两件事情,第一件事情就是生成子程序去运行 node –inspect app.js,第二件事情就是在主程序中运行 CLI 调试窗口。


这个 CLI 调试程序为我们提供了一些非常有用的命令:


  1. Stepping

  • cont, c: 继续执行

  • next, n: Step 到下一步

  • step, s: Step in

  • out, o: Step out

  • pause: 暂停运行的代码

  1. Breakpoints

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

  • setBreakpoint(line), sb(line): 在指定的行设置断点

  • setBreakpoint(‘fn()’), sb(…): 在指定的 function 中设置断点

  • setBreakpoint(‘script.js’, 1), sb(…): 在指定的脚本文件中设置断点

  • clearBreakpoint(‘script.js’, 1), cb(…): 从文件中清除断点

  1. Information

  • backtrace, bt: 打印当前 execution frame 的 backtrace 信息

  • list(5): 列出源代码前后的 5 行

  • watch(expr): 添加监听表达式

  • unwatch(expr): 删除监听表达式

  • watchers: 列出所有的 watchers

  • repl: 打开 repl 表达式

  • exec expr: 执行表达式

通过上面的命令,我们可以在 CLI 中进行比较复杂的调试活动。


其他的 debug 客户端

除了上面我们讲到的几个之外,我们还可以使用 vscode,Visual Studio ,Eclipse IDE 等来进行 nodejs 的调试,这里就不一一详细介绍了。


感兴趣的朋友可以自行探索。


本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/nodejs-debug/

本文来源:flydean 的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!


发布于: 2021 年 01 月 27 日阅读数: 16
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
nodejs的调试debug