Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >让你 nodejs 水平暴增的 debugger 技巧

让你 nodejs 水平暴增的 debugger 技巧

作者头像
刘小夕
发布于 2021-07-19 09:10:22
发布于 2021-07-19 09:10:22
1.1K00
代码可运行
举报
文章被收录于专栏:前端宇宙前端宇宙
运行总次数:0
代码可运行

学习 nodejs 最重要的是什么?可能每个人都有自己的答案。

我觉得学习 nodejs 除了要掌握基础的 api、常用的一些包外,最重要的能力是学会使用 debugger。因为当流程复杂的时候,断点调试能够帮你更好的理清逻辑,有 bug 的时候也能更快的定位问题。

狼叔说过,是否会使用 debugger 是区分一个程序员 nodejs 水平的重要标志。

本文分享一下 debugger 的原理和 vscode debugger 的使用技巧。

debugger 原理

运行 nodejs 代码的时候,如果带上了 --inspect(可以打断点) 或者 --inspect-brk(可以打断点,并在首行断住) 的参数,那么就会以 debugger 的模式启动:

可以看到,node 启动了一个 web socket 的 server,地址是:ws://127.0.0.1:9229/78637688-e8e0-4582-80cc-47655f4bff66

为什么 debugger 要启动一个 websocket server 呢?

debugger 的含义就是要在某个地方断住,可以单步运行、查看环境中的变量。那么怎么设置断点、怎么把当前上下文的变量暴露出去呢,就是通过启动一个 websocket server,这时候只要启动一个 websocket client 连接上这个 server 就可以调试 nodejs 代码了。

v8 debug protocol

连上之后呢,debugger server 和 debugger client 怎么交流?这就涉及到了 v8 debug protocol。

通过两边都能识别的格式来交流,比如:

在 test.js 的 100 行 设置断点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "seq":118,
    "type":"request",
    "command":"setbreakpoint",
    "arguments":{
        "type":"script",
        "target":"test.js",
        "line":100
    }
}

然后查看当前作用域的变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "seq":117,
    "type":"request",
    "command":"scope"
}

执行一个表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "seq":118,
    "type":"request",
    "command":"evaluate",
    "arguments":{
        "expression":"a()"
    }
}

之后继续运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "seq":117,
    "type":"request",
    "command":"continue"
}

通过这种方式,client 就可以告诉 debugger server 如何执行代码。

debugger client

debugger client 一般都是有 ui 的(当然,在命令行里面通过命令来调试也可以,但一般不这么做)。常见的 js 的 debugger client 有 chrome devtools 和 vscode debugger 等。

我们写一个简单的 js 脚本,通过 node --inspect-brk 跑起来:

可以看到它启动在了 9229 端口,

然后,我们分别通过两种 client 连上它。

chrome devtools

在 chrome 地址栏输入 chrome://inspect,然后点击 configure 来配置目标端口:

把刚才的端口 9229 填上去:

然后就可以看到 chrome 扫描到了这个 target,点击 inspect 就可以连上这个 debugger server。

之后就可以设置断点、单步执行、执行表达式、查看作用域变量等,这些功能都是通过 v8 debug protocol 来实现的。

vscode debugger

在 vscode 里面写代码,在 chrome devtools 里调试比较麻烦,vscode 也实现了 debugger 的支持,可以直接用 vscode 来调试。

使用vscode 调试能力的方式是修改项目根目录下的 .vscode/launch.json 配置。

attach

点击右下角的按钮来添加一个配置项。这里选择 nodejs 的 attach:

因为已经通过 node --inspect-brk 启动了 websocket 的 debugger server,那么只需要启动 websocket client,然后 attach 上 9229 端口就行。

点击左侧的按钮,就可以连上 debugger server 开始调试:

launch

这样先通过 node --inspect-brk 启动 debugger server,然后再添加 vscode debug 配置来连接上太麻烦了,能不能把这两步合并呢?

当然可以,只要添加一个 launch 的配置:

这里的 type 是 launch,就是启动 debgger server 并且启动一个 debugger client 连接上该 server。运行的程序是根目录下的 index2.js,还可以设置 stopOnEntry 来在首行断住。

点击调试,就可以看到能够成功的调试该 js 文件。

vscode 会启动 debugger server,然后启动 debugger client 自动连接上该 server,这些都不需要我们去关心。

这样我们就可以成功的使用 vscode debugger 来调试 nodejs 代码。

vscode debugger 进阶

debugger client 中我们最常用的还是 vscode,这里着重讲一下 vscode debugger 的各种场景下的配置。

sourcemap

如果调试 ts 代码,肯定不能调试编译后的代码,要能够映射回源码,这个是 sourcemap 做的事情。调试工具都支持 sourcemap,比如 chrome devtools 和 vscode debugger,都支持文件末尾的 sourcemap url 的解析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//# sourceMappingURL=index.js.map

这样当调试 index.js的时候,如果它是 ts 编译的出来的,就会自动找到对应的 ts。

当然,如果调试配置里面直接指定了 ts,那么要能够调试需要再配置 outFiles,告诉 vscode 去哪里找 sourcemap。

image.png

这样,在 ts 源码中打的断点和在编译出的 js 打的断点都能生效。

多进程调试

当代码中有子进程的时候,就有了第二条控制流,需要再启动一个 debugger。

比如 vscode,它是基于 electron,需要启动一个主进程,一些渲染进程。主进程是通过 launch 启动的,而渲染进程则是后来 attach 的。

主进程启动的时候,通过 --remote-debugging-port 来指定子进程自动的时候的 debugger server 的端口。

outFiles 来指定 sourcemap 的位置,这样才可以直接调试 ts 源码。runtimeExecutable 是用 vscode 的运行时替代掉了 nodejs(一般不需要设置)。

然后渲染进程是后面启动的,我们通过参数配置了会启动在 9222 端口,那么只要 attach 到那个端口就可以调试该进程了。

vscode 支持多 target 调试,也就是可以在 vscode 里面同时启动 多个 debugger。可以切换不同的 debugger 来调试不同的进程。

总结

debugger 的使用是一项很重要的能力,对于 nodejs 水平的提升很有帮助。

nodejs debugger 的原理是 js 引擎会启动 debugger server(websocket),等待客户端连接,我们可以通过各种 debugger client 连上来进行调试,比如 chrome devtools、vscode debugger。

调试 nodejs 代码更多还是使用 vscode debugger(当然有的时候也会使用 chrome devtools 调试,基于 chrome devtools 的 memory 来进行内存分析,定位内存泄漏问题的时候很有帮助)。

vscode debugger 的使用主要是在 .vscode/launch.json 里面添加调试配置。

调试配置分为 launch 和 attach 两种:

  • launch 会启动 debugger server 并用 debugger client 连接上
  • attach 只是启动 debugger client 连接上已有的 debugger server,所以要指定端口

具体的配置项常用的有:

  • outFiles 指定 sourcemap 的位置,用来调试 ts 源码等需要编译的代码
  • stopOnEntry 在首行停住
  • args 来指定一些命令行参数
  • runtimeExecutable 当运行时不是 nodejs 的时候需要指定,比如 vscode 或者其他的一些运行时

基于这些配置我们就可以调试各种场景下的 nodejs 代码,需要编译的,或者多个进程的。

不夸张地说,如果你熟悉了 debugger 的使用,理解各种 nodejs 代码都会简单很多。希望这篇文章能够帮助大家了解 debugger 的原理,并且能够使用 chrome devtools 或者 vscode debugger 来调试 nodejs 代码。知道有 sourcemap 以及多进程的情况下都怎么调试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Node.js 调试一路走来经历了什么
做为前端开发,想必大家都写过 Node.js 的代码,也大概率用 debugger 断点调试过。
神说要有光zxg
2022/06/06
6460
Node.js 调试一路走来经历了什么
vscode调试Node.js指南
前言:调试代码不管对于开发还是学习源码都是非常重要的技能,本文简单介绍vscode调试Node.js相关代码的调试技巧。
theanarkh
2021/09/16
5.7K0
vscode调试Node.js指南
简化的 eggjs debug
虽然有时console.log也会用,但是我可能会使用一些更好的日志工具,以前的log4,现在的eggjs提供的logger,良好的日志分级,有助于提高查询问题的效率,如今,就直接使用eggjs提供的内置logger对象了。今天,我们主要是来说一说Debug的事情。调试几乎是每一个程序员必备的技能,而选择合适的调试就能极大的提高工作效率,由于Node.js@6.3版本之后已经内置了调试器,因此也可以和Chrome DevTools结合起来使用,于是node-inspector就这样退出了历史舞台。
icepy
2019/06/24
9960
简化的 eggjs debug
使用 Chrome Devtools 调试您的 Node.js 程序
俗话说:“工欲善其事,必先利其器”,调试是每一个开发人员都要遇到的问题,选择一个合适的调试工具也尤为重要。 在 Node.js 开发过程中除了万能的 console.log 之外,本节介绍一个 Node.js 与 Chrome Devtools 结合的调试工具,以后你可以选择使用浏览器来调试 Node.js 应用程序了。
五月君
2020/12/30
3.3K0
使用 Chrome Devtools 调试您的 Node.js 程序
【调试】258- 前端调试各种收集-断点篇
当我第一次知道这种东西,我也惊呆了,居然还有这种操作,实在强大到没朋友,从此爱上调试,按时下班。
pingan8787
2019/07/25
2.4K0
【调试】258- 前端调试各种收集-断点篇
Node.js源码学习——搭建阅读调试代码环境
声明下笔者的环境,Mac(10.14.6) CLion WebStorm(其他平台Node.js文档里也有介绍)
Runhwguo
2020/03/16
3.1K0
写给小白:浏览器断点调试是怎么实现的?
代码写完会运行一下看下效果,开发的时候我们更多都是通过 dubugger 来单步或断点运行。我们整天在用 debugger,可是你有想过它的实现原理么。
公众号@魔术师卡颂
2021/05/27
1.6K0
写给小白:浏览器断点调试是怎么实现的?
为你揭开 node.js 调试面纱
最近在写公司内部的一个 node 应用的时候,发现自己在 node 调试这块还是比较薄弱的,特意恶补了一下,在这里也做一下分享。
coder_koala
2019/12/06
1.2K0
为你揭开 node.js 调试面纱
我读 Typescript 源码的秘诀都在这里了
Test<T> 这个高级类型,有一个泛型参数 T,当 T 传入的类型为联合类型的时候,有两种情况:
玖柒的小窝
2021/10/05
1.1K0
我读 Typescript 源码的秘诀都在这里了
Node 调试工具入门教程
JavaScript 程序越来越复杂,调试工具的重要性日益凸显。客户端脚本有浏览器,Node 脚本怎么调试呢? 2016年,Node 决定将 Chrome 浏览器的"开发者工具"作为官方的调试工具,使
ruanyf
2018/04/12
8690
Node 调试工具入门教程
把 puppeteer 融入调试流程,调试体验爽翻了!
最近一直在做业务需求,表单类的,每次调试都要填一堆东西,而且项目需要登录,经常需要来一遍登录流程,再填写表单来调试。这个流程还是比较繁琐的。
神说要有光zxg
2023/02/01
1.2K0
了不起的 Deno 入门篇
Deno 是一个 JavaScript/TypeScript 的运行时,默认使用安全环境执行代码,有着卓越的开发体验。Deno 含有以下功能亮点:
阿宝哥
2020/05/25
3.4K0
了不起的 Deno 入门篇
【Node.js】如何调试你的 Node.js 代码?
很多时候,我苦恼于 Node.js 的调试,只会使用 console.log 这种带有侵入性的方法,但是其实 Node.js 也可以做到跟浏览器调试一样的方便。
GopalFeng
2022/08/01
8.5K0
【Node.js】如何调试你的 Node.js 代码?
使用vscode调试你的node应用
从一开始使用 webstorm 内置的 debug 功能, 到使用node-inspector库进行调试顺便脱离 webstorm 的笨重, 再后来 nodejs 内置了debugger 模块也可以帮助调试我们的应用.
funkyLover
2019/05/24
2.7K0
【保姆级】前端使用node.js基础教程
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,常用于服务器端编程。以下是一些 Node.js 中常用的命令:
肥晨
2024/03/22
2670
VsCode 各场景高级调试技巧,有用!
VsCode自从诞生以来,以其各自优异的特性迅速走红。尤其是对于前端开发小伙伴来说,几乎成为必不可少的开发工具。所以,熟练掌握VsCode的各自使用技巧与调试技巧会让你的日常开发工作效率倍增。本文将会以大量图文的方式,从下面几个方面详细介绍VsCode的各种技巧:
@超人
2022/04/14
1.3K0
VsCode 各场景高级调试技巧,有用!
调试 node.js 程序
在程序开发中,如何快速的查找定位问题是一项非常重要的基本功。在实际开发过程中,或多或少都会遇到程序出现问题导致无法正常运行的情况,因此,调试代码就变成了一项无法避免的工作。这里简单介绍下如何调试 node.js 程序。
用户6167509
2020/04/08
3.1K0
史诗级更新,VSCODE 可无缝调试浏览器了!
2021-07-16 微软发布了一篇博客专门介绍了这个功能,VSCODE 牛逼!
秋风的笔记
2021/08/27
1.4K0
史诗级更新,VSCODE 可无缝调试浏览器了!
nodejs的调试debug
对于开发者来说,在开发应用程序的过程中,往往为了开发方便和解决bug需要借助于编程语言的调试功能。一般来说我们需要借助于强大IDE的调试功能来完成这项工作。nodejs也不例外。
程序那些事
2021/01/28
1.6K0
Node.js 项目调试指南
Node.js 是一种流行的 JavaScript 运行时,与谷歌 Chrome 浏览器使用相同的 V8 引擎。它是跨平台的,在创建 Web 服务器、构建工具、命令行工具等方面越来越受欢迎。
ConardLi
2023/08/23
9550
Node.js 项目调试指南
相关推荐
Node.js 调试一路走来经历了什么
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验