NodeJS學習筆記 (19)進階調試-debugger(ok)
寫在前面
談到node斷點調試,目前主要有三種方式,通過node內置調試工具
、通過IDE(如vscode)
、通過node-inspector
,三者本質上差不多。本文著重點在於介紹 如何在本地通過node-inspector 調試遠程服務器上的node代碼。
在進入主題之前,首先會對三種調試方式進行入門講解,方便新手理解後面的內容。至於老司機們,可以直接跳到主題去。
方式一:內置debug功能
進入調試模式(在第1行斷點)
node debug app.js
進入調試模式(在第n行斷點)
比如要在第3行斷點。
方式一:通過debugger
!help
方式二:通過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調試器來實現代碼的斷點。
通過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
NodeJS學習筆記 (19)進階調試-debugger(ok)