原文地址:hiihl.com/articles/20… 本人近期在學習Node.js原始碼,並將會把學習過程、心得形成筆記。
環境準備
- 作業系統: macOS
- IDE: cLion
- 原始碼路徑: Node Master
本地編譯
node.js是用C++寫的,所以編譯有以下步驟:
- ./configure 配置。軟體裝到哪裡、什麼引數、什麼os、裝什麼東西,全都是configure來確定的
- make 編譯。make會讀取makefile的配置,進行編譯,生成可執行檔案
- make install 安裝。make install 會根據設定好的路徑,把軟體安裝到系統中
首先是配置
進入到node目錄後,執行./configure --debug
,注意後面的--debug,一開始我沒有加的試後發現斷點進不去;
執行完以後會生成以下檔案:
|____cctest.target.mk
|____gyp-mac-tool
|____Makefile
|____mkssldef.target.mk
|____node.target.mk
|____node_dtrace_header.target.mk
|____node_dtrace_provider.target.mk
|____node_dtrace_ustack.target.mk
|____node_etw.target.mk
|____node_js2c.host.mk
|____node_perfctr.target.mk
|____specialize_node_d.target.mk
|____v8_inspector_compress_protocol_json.host.mk
複製程式碼
這些檔案應該是make編譯時需要的一些引數配置
之後執行make編譯,在這之前,我看到了Makefile中有這樣一段註釋(搜debug看到的)
# BUILDTYPE=Debug builds both release and debug builds. If you want to compile
# just the debug build, run `make -C out BUILDTYPE=Debug` instead.
複製程式碼
從這段註釋理解,如果我們執行make -C out BUILDTYPE=Debug
則不會編譯release程式碼,由於我們是本地學習使用,所以我使用
make -C out BUILDTYPE=Debug -j 4
編譯,其中-j時編譯使用的程式數,用於加快編譯。
編譯過程時間比較久,編譯完以後可以看到多了一個out目錄,out/Debug目錄下有個可執行的檔案node,這就是我們本地編譯出來的node啦。
第三步make install是安裝時需要,此處可以忽略。
匯入工程
開啟IDE cLion,並匯入本地的node專案,開啟Run/Debug配置除錯資訊
參照上圖配置:
- 選擇Executable為前面編譯出來的out/Debug/node;
- Before launch中有一個build,我們要把它刪掉,否則每次都會重新編譯;
- Work directory選擇要執行的js程式碼目錄;
- Program arguments即為要執行的js程式碼。
ok,然後找到node_main.cc
,在main方法中打斷點,debug執行
如圖所示,我們成功進入了斷點。
同時除錯js及node原始碼
如果,我們想要同時除錯js程式碼及node.js原始碼,該如何配置呢?
回想我們使用webpack debug程式碼時控制檯上會列印node --inspect-brk=49469 /xxx.js
,node版本<8時列印--debug --debug-brk=49469
,
其中這49469就是node.js的除錯視窗,所以我們在除錯node.js原始碼時,Program arguments可以這樣配置--inspect-brk=49469 ./test.js
,
然後再啟動一個Node.js Remote Debug (webStorm中)或 Attach to Node.js/Chrome (cLion中)
,埠號配置為49469,即可同時除錯js