解放双手:如何在本地调试远程服务器上的Node代码

写在前面

谈到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,在远程机器上进入调试模式

[root@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服务

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

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

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

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

常见问题:安全限制

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

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

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

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

相关链接

Node Debugger

How Does a C Debugger Work?

How debuggers work: Part 2 - Breakpoints

时间: 2024-10-25 20:57:35

解放双手:如何在本地调试远程服务器上的Node代码的相关文章

网站在本地测试是好的,但是上传到远程服务器上出错?

问题描述 网站在本地测试是好的,但是上传到远程服务器上出错?在百度上面搜索了半天也没有找到答案,网址:http://www.66880.net.cn/运行时错误说明:服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因).但可以通过在本地服务器计算机上运行的浏览器查看.详细信息:若要使他人能够在远程计算机上查看此特定错误信息的详细信息,请在位于当前Web应用程序根目录下的"web.config"配置文件中创建一个<customE

java-RMI本地client调用远程服务器上的server报错

问题描述 RMI本地client调用远程服务器上的server报错 代码这篇文章上的.Java RMI之HelloWorld篇 我把ihello,helloimpl,server放在了服务器上,client放在了本机电脑的eclipse中 保证远程服务器上的server正常运行,运行client报错 Caused by: java.lang.ClassNotFoundException: IHello (no security manager: RMI class loader disabled

如何把本地MySql数据库移植到远程服务器上

如何把本地MySql数据库移植到远程服务器上 用dedecms做了一个女性网站,是仿爱丽女人网的.为了在本地测试,就要添加分类栏目,为了看首页和列表页面的效果,还得在网上采集大量的各个分类的内容.这样下来几十个栏目每栏目几十条信息,信息一下就是几千条.做着做着就还不如先在本地做好,然后带数据图片一起上传上去.速度快!好操作,灵活性大.现在就把数据库的移植过程写出来和大家共享,有这样做的朋友也可以做个参考! 所有数据做好了,申请空间,申请数据库,好多情况也是已经有数据的数据回了.哪就要先备份已有的

oracle-Oracle如何把远程服务器上的数据拷贝到本地

问题描述 Oracle如何把远程服务器上的数据拷贝到本地 Oracle如何把远程服务器上的数据拷贝到本地,知道IP,SID,库名 解决方案 配置传输,通过dblink连接对端

远程连接-本地连接远程服务器数据库的问题

问题描述 本地连接远程服务器数据库的问题 本地应用phpstudy搭建的,php访问数据库正常.远程连接出问题.空间和数据库是申请万网的.我扫了一下数据库服务地址发现3306端口没有开放.请问:1,我是不是必须要联系运营商开放3306端口?2,我网站后台是linux系统,数据库服务器和后台并非一个ip地址..所以我不清楚的是php中连接数据库会因为操作系统不同而致使访问程序不同吗?3,我看了一些关于数据库授权的材料但是不深入,请问授权能够解决""连接不上服务器响应超时"&qu

图片-无法从本地拷贝大文件到远程服务器上

问题描述 无法从本地拷贝大文件到远程服务器上 从本地拷贝一些小文件到服务器上是没有问题的,但是大文件比如超过1G的文件,就会报错,不知道是什么原因.. 解决方案 服务端是不是对文件大小有限制,或者你该用ftp试试 解决方案二: 尝试过ftp上传,也是不能上传大文件,检查了服务器没有对文件大小限制呀 解决方案三: FTP上传有时间限制的,可以手动调一下时间 解决方案四: 用FTP 或者在服务器上安装个百度云盘,把东西上传上去,在远程服务器上下载

利用scp备份远程服务器上的文件到本地

当远程服务器上的图片需要备份时候,我们可以利用Linux的scp命令进行远程拷贝到本地. 先简单介绍一下scp的用法: 语法格式: scp [OPTIONS] file_source file_target OPTIONS: -v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接.认证. 或是配置错误 -C 使能压缩选项 -P 选择端口 . 注意 -p 已经被 rcp 使用 -r 递归下面所有文件 example: 从 本地/home/test.log 复制

在android上的XML文件,怎么样从远程服务器上获取

问题描述 在android上的XML文件,怎么样从远程服务器上获取 需要在远程服务器上读取XML文件,然后再修改本地android上的数据.我用XmlPullParser读取数据. XmlPullParser users; try { URL xmlUrl = new URL(""http://xx.xx.xx.xx/1.xml""); users = XmlPullParserFactory.newInstance().newPullParser(); users

我用vs2005 开发网站 使用freetextbox3.16和cuteEditir6.0本地调试正常,上传到空间就出错,看不见按钮图片

问题描述 我用vs2005开发网站使用freetextbox3.16和cuteEditir6.0本地调试正常,上传到某些空间就出错,看不见按钮图片,(但是有些服务器空间又可以正常使用)怎么办?各位大哥有没有好的html编辑器推荐啊? 解决方案 解决方案二:我用的是FCK解决方案三:我用的是FCK解决方案四:多谢拉!不过FCK按钮太多了,能减少点吗?我想要像csdn.net论坛我们正在使用这种简单的html编辑器能找到吗?