Node Log

转:http://www.tuicool.com/articles/Fzyaa2

新学习一种技术,肯定会遇到很多坑,我们需要找到这些坑,弄清楚这些坑出现的原因和其中的原理。这种操作就叫做调试。

程序调试的方法和工具多种多样,在这里我总结一下我在学习nodejs的过程中,学到的和用到的调试方法。

log

在JavaScript代码中直接console.log,可以在控制台中打印信息。但是这样的功能太单调,项目中模块很多,功能繁杂,如果没有一个约定好的console.log方法,很容易就导致打印的信息十分杂乱,可读性很差。

nodejs有一个debug模块,提供:

定义log模块,选择特定模块log输出

模块文字颜色高亮

log时间记录

输出log到文件等功能

首先

npm init、npm install debug --save  新建一个nodejs项目并安装debug模块

然后新建

app.js

vardebug=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中启动setDEBUG=mydebug:* & node app.js

这样就可以看到不同模块的日志打印了,同时也可以看到日志输出时间。

在浏览器中访问 localhost:3000 也可以看到打印出的访问信息

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

setDEBUG=mydebug:*  &  node app.js mydebug:work>debug.log

nodejs debug模块文档:https://github.com/visionmedia/debug

debug

光有log还不够,当程序出现问题时通过log可以定位到错误位置,但是当我们想查看错误现场的变量时,log就无能为力了,一般情况下我们不会把所有的变量都打印出来。此时就需要断点的功能了,在程序里边打上断点,直接定位到错误位置,分析错误现场确认错误原因。

nodejs内部提供一个debug机制,可以让程序进入debug模式,供开发者一步一步分析代码发现问题。

共有3中启动参数可以让程序进入debug模式

nodedebugapp.jsnode --debugapp.jsnode --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

从第一行代码开始进入断点,命令n进入下一行

node --debug

cmd1  开启调试端口

cmd2   连接调试端口

设置断点,取消断点

cmd1 过了一分钟才继续打印

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

上图可以看到pid为4436

repl模式

调试相关的工具和模块

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

supervisor

supervisor是一个node模块,用来启动node项目。

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

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

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

安装supervisor

npminstall -g supervisor

监控work.js的变化并启动node程序

把work中的debug信息修改一下

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

webstorm

webstorm提供了比较方便的debug工具

在菜单中  run-debug-app.js

可以直接在行号的地方点击,打上断点

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

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

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

node-inspector

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

npminstall -g node-inspector

安装完成后,开启一个node调试端口 12345

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容