开始学nodejs —— 调试篇

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

程序调试的方法和工具多种多样,在这里我总结一下我在学习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 也可以看到打印出的访问信息

此外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

  流程控制相关

  • contc - Continue execution
  • nextn - Step next
  • steps - Step in
  • outo - 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

变量查看相关

  • backtracebt - 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

npm install -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

npm install -g node-inspector

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

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

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

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

时间: 2024-10-24 19:56:54

开始学nodejs —— 调试篇的相关文章

基于chrome的nodejs调试器用法

学nodejs好久了.可惜一直没坚持下去,想起来就学点.一直想用nodejs的express框架搭配mysql开发一个小型网站,到现在还是没有实现用户注册功能.这个未完待续吧.有愿意帮助我的老师~看到我的文章能给予指导晚辈将不尽感激... 闲话不多扯,总结一下chrome下nodejs的调试: 翻阅了好多资料指导,nodejs提供了这样一个模块node-inspector,先来一句话安装它: npm install -g node-inspector // -g 是全局安装 我们在调试前先启动n

nodejs学习篇

最近在找工作,然后都说会个后台语言更好,选来选去,觉得nodejs比较有意思,就开始着手学这个了. 其实个人觉得,没有人领一下或者没有本好书去跟着做,这样的学习实在特别累,像我这种刚入门的菜鸟,完全搞不懂... 所以写下这篇博客,记录下自己的学习成果以及希望能有大神指点一二. 首先还是安装,nodejs直接去官网下载http://www.nodejs.org/ 对应自己系统就好.然后开始安装npm,我看了好久才知道npm是什么意思(不要笑...),可以这么理解. nodejs是个大房子,npm就

nodejs 学习二, nodejs调试

nodejs 调试,在官方文档(英文),常用的两种: 一个在chrome安装插件inspector 第二种利用编辑 这里我使用vscode编辑来调试. 主要是配置 launch.json(用vscode打开项目是,会生成.vscode文件,launch.json就在里面), launch.json配置如下: { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?

调试篇

--------------------------------------------调试篇错误类型: 编译错误:通常都是语法错误 运行错误:比如分母是0 提示报错的时候: 1.双击提示信息可以直接定位到报错的行 2.从上到下的调试程序,因为后面的报错是有可能是因为前面的报错而引起的连锁反应 Bug:错误,漏洞Debug:是找出错误,调式 描述问题的3要素: 1.前提条件是什么 2.预期结果是什么 3.实际结果是什么 重现或者复现 可以重现:是指输入相同时,都能重现相同的问题,那么问题是可以复

怒学Python——完结篇——I/O

好吧,没想到居然这么快,才两天我就把入门看完了,当然只是入门,以后如果用到,会把那些各个类型的细化都总结一下例如数学函数,或者总结一下一些框架的应用如Scarpy(爬虫框架,听着就很兴奋呢,很多人都是了解有,但是没用过......),笔者写完这段暂时先开心的看电影去,回学校再说. Python的屏幕I/O:如果是交互式编程,直接输入就好,这里的是在脚本式编程才用到,用到的方法是input和raw_input,下面给出例子 #!/usr/bin/python print raw_input() #

使用supervisor提高nodejs调试效率

如果你有PHP 开发经验,会习惯在修改PHP 脚本后直接刷新浏览器以观察结果,而你 在开发Node.js 实现的HTTP 应用时会发现,无论你修改了代码的哪一部份,都必须终止 Node.js 再重新运行才会奏效.这是因为Node.js 只有在第一次引用到某部份时才会去解析脚 本文件,以后都会直接访问内存,避免重复载入,而PHP 则总是重新读取并解析脚本(如 果没有专门的优化配置).Node.js的这种设计虽然有利于提高性能,却不利于开发调试,因 为我们在开发过程中总是希望修改后立即看到效果,而不

从零开始学Sketch——进阶篇

本文转自 http://www.jianshu.com/p/ff70b5f35c8f 从零开始学Sketch——进阶篇 Sketch是一款矢量绘图应用,而矢量绘图无疑是目前进行网页.图标以及界面设计的最好方式. 在初识了Sketch的界面布局和基础工具之后,我们就可以开始进入高阶的Sketch工具篇学习了.这篇文章主要会涉及Sketch模板.插件的使用,以及Sketch在具体使用过程中的一些技巧分享. 如果你曾接触过PS.AI.Axure等软件,那么接下来的内容你应该不会陌生,因为所有的设计软件

入木三分学网络第一篇--VRRP协议详解第一篇(转)

因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静态网关出现单点失效现象的路由协议. VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器(位于一个虚拟路由器组中, 在该组中,只有一台路由器--master路由器工作,转发数据包,其它路由器是backup路由器,不参与转发数据包),以及在实

FireFox VS Chrome 之 调试篇

一个完美的调试工具,FireBug! 精确跟踪每一步.只要按下图所示,选择"脚本",然后在下方选择脚本所在的文件即可对该文本的执行进行断点跟踪. 并且仅当一个线程运行结束后,才会去执行另外的线程的执行过程,这跟大多数多线程调试工具是一致的. Chrome 内置的调试功能,在某些情况下,并不能很好的把断点和实际断点代码对应起来,这种情况发生在 WebStore  中传入的断点的情况. 所以还是直接在 Chrome 中找到对应的文件,再次添加断点比较准确. 之所以想要使用 WebStore