寫在前面
談到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
然后,就可以愉快的遠程調試了。

