简介
对于开发者来说,在开发应用程序的过程中,往往为了开发不便和解决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的博客
欢送关注我的公众号:「程序那些事」最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
发表回复