您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)vscode中debugger怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
運行 nodejs 代碼的時候,如果帶上了 --inspect
(可以打斷點) 或者 --inspect-brk
(可以打斷點,并在首行斷住) 的參數(shù),那么就會以 debugger 的模式啟動:
可以看到,node 啟動了一個 web socket 的 server,地址是:ws://127.0.0.1:9229/78637688-e8e0-4582-80cc-47655f4bff66
為什么 debugger 要啟動一個 websocket server 呢?
debugger 的含義就是要在某個地方斷住,可以單步運行、查看環(huán)境中的變量。那么怎么設(shè)置斷點、怎么把當(dāng)前上下文的變量暴露出去呢,就是通過啟動一個 websocket server,這時候只要啟動一個 websocket client 連接上這個 server 就可以調(diào)試 nodejs 代碼了。
v8 debug protocol
連上之后呢,debugger server 和 debugger client 怎么交流?這就涉及到了 v8 debug protocol。
通過兩邊都能識別的格式來交流,比如:
在 test.js 的 100 行 設(shè)置斷點:
{ "seq":118, "type":"request", "command":"setbreakpoint", "arguments":{ "type":"script", "target":"test.js", "line":100 } }
然后查看當(dāng)前作用域的變量:
{ "seq":117, "type":"request", "command":"scope" }
執(zhí)行一個表達(dá)式:
{ "seq":118, "type":"request", "command":"evaluate", "arguments":{ "expression":"a()" } }
之后繼續(xù)運行:
{ "seq":117, "type":"request", "command":"continue" }
通過這種方式,client 就可以告訴 debugger server 如何執(zhí)行代碼。
debugger client
debugger client 一般都是有 ui 的(當(dāng)然,在命令行里面通過命令來調(diào)試也可以,但一般不這么做)。常見的 js 的 debugger client 有 chrome devtools 和 vscode debugger 等。
我們寫一個簡單的 js 腳本,通過 node --inspect-brk 跑起來:
可以看到它啟動在了 9229 端口,
然后,我們分別通過兩種 client 連上它。
chrome devtools
在 chrome 地址欄輸入 chrome://inspect,然后點擊 configure 來配置目標(biāo)端口:
把剛才的端口 9229 填上去:
然后就可以看到 chrome 掃描到了這個 target,點擊 inspect 就可以連上這個 debugger server。
之后就可以設(shè)置斷點、單步執(zhí)行、執(zhí)行表達(dá)式、查看作用域變量等,這些功能都是通過 v8 debug protocol 來實現(xiàn)的。
vscode debugger
在 vscode 里面寫代碼,在 chrome devtools 里調(diào)試比較麻煩,vscode 也實現(xiàn)了 debugger 的支持,可以直接用 vscode 來調(diào)試。
使用vscode 調(diào)試能力的方式是修改項目根目錄下的 .vscode/launch.json 配置。
attach
點擊右下角的按鈕來添加一個配置項。這里選擇 nodejs 的 attach:
因為已經(jīng)通過 node --inspect-brk 啟動了 websocket 的 debugger server,那么只需要啟動 websocket client,然后 attach 上 9229 端口就行。
點擊左側(cè)的按鈕,就可以連上 debugger server 開始調(diào)試:
launch
這樣先通過 node --inspect-brk 啟動 debugger server,然后再添加 vscode debug 配置來連接上太麻煩了,能不能把這兩步合并呢?
當(dāng)然可以,只要添加一個 launch 的配置:
這里的 type 是 launch,就是啟動 debgger server 并且啟動一個 debugger client 連接上該 server。運行的程序是根目錄下的 index2.js,還可以設(shè)置 stopOnEntry 來在首行斷住。
點擊調(diào)試,就可以看到能夠成功的調(diào)試該 js 文件。
vscode 會啟動 debugger server,然后啟動 debugger client 自動連接上該 server,這些都不需要我們?nèi)リP(guān)心。
這樣我們就可以成功的使用 vscode debugger 來調(diào)試 nodejs 代碼。
debugger client 中我們最常用的還是 vscode,這里著重講一下 vscode debugger 的各種場景下的配置。
sourcemap
如果調(diào)試 ts 代碼,肯定不能調(diào)試編譯后的代碼,要能夠映射回源碼,這個是 sourcemap 做的事情。調(diào)試工具都支持 sourcemap,比如 chrome devtools 和 vscode debugger,都支持文件末尾的 sourcemap url 的解析:
//# sourceMappingURL=index.js.map
這樣當(dāng)調(diào)試 index.js的時候,如果它是 ts 編譯的出來的,就會自動找到對應(yīng)的 ts。
當(dāng)然,如果調(diào)試配置里面直接指定了 ts,那么要能夠調(diào)試需要再配置 outFiles,告訴 vscode 去哪里找 sourcemap。
這樣,在 ts 源碼中打的斷點和在編譯出的 js 打的斷點都能生效。
多進(jìn)程調(diào)試
當(dāng)代碼中有子進(jìn)程的時候,就有了第二條控制流,需要再啟動一個 debugger。
比如 vscode,它是基于 electron,需要啟動一個主進(jìn)程,一些渲染進(jìn)程。主進(jìn)程是通過 launch 啟動的,而渲染進(jìn)程則是后來 attach 的。
主進(jìn)程啟動的時候,通過 --remote-debugging-port 來指定子進(jìn)程自動的時候的 debugger server 的端口。
outFiles 來指定 sourcemap 的位置,這樣才可以直接調(diào)試 ts 源碼。runtimeExecutable 是用 vscode 的運行時替代掉了 nodejs(一般不需要設(shè)置)。
然后渲染進(jìn)程是后面啟動的,我們通過參數(shù)配置了會啟動在 9222 端口,那么只要 attach 到那個端口就可以調(diào)試該進(jìn)程了。
vscode 支持多 target 調(diào)試,也就是可以在 vscode 里面同時啟動 多個 debugger。可以切換不同的 debugger 來調(diào)試不同的進(jìn)程。
debugger 只能打斷點么,不是的,它還可以這么用,加日志,不污染源碼。
debugger 的使用是一項很重要的能力,對于 nodejs 水平的提升很有幫助。
nodejs debugger 的原理是 js 引擎會啟動 debugger server(websocket),等待客戶端連接,我們可以通過各種 debugger client 連上來進(jìn)行調(diào)試,比如 chrome devtools、vscode debugger。
調(diào)試 nodejs 代碼更多還是使用 vscode debugger(當(dāng)然有的時候也會使用 chrome devtools 調(diào)試,基于 chrome devtools 的 memory 來進(jìn)行內(nèi)存分析,定位內(nèi)存泄漏問題的時候很有幫助)。
vscode debugger 的使用主要是在 .vscode/launch.json 里面添加調(diào)試配置。
調(diào)試配置分為 launch 和 attach 兩種:
launch 會啟動 debugger server 并用 debugger client 連接上
attach 只是啟動 debugger client 連接上已有的 debugger server,所以要指定端口
具體的配置項常用的有:
outFiles 指定 sourcemap 的位置,用來調(diào)試 ts 源碼等需要編譯的代碼
stopOnEntry 在首行停住
args 來指定一些命令行參數(shù)
runtimeExecutable 當(dāng)運行時不是 nodejs 的時候需要指定,比如 vscode 或者其他的一些運行時
基于這些配置我們就可以調(diào)試各種場景下的 nodejs 代碼,需要編譯的,或者多個進(jìn)程的。
不夸張地說,如果你熟悉了 debugger 的使用,理解各種 nodejs 代碼都會簡單很多。 希望這篇文章能夠幫助大家了解 debugger 的原理,并且能夠使用 chrome devtools 或者 vscode debugger 來調(diào)試 nodejs 代碼。知道有 sourcemap 以及多進(jìn)程的情況下都怎么調(diào)試。
關(guān)于“vscode中debugger怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。