解放雙手:如何在本地調試遠程服務器上的Node代碼

寫在前面

談到node斷點調試,目前主要有三種方式,經過node內置調試工具經過IDE(如vscode)經過node-inspector,三者本質上差很少。本文着重點在於介紹 如何在本地經過node-inspector 調試遠程服務器上的node代碼html

在進入主題以前,首先會對三種調試方式進行入門講解,方便新手理解後面的內容。至於老司機們,能夠直接跳到主題去。node

方式一:內置debug功能

進入調試模式(在第1行斷點)

node debug app.js

clipboard.png

進入調試模式(在第n行斷點)

好比要在第3行斷點。git

方式一:經過debuggerweb

clipboard.png

方式二:經過sb(line)chrome

clipboard.png

執行下一步

經過next命令。shell

clipboard.png

跳到下一個斷點

經過cont命令。npm

clipboard.png

查看某個變量的值

輸入repl命令後,再次輸入變量名,就能夠看到變量對應的值。若是想繼續執行代碼,能夠按ctrl+c退出。api

clipboard.png

添加/刪除watch

  • 經過watch(expr)來添加監視對象。瀏覽器

  • 經過watchers查看當前全部的監視對象。安全

  • 經過unwatch(expr)來刪除監視對象。

添加watch:

clipboard.png

刪除watch:

clipboard.png

進入/跳出函數(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);

示例截圖以下:

clipboard.png

多個文件斷點

經過setBreakpoint('script.js', 1), sb(...),在某個文件某一行添加斷點。反正我是沒成功過。。。怎麼看都是bug。。。

從新運行

每次都退出而後node debug app.js至關煩。直接用restart

clipboard.png

遠程調試

好比遠程機器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/debugg...

方式二:經過IDE(vscode)

首先,在vscode裏打開項目

clipboard.png

而後,添加調試配置。主要須要修改的是可執行文件的路徑。

clipboard.png

點擊代碼左側添加斷點。

clipboard.png

開始調試

clipboard.png

順利斷點,左側的變量、監視對象,右側的調試工具欄,用過chrome dev tool的同窗應該很熟悉,不贅述。

clipboard.png

方式三:經過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

調試界面以下,簡直不能更親切。

clipboard.png

方式二:更加靈活的方式

步驟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。成功

clipboard.png

實現原理

從上面的例子不難猜測到。(不負責任猜測)

  • 經過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調試器來實現代碼的斷點。

clipboard.png

能夠看到,用到了v8-debug,這個就待深挖了。

clipboard.png

經過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地址愉快的訪問調試界面。是否是很簡單捏。

clipboard.png

常見問題:安全限制

遠程調試常見的問題就是請求被拒絕。這是服務器安全策略的限制。遇到這種狀況,開放端口就完事了。

clipboard.png

在咱們的雲主機上,默認安裝了firewall-cmd,能夠經過--add-port選項來開放8080端口的開放。若是本機沒有安裝firewall-cmd,也能夠經過iptables來實現一樣的功能。

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

而後,就能夠愉快的遠程調試了。

clipboard.png

相關連接

Node Debugger

How Does a C Debugger Work?

How debuggers work: Part 2 - Breakpoints

相關文章
相關標籤/搜索