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-d0f7ebceab5a
For 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调试程序为我们提供了一些非常有用的命令:
- Stepping
 
- cont, c: 继续执行
 - next, n: Step到下一步
 - step, s: Step in
 - out, o: Step out
 - pause: 暂停运行的代码
 
- Breakpoints
 
- setBreakpoint(), sb(): 在当前行设置断点
 - setBreakpoint(line), sb(line): 在指定的行设置断点
 - setBreakpoint('fn()'), sb(...): 在指定的function中设置断点
 - setBreakpoint('script.js', 1), sb(...): 在指定的脚本文件中设置断点
 - clearBreakpoint('script.js', 1), cb(...): 从文件中清除断点
 
- 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的博客
欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
nodejs的调试debug的更多相关文章
- NodeJs之调试
		
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...
 - nodejs的调试
		
js的调试始终是一个比较麻烦也是比较困难的事情,从最原始的alert调试,到火狐的firebug工具,在到后来各个浏览器厂商的调试工具.调试工具的发展历程,也可以看出由JS构建的业务和技术逻辑越来越复 ...
 - Eclipse调试DEBUG时快速查看某个变量的值的快捷键、快速跳转到某行的快捷键
		
Eclipse调试DEBUG时快速查看某个变量的值的快捷键 Ctrl + Shift + i
 - iddea代码调试debug篇
		
代码调试debug篇 主要看图,看图一目了然. 断点的设定和eclipse一样,只要点一下就可以,下面是我设定的几个断点,再下面的三个窗口是用来调试代码的,这个和eclipse类似 调试常用的快捷键 ...
 - Tensorflow之调试(Debug) && tf.py_func()
		
Tensorflow之调试(Debug)及打印变量 tensorflow调试tfdbg 几种常用方法: 1.通过Session.run()获取变量的值 2.利用Tensorboard查看一些可视化统计 ...
 - vs2013中$(TargetPath)与Link.OutputFile不同,导致调试debug找不到exe
		
之前把VS2008项目升级为VS2013项目后,出现了VS2013调试debug找不到exe文件的现象,如:http://blog.sina.com.cn/s/blog_6c617ee301013xt ...
 - 解决Myeclipse在调试(debug)时无法显示变量值问题
		
解决Myeclipse在调试(debug)时无法显示变量值问题 突然发现myeclipse在调试时当鼠标放在变量上面时无法显示变量值了 ctrl+shift+D居然提示cannot be resolv ...
 - 一个简单的Eclipse调试Debug流程(四)
		
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
 - 【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[5]:调试 debug
		
作者:Xuejie 原文链接:https://xuejie.space/2019_10_18_introduction_to_ckb_script_programming_debugging/ Ner ...
 
随机推荐
- 在python中元组与列表的区别及序列解包
			
一. 元组与列表的区别 元组中的数据一旦定义就不允许更改. 元组没有append().extend()和insert()等方法,无法向元组中添加元素. 元组没有remove()或pop()方法,也无法 ...
 - 类818tu.c微信小说分销系统设计之定时模板消息源码
			
近期将出个系列讲解开发过程,同时作为此系统的开发记录吧,万能的博客园,本边讲解如何发送模板消息,并且能够定时发送,下一篇讲解如何处理多个公众号的网页授权登录问题 [后台]http://xiaoshuo ...
 - Excel-RANK函数排名与拓展
			
问题场景 需求不同根据总分出排名(从大到小100分.100分.99分.98分.97分),排名需求: 第一种排名:第1名,第2名,第3名,第4名,第5名: 第二种排名:第1名,第1名,第3名,第4名,第 ...
 - Dubbo服务引用源码解析③
			
 上一章分析了服务暴露的源码,这一章继续分析服务引用的源码.在Dubbo中有两种引用方式:第一种是服务直连,第二种是基于注册中心进行引用.服务直连一般用在测试的场景下,线上更多的是基于注册中心的方式 ...
 - Oracle 使用MERGE INTO 语句 一条语句搞定新增编辑
			
MERGE INTO RDP_CHARTS_SETTING T1 USING (SELECT '10001' AS PAGE_ID, 'test' AS CHART_OPTION FROM DUAL) ...
 - C语言实现汉诺塔
			
汉诺塔 要把A柱子上的盘子移动到C柱子上,在移动过程中可以借助B柱子,但是要求小的盘子在上大的盘子在下. 解题思路: 1.把A柱子上的前N-1个盘子借助C柱子,全部移动到B柱子上(过程暂不考虑),再把 ...
 - 超级电容(Supercapacitor) 和电池的比较
			
之前看到同事在电路设计里使用了超级电容来进行供电,好奇为什么没有用到普通的电池,于是就是找了找两个的区别.有篇文章讲得挺好,所以就直接翻译一下. 超级电容有点像普通电池和一般电容的结合体,能比一般的电 ...
 - java线程调度
			
JAVA线程调度分抢占式和协调式 协调式的线程切换由线程本身自己控制,好处是实现简单,当前线程只有当事情做完才会通知系统进行切换并没有同步开销,坏处是容易引发事故,假如阻塞的线程由于代码BUG没有通知 ...
 - 死磕以太坊源码分析之MPT树-下
			
死磕以太坊源码分析之MPT树-下 文章以及资料请查看:https://github.com/blockchainGuide/ 上篇主要介绍了以太坊中的MPT树的原理,这篇主要会对MPT树涉及的源码进行 ...
 - github下载大文件太慢/失败
			
场景 github下载大文件,使用浏览器下载zip包到本地在下载到1G时失败, 使用 git clone ssh下载速度20k/s以下,已fq. 解决方法(亲测) 1.下载Github Desktop ...