Build
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=`pwd`/depot_tools:"$PATH"
fetch v8
cd v8
./build/install-build-deps.sh # Only Linux
sudo apt-get install ninja-build
# 특정 버전으로 commit
git checkout c895a23
gclient sync
# patch 파일이 있으면 해당 파일로 patch
# git apply <patchfile>
# Use v8gen.py
./tools/dev/v8gen.py x64.debug # Generate build option template
ninja -C ./out.gn/x64.debug # build
OR
# Use gm.py
tools/dev/gm.py x64.debugdepot_tools라는 빌드 도구를 설치하고 환경변수 PATH에 추가한다.
fetch 명령어로 v8 소스코드 다운. 디버깅할 버전으로 checkout 하고 sync한다.
linux 유저라면 install-build-deps.sh로 dependency 설치.
osx일 경우 Xcode CommandLineTools가 아닌 Xcode.app을 설치해야한다. Xcode-select -print-path시 .app/Contents/Developer가 있어야한다.
High Sierra에서 build할시 10.14 SDK가 v8 기준인 10.12 SDK와 맞지 않다고 에러가 출력되는데 스크립트에서 != 부분을 수정해주고 다시 빌드하면 된다.
바로 빌드하고 싶으면 gm.py로 바로 빌드하면 된다. build option 수정하고 싶다면 v8gen.py로 option template을 생성후 out.gn/args.gn 수정후 ninja 로드
v8gen Example
tools/dev/v8gen.py x64.debug -- v8_enable_slow_dchecks=false v8_enable_backtrace=true
cat out.gn/x64.debug/args.gn
is_debug = true
target_cpu = "x64"
v8_enable_backtrace = true
v8_enable_slow_dchecks = true
v8_optimized_debug = false
# Additional command-line args:
v8_enable_slow_dchecks=false
v8_enable_backtrace=true스크립트를 실행후 ~/v8/out 디렉토리를 보면 아래와 같이 x64.debug 폴더가 생성된다. 해당 디렉토리 내부에 있는 d8 파일을 실행하면 자바스크립트를 실행할 수 있다.

Debugging
Execute foo.js
먼저 아래 내용으로 foo.js 파일을 만들어 줍니다.
console.log("Welc0m3 to V8");이후 ./x64.debug/d8 foo.js 명령어를 사용하게 되면, 우리가 빌드한 d8 파일이 foo.js 코드를 실행해줍니다.

%DebugPrint()
먼저 foo.js 코드를 아래 코드로 바꿔줍시다.
test = [1, 10.17, "d0razi", ];
%DebugPrint(test);%DebugPrint(): 해당 객체의 세부 정보를 출력
그리고 --allow-natives-syntax 옵션을 붙여서 다시 실행해줍니다.
--allow-natives-syntax: V8 JavaScript 엔진에서 네이티브(V8 내부) 함수 및 기능을 사용할 수 있도록 허용하는 옵션. Ex:%DebugPrint(),%SystemBreak(),%PrepareFunctionForOptimization(),%OptimizeFunctionOnNextCall()

Debugging with gdb
v8 도 바이너리이기 때문에 디버깅 하는 방식은 ELF 파일과 같다.
먼저 gdb ./x64.debug/d8 -q를 사용하여 gdb를 실행해준다. 그리고 r --allow-natives-syntax foo.js 명령어로 원하는 파일을 실행해주면 된다.
아래 사진은 b* main 으로 breakpoint를 설정하고 실행한 사진이다.


~/.gdbinit에 아래 내용을 추가하면 여러 기능을 추가로 사용 가능하다. 명령어들은tools/gdbinit에서 확인할 수 있다.
source <V8-PATH>/tools/gdb-v8-support.py
source <V8-PATH>/tools/gdbinit