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

[经验分享] 解放双手:如何在本地调试远程服务器上的Node代码

[复制链接]

尚未签到

发表于 2017-2-25 11:13:56 | 显示全部楼层 |阅读模式
写在前面
  谈到node断点调试,目前主要有三种方式,通过node内置调试工具、通过IDE(如vscode)、通过node-inspector,三者本质上差不多。本文着重点在于介绍 如何在本地通过node-inspector 调试远程服务器上的node代码
  在进入主题之前,首先会对三种调试方式进行入门讲解,方便新手理解后面的内容。至于老司机们,可以直接跳到主题去。

方式一:内置debug功能

进入调试模式(在第1行断点)
  

node debug app.js  



进入调试模式(在第n行断点)
  比如要在第3行断点。
  方式一:通过debugger

  方式二:通过sb(line)。


执行下一步
  通过next命令。


跳到下一个断点
  通过cont命令。


查看某个变量的值
  输入repl命令后,再次输入变量名,就可以看到变量对应的值。如果想继续执行代码,可以按ctrl+c退出。


添加/删除watch


  • 通过watch(expr)来添加监视对象。
  • 通过watchers查看当前所有的监视对象。
  • 通过unwatch(expr)来删除监视对象。
  添加watch:

  删除watch:


进入/跳出函数(step in、step out)


  • 进入函数:通过step或者s。
  • 跳出函数:通过out或者o。
  示例代码如下,假设代码运行到logger(str);这一行,首先跳进函数内部,再跳出函数。
  

var nick = 'chyingp';  
var country = 'China';
  

  
var str = nick + ' live in ' + country;
  

  
var logger = function(msg){
  console.log(msg); // 这里
  console.log('这行会跳过'); // 跳过这行
  
};
  

  
logger(str);  // 假设运行到这里,想要进入logger方法
  

  
console.log(str);
  

  示例截图如下:


多个文件断点
  通过setBreakpoint('script.js', 1), sb(...),在某个文件某一行添加断点。反正我是没成功过。。。怎么看都是bug。。。

重新运行
  每次都退出然后node debug app.js相当烦。直接用restart


远程调试
  比如远程机器ip是192.168.1.126,在远程机器上进入调试模式
  

[iyunv@localhost ex]# node --debug-brk app.js  
Debugger listening on port 5858
  

  然后,在本地机器通过node debug 192.168.1.126:5858连接远程机器进行调试。
  

node debug 192.168.1.126:5858  

  如下:
  

➜  /tmp node debug 192.168.1.126:5858  
connecting to 192.168.1.126:5858 ... ok
  
break in /tmp/ex/app.js:1
  
> 1 var Logger = require('./logger');
  2
  3 Logger.info('hello');
  
debug> n
  
break in /tmp/ex/app.js:3
  1 var Logger = require('./logger');
  2
  
> 3 Logger.info('hello');
  4
  5 });
  

  当然,还可以通过pid进行远程调试,这里就不举例。
  参考:https://nodejs.org/api/debugger.html#debugger_advanced_usage

方式二:通过IDE(vscode)
  首先,在vscode里打开项目

  然后,添加调试配置。主要需要修改的是可执行文件的路径。

  点击代码左侧添加断点。

  开始调试

  顺利断点,左侧的变量、监视对象,右侧的调试工具栏,用过chrome dev tool的同学应该很熟悉,不赘述。


方式三:通过node-inspector
  首先,安装node-inspector。
  

npm install -g node-inspector  

方式一:通过node-debug启动调试
  启动调试,它会自动帮你在浏览器里打开调试界面。
  

➜  debugger git:(master) ✗ node-debug app.js  
Node Inspector v0.12.8
  
Visit http://127.0.0.1:8080/?port=5858 to start debugging.
  
Debugging `app.js`
  

  
Debugger listening on port 5858
  

  调试界面如下,简直不能更亲切。


方式二:更加灵活的方式
  步骤1:通过node-inspector启动Node Inspector Server
  

➜  debugger git:(master) ✗ node-inspector  
Node Inspector v0.12.8
  
Visit http://127.0.0.1:8080/?port=5858 to start debugging.
  

  步骤2:通过传统方式启动调试。加入--debug-brk,好让代码在第一行断住。
  

➜  debugger git:(master) ✗ node --debug-brk app.js  
Debugger listening on port 5858
  

  步骤3:在浏览器里打开调试UI界面。就是步骤1里打印出来的地址 http://127.0.0.1:8080/?port=5858。成功


实现原理
  从上面的例子不难猜想到。(不负责任猜想)


  • 通过node --debug-brk启动调试,监听5858端口。
  • node-inspector启动服务,监听8080端口。
  • 在浏览器里访问http://127.0.0.1:8080/?port=5858。可以看到port=5858这个参数。结合之前讲到的node内置远程调试的功能,可以猜想,在返回UI调试界面的同时,服务内部通过5858端口开始了断点调试。
  另外,从下面截图可以看出,UI调试工具(其实是个网页)跟 inspector服务 之间通过websocket进行通信。
  用户在界面上操作时,比如设置断点,就向 inspector服务 发送一条消息,inspector服务 在内部通过v8调试器来实现代码的断点。

  可以看到,用到了v8-debug,这个就待深挖了。


通过node-inspector调试远程代码
  细心的同学可能会发现,node远程调试其实在上面node-inspector章节的讲解里已经覆盖到了。这里还是来个实际的例子。
  假设我们的node代码app.js运行在阿里云的服务器上,服务器ip是xxx.xxx.xxx.xxx。
  首先,服务器上启动node-inspector服务
  

[iyunv@iZ94wb7tioqZ ~]# node-inspector  
Node Inspector v0.12.8
  
Visit http://127.0.0.1:8080/?port=5858 to start debugging.
  

  其次,通过--debug-brk参数,进入调试模式
  

[iyunv@iZ94wb7tioqZ ex]# node --debug-brk app.js  
Debugger listening on port 5858
  

  最后,在本地通过ip地址愉快的访问调试界面。是不是很简单捏。


常见问题:安全限制
  远程调试常见的问题就是请求被拒绝。这是服务器安全策略的限制。遇到这种情况,开放端口就完事了。

  在我们的云主机上,默认安装了firewall-cmd,可以通过--add-port选项来开放8080端口的开放。如果本机没有安装firewall-cmd,也可以通过iptables来实现同样的功能。
  

[iyunv@iZ94wb7tioqZ ex]# firewall-cmd --add-port=8080/tcp  
success
  

  然后,就可以愉快的远程调试了。


相关链接
  Node Debugger
  How Does a C Debugger Work?
  How debuggers work: Part 2 - Breakpoints
  

运维网声明 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-346990-1-1.html 上篇帖子: mongodb安装&简单使用 下篇帖子: 区块链开发、以太坊开发的技术资料资源汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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