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

程序调试的方法和工具多种多样,在这里我总结一下我在学习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代码

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

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

  1. nodejs 学习二, nodejs调试

    nodejs 调试,在官方文档(英文),常用的两种: 一个在chrome安装插件inspector 第二种利用编辑 这里我使用vscode编辑来调试. 主要是配置 launch.json(用vscod ...

  2. nodejs 基础篇整合

    nodeJs 基础篇整合 最近有朋友也想学习nodeJs相关方面的知识,如果你是后端想接近前端,node作为一门跑在服务端的JS语言从这里入门再好不过了.如果你正好喜欢前端,想走的更高,走的更远.no ...

  3. 羽夏看Win系统内核——调试篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  4. nodejs 调试 node-inspector包

    nodejs  调试调试比较麻烦,让习惯了用chrome浏览器调试的前端同学来说有点不适用  node-inspector这个包让我们可以在chrome上像调试前端代码一样来调试nodejs 1.全局 ...

  5. [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

    老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...

  6. [老老实实学WCF] 第二篇 配置WCF

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...

  7. [老老实实学WCF] 第一篇 Hello WCF

    老老实实学WCF  第一篇 Hello WCF WCF(Windows Communication Foundation)是微软公司推出的面向服务技术的集大成者,涵盖继承了其之前发布的所有的分布式应用 ...

  8. 老老实实学WCF[第一篇] Hell wcf

    老老实实学WCF  第一篇 Hello WCF WCF(Windows Communication Foundation)是微软公司推出的面向服务技术的集大成者,涵盖继承了其之前发布的所有的分布式应用 ...

  9. 从零开始学Sketch——进阶篇-b

    从零开始学Sketch——进阶篇 Sketch是一款矢量绘图应用,而矢量绘图无疑是目前进行网页.图标以及界面设计的最好方式. 在初识了Sketch的界面布局和基础工具之后,我们就可以开始进入高阶的Sk ...

随机推荐

  1. 80 端口被占用 pid=4

    80端口被pid=4的系统进程给占用的解决方法: 一般开发的时候我们都会安装sqlserver ,也会把Sql server Reporting Services 安装上去.原因就是这个服务占用了80 ...

  2. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  3. 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter

    中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...

  4. ajax前后端数据交互简析

    前端-------->后端 方法:POST 将要传递给后台的数据在前端拼接成url字符串,通过request.send()传递给后台,后台php把得到的数据以索引数组的方式存储在$_POST中. ...

  5. jquery屏幕滚动计算事件总结

    获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度: $(docume ...

  6. C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能

    随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...

  7. eclipse如何添加Memory Analyzer

    ①启动Eclipse,并打开"Install New software..."对话框: ②点击Add,如图: ③点击OK,最后一直点next,完成

  8. TabLayout + ViewPager

    一.实现思路 1.在build.gradle中添加依赖,例如: compile 'com.android.support:support-v4:23.4.0'compile 'com.android. ...

  9. Atitit.attilax软件研发与项目管理之道

    Atitit.attilax软件研发与项目管理之道 1. 前言4 2. 鸣谢4 3. Genesis 创世记4 4. 软件发展史4 5. 箴言4 6. 使徒行传 4 7. attilax书 4 8. ...

  10. CentOS:ECDSA host key "ip地址" for has changed and you have requested strict checking(转)

    原文地址:http://blog.csdn.net/ausboyue/article/details/52775281 Linux SSH命令错误:ECDSA host key "ip地址& ...