1. 程式人生 > >NodeJS學習筆記 (19)進階調試-debugger(ok)

NodeJS學習筆記 (19)進階調試-debugger(ok)

out too 不能 示例 不負責任 gin 設置斷點 connect 都是

寫在前面

談到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)