设为首页 收藏本站
查看: 1345|回复: 0

[经验分享] 开始学nodejs —— 调试篇

[复制链接]

尚未签到

发表于 2017-2-22 10:35:38 | 显示全部楼层 |阅读模式
  新学习一种技术,肯定会遇到很多坑,我们需要找到这些坑,弄清楚这些坑出现的原因和其中的原理。这种操作就叫做调试。
  程序调试的方法和工具多种多样,在这里我总结一下我在学习nodejs的过程中,学到的和用到的调试方法。

log
  在JavaScript代码中直接console.log,可以在控制台中打印信息。但是这样的功能太单调,项目中模块很多,功能繁杂,如果没有一个约定好的console.log方法,很容易就导致打印的信息十分杂乱,可读性很差。
  nodejs有一个debug模块,提供:
  定义log模块,选择特定模块log输出
  模块文字颜色高亮
  log时间记录
  输出log到文件等功能
  首先
  npm init、npm install debug --save  新建一个nodejs项目并安装debug模块
  然后新建
  app.js



var debug=require("debug")("mydebug:http"),
work=require("./work"),
http=require("http");
http.createServer(function(req,res){
debug(req.method + ' ' + req.url);
res.end('hello\n');
}).listen(3000,function(){
debug("listening");
});
  work.js



var debug=require("debug")("mydebug:work");
setInterval(function(){
debug("doing some work @ %s —— %s",new Date().getTime(),"with supervisor");
},2000);
  上面两个文件中分别创建了 mydebug:http  和 mydebug:work 两个log模块,在启动项目的时候可以配置要打印的log模块,这个配置是支持通配符匹配的



在linux中启动:
DEBUG=mydebug:* node app.js
在windows中启动
set DEBUG=mydebug:* & node app.js
  这样就可以看到不同模块的日志打印了,同时也可以看到日志输出时间。
  在浏览器中访问 localhost:3000 也可以看到打印出的访问信息
DSC0000.png

  此外debug模块还提供把日志输出到文件的功能



set DEBUG=mydebug:*  &  node app.js mydebug:work> debug.log
  nodejs debug模块文档:https://github.com/visionmedia/debug

debug
  光有log还不够,当程序出现问题时通过log可以定位到错误位置,但是当我们想查看错误现场的变量时,log就无能为力了,一般情况下我们不会把所有的变量都打印出来。此时就需要断点的功能了,在程序里边打上断点,直接定位到错误位置,分析错误现场确认错误原因。
  nodejs内部提供一个debug机制,可以让程序进入debug模式,供开发者一步一步分析代码发现问题。
  共有3中启动参数可以让程序进入debug模式



node debug app.js
node --debug app.js
node --debug-brk app.js
  3种模式在调试形式上有一定区别。
  node debug app.js
  1.这种方式启动程序,程序会进入debug模式,并运行到启动文件的第1行就停止,等待开发者下发往下走的命令
  2.这种方式启动程序,直接在当前cmd中进入调试模式
  node --debug app.js
  1.这种方式启动程序,程序会进入debug模式,并运行完所有代码。这种启动方式往往用于程序启动的过程中不需要调试,通过触发时间进入回调函数的情况,比如在某个http请求中打上断点,等待客户端访问后进入断点
  2.这种方式启动程序,会开启一个TCP的端口监听,在本cmd中不进入调试模式,需要另外开启终端用node debug 命令连接调试端口
  命令为 node debug localhost debug端口
  或者   node debug p node进程id
  node --debug-brk app.js
  1.这种方式启动程序,程序会进入debug模式,但是不会运行代码,直到有一个终端连接到了debug端口,才开始执行代码,并在第1行进入断点
  2.这种方式启动程序,会开启一个TCP的端口监听,在本cmd中不进入调试模式,需要另外开启终端用node debug 命令连接调试端口
  进入debug模式后,可以通过一些命令来设置断点、取消断点以及控制程序执行流程
  命令文档:https://nodejs.org/api/debugger.html#debugger_commands_reference
  流程控制相关


  • cont, c - Continue execution
  • next, n - Step next
  • step, s - Step in
  • out, o - Step out
  • pause - Pause running code (like pause button in Developer Tools)
  断点设置取消相关


  • setBreakpoint(), sb() - Set breakpoint on current line
  • setBreakpoint(line), sb(line) - Set breakpoint on specific line
  • setBreakpoint('fn()'), sb(...) - Set breakpoint on a first statement in functions body
  • setBreakpoint('script.js', 1), sb(...) - Set breakpoint on first line of script.js
  • clearBreakpoint('script.js', 1), cb(...) - Clear breakpoint in script.js on line 1
  变量查看相关


  • backtrace, bt - Print backtrace of current execution frame
  • list(5) - List scripts source code with 5 line context (5 lines before and after)
  • watch(expr) - Add expression to watch list
  • unwatch(expr) - Remove expression from watch list
  • watchers - List all watchers and their values (automatically listed on each breakpoint)
  • repl - Open debugger's repl for evaluation in debugging script's context
  repl模式下可以输入变量名查看变量内容
  node debug
DSC0001.png

  从第一行代码开始进入断点,命令n进入下一行
  node --debug
  cmd1  开启调试端口
DSC0002.png

  cmd2   连接调试端口
DSC0003.png

  设置断点,取消断点
DSC0004.png

  cmd1 过了一分钟才继续打印
DSC0005.png

  用进程id的方式连接调试模块
DSC0006.png

  上图可以看到pid为4436
DSC0007.png

  repl模式
DSC0008.png


调试相关的工具和模块
  上面的调试过程还是略显麻烦,有一些工具和node模块可以用来辅助调试。

supervisor
  supervisor是一个node模块,用来启动node项目。
  supervisor可以监控一些文件,当这些文件发生变化时自动刷新程序,不用重新启动node程序。


当程序崩溃时,supervisor会重新启动程序。

还有其他的一些配置,可以在supervisor文档中看到 https://github.com/petruisfan/node-supervisor/

安装supervisor




npm install -g supervisor
  监控work.js的变化并启动node程序
DSC0009.png

  把work中的debug信息修改一下
DSC00010.png

  在任务管理器中结束app.js的node进程,可以看到supervisor自动重启了app.js的进程
DSC00011.png


webstorm
  webstorm提供了比较方便的debug工具
  在菜单中  run-debug-app.js
  可以直接在行号的地方点击,打上断点
DSC00012.png

  浏览器访问 localhost:3000,进入断点
DSC00013.png

  可以看到webstorm提供的一些调试工具
DSC00014.png

  实际上webstorm的调试功能也是基于 --debug-brk来实现的,使用了63797端口来调试

node-inspector
  如果不喜欢webstorm的调试工具,还可以使用我们熟悉的chrome调试工具来调试node代码,不过需要安装一个node模块——node-inspector



npm install -g node-inspector
  安装完成后,开启一个node调试端口 12345
DSC00015.png

  然后新开一个cmd,开始一个node-inspector调试服务,连接到刚刚开启的调试端口
DSC00016.png

  根据提示访问地址,即可使用我们比较熟悉的chrome的调试工具来调试nodejs代码
DSC00017.png

  调试的技巧有很多,很多细节问题都需要不同的调试技巧来实现,以后用到新的了再补充吧~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345599-1-1.html 上篇帖子: nodejs实现简易MVC 下篇帖子: 【NodeJS 学习笔记03】先运行起来再说
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表