动态

详情 返回 返回

V8 入門記錄二:環境與調試 - 动态 详情

環境搭建

這裏先説下我的環境, 這是代碼運行的前提。

  • 系統: Mac Monterey 12.6.8
  • Xcode: 14.2
  • Python: 3.11.6 (不要使用 2.x 版本!)
建議全程指令都在FQ工具下進行

由源碼構建 V8

  1. 首先我們需要一個工具 depot_tools
  2. 執行指令克隆,這裏我是在文件夾 /Users/apple/Sites/demo/depot_tools 下執行的
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
  1. 再在配置文件裏添加環境變量(假設我們克隆的地址是 /path/), 因為使用的是 zsh, 所以在 ~/.zshrc 中添加 (如果使用的是原生的終端 bash,則在 ~/.bashrc 中添加)
$ export PATH=/path/depot_tools:$PATH

這裏根據我們剛剛克隆的地址,添加配置:

export PATH=/Users/apple/Sites/demo/depot_tools:$PATH

最後讓配置生效:

source ~/.zshrc 

如果你當前是 Windows 系統, 可查看此文檔瞭解注意事項。

  1. 現在新建文件夾,開始拉取倉庫:
mkdir ~/v8
cd ~/v8
fetch v8

整個倉庫大小至少有 1G,時間會比較長,這裏比較推薦的做法是在官方鏡像直接下載:
https://github.com/v8/v8

  1. 之前再切到 main 分支,更新下代碼:

    git checkout main
    git pull

更新依賴庫,運行指令:

gclient sync
  1. 還是在當前目錄,運行指令,進行編譯:

    tools/dev/gm.py x64.release

我們可以將 gm.py 作為一個快捷指令:

// 同上面講述的環境添加的添加方法在 ~/.zshrc 中添加下面一行,再使用 source 指令即可
alias gm=/Users/apple/Sites/demo/v8/v8/tools/dev/gm.py

這樣我們就可以編譯了:

gm x64.release

注意這裏的編譯需要花費較長的時間,我的電腦性能一般,花了 2 個小時左右。

編譯成功的顯示:

進入文件夾:/out/x64.release , 生成文件如下

├── args.gn
├── build.ninja
├── build.ninja.d
├── build.ninja.stamp
├── bytecode_builtins_list_generator
├── d8
├── gen
├── gen-regexp-special-case
├── icudtl.dat
├── mksnapshot
├── obj
├── snapshot_blob.bin
├── toolchain.ninja
├── torque
├── v8_build_config.json
└── v8_features.json
  1. 執行指令 d8 , 之後可運行 js 代碼,就像 Chrome 的控制枱那樣:

當然我們也可以執行一個 js 文件
新建文件 demo.js

function foo(num){
    var bar = 2;
    return Math.pow(num, bar)
}

console.log(foo(10))

運行結果:

官方還有一種手動編譯的方案即使用 GNninja 來手動編譯, 這是具體使用方式https://v8.js.cn/docs/build-gn/#generate-build-files

相對 gm 來説, 編譯更加繁瑣了,需要使用 GN 去生成 ninja 文件,再生成 makefile,最後才是編譯

遇到的問題

xcode-select

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

解決方案:

首先確認自己已經下載了 Xcode

file /Applications/Xcode.app/Contents/Developer

如果存在則執行以下指令:

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

輸入密碼後回車即可

相關鏈接:
https://stackoverflow.com/questions/17980759/xcode-select-active-developer-directory-error

其他問題

這些問題是從網上類似博客裏找到的,給大夥提供幫助

報錯:

ImportError: cannot import name zip_longest

原因就是 python 版本不對,py3是 zip\_longest 庫,py2下是 izip\_longest

這裏是具體的解決方案

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)

解決:執行以下文件即可

調試

gdb

gdb是一款功能強大的開源調試器,用於幫助開發人員診斷和修復程序中的錯誤。通過設置斷點、查看變量、回溯調用棧等功能,gdb使得在程序執行過程中定位問題變得更加容易。它支持多線程調試和提供宏調試功能,幫助開發人員有效地分析和解決複雜的軟件錯誤,提高調試效率。
本文只講述 mac 的安裝, 如果已安裝,請跳轉到配置
  1. 使用 Homebrew 安裝 gdb 安裝 gdb 的最新版本:

    brew install gdb

  2. 配置 Code Signing(簽名): 由於 SIP 限制,你需要配置 gdb 的代碼簽名,以便在調試時繞過權限問題。執行以下命令:

    echo "set startup-with-shell off" >> ~/.gdbinit

  3. 創建簽名文件: 在終端中執行以下命令:

    codesign -s gdb-cert /usr/local/bin/gdb

    注意:這裏的 gdb-cert 是你的證書名稱,可以替換為你自己的證書名稱。如果沒有證書,你可能需要先創建一個。

  4. 啓動 gdb 在終端中啓動 gdb

    gdb

如有問題可參考此文章

lldb

LLDB 是 LLVM 編譯器基礎上構建的調試器,主要用於 macOS 和其他支持 LLVM 的平台。作為 Xcode 的一部分,它支持多種調試功能,包括斷點設置、單步執行、變量查看等。LLDB 提供強大的命令行界面,用於調試本地和遠程程序。其靈活性和性能使其成為開發者在分析和修復代碼中的問題時的重要工具。

目前來説更加推薦使用這個,在安裝 Xcode 後,就應該已經擁有 LLDB。

如果沒有則需要設置一下環境變量:

// 將 `/path/to/XcodeCommandLineTools` 替換為實際的 Xcode 命令行工具路徑。
export PATH="/path/to/XcodeCommandLineTools/bin:$PATH"

運行以下命令來驗證是否可以找到 LLDB:

lldb --version

如果一切正常,應該能夠看到 LLDB 的版本信息。

進入調試

在源代碼中插入如下代碼進行調試:

%DebugPrint(x); 打印變量 x 的相關信息
%SystemBreak(); 拋出中斷,令 gdb 在此處斷點

以我們剛剛的 demo.js 為例子

%SystemBreak();
function foo(num){
    var bar = 2;
    return Math.pow(num, bar)
}

console.log(foo(10));  

%DebugPrint(foo);
%SystemBreak();
這兩條代碼並非原有的語法,在執行時需添加參數 “--allow-natives-syntax”, 否則會提示 “SyntaxError: Unexpected token '%'”

更多關於 V8 語法的知識,可查看源碼獲取

如上圖所示

  1. 進入調試工具
    lldb v8
  2. 我們需要運行指令來調試對應的文件:

    r --allow-natives-syntax /Users/apple/Sites/demo/v8/v8/out/x64.release/demo.js
  3. 輸入 continue 繼續, 可以看到 foo(10) 的打印結果,同時可以看到打印的 foo, 最後再次進入斷點
  4. 一直執行,看到 Process xxx exited 即是程序運行完畢

lldb 中還存在許多其他的命令: 如 step, next, print 等,來執行單步調試、查看變量等操作。

更多請查看官網

總結

在本文中,我們着手構建V8環境,並確保其成功編譯。透過調試指令,我們能夠在V8運行時提取必要的信息並將其輸出。這是學習V8引擎過程中的關鍵步驟。
在隨後的文章中,我們將深入研究V8,並探討相關主題。如在環境搭建、編譯或調試過程中遇到具體問題,請隨時提出,我將提供更詳細的信息和指導。

引用

  • https://blog.csdn.net/I_can_/article/details/124086670
  • https://commondatastorage.googleapis.com/chrome-infra-docs/fl...
  • https://github.com/ErodedElk/Chaos-me-JavaScript-V8/blob/master/Chapter1-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.md
user avatar dingtongya 头像 nihaojob 头像 freeman_tian 头像 jingdongkeji 头像 qingzhan 头像 littlelyon 头像 zourongle 头像 leexiaohui1997 头像 linx 头像 huajianketang 头像 anchen_5c17815319fb5 头像 xiaoxxuejishu 头像
点赞 145 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.