主要是v8对象基础的概念。
0x01 v8是什么
简而言之,v8就是js的解释器。
V8由很多子模块构成,其中,有几个最重要的模块:
- Parser:负责将JavaScript源码转换为Abstract Syntax Tree (AST)
- Ignition:interpreter,即解释器,负责将AST转换为Bytecode,解释执行Bytecode;同时收集TurboFan优化编译所需的信息,比如函数参数的类型
- TurboFan:compiler,即编译器,利用Ignitio所收集的类型信息,将Bytecode转换为优化的汇编代码
- Orinoco:garbage collector,垃圾回收模块,负责将程序不再需要的内存空间回收
Parser、Ignition、Turbofan协作将JS源码最终编译成汇编代码
0x02 v8 中JS对象结构
在下面的代码中定义了a,b两个对象,下面在调试中观察下里面的数据和结构。
1 | function Foo1 () {} |
2.1 使用谷歌浏览器观察
首先先在谷歌开发工具中键入上面的代码,然后在Memory中拍摄快照
我们大致可以看出来,对于a它有两个属性,分别是name
和text
,这两个属性直接保存在对象结构中。还有两个字符串”a-1”和”a-2”,他们作为元素
,保存在了elements中。
因此暂时可以猜测,对象中保存的数据有两种形式: 一种是不需要索引的,称为属性
, 另一种是需要索引的,称为元素
2.2 在ubuntu中编译v8观察
让我们单独看a打印出来的结构
1 | DebugPrint: 0x1c6808148b91: [JS_OBJECT_TYPE] |
在v8中打印出的结构更确认了我们上面的猜测,并且更多看到了一些东西。比如map。
还有一些其它的
prototype prototype
elements 对象元素
length 元素个数
properties 属性
结构图如下:
1 | elements ----> +------------------------+ |
0x03 v8环境搭建
3.1代理配置
首先在本地的小飞机中,选项设置-》本地代理设置-》开启本地代理-》选择端口
配置git代理,后面的ip采用自己宿主机的,端口采用上一步设置的端口,虚拟机配置采用nat模式
1 | git config --global http.proxy http://192.168.235.1:1080 |
配置环境变量,进行全局代理
1 | export http_proxy="http://192.168.235.1:1080" |
下载工具,并设置环境变量(注意此处环境变量的路径与你下载的路径是否相同
1 | git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git |
编译v8
.
1 | fetch v8 && cd v8 |
1 | gclient sync |
启动
1 | ./out.gn/x64.release/d8 |
调试工具,这个gdbinit如果没有的话需要从网上自行下载
1 | echo 'source /home/w4rd3n/v8/tools/gdbinit' >> ~/.gdbinit |