일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Android
- LLVM
- TLS
- linux debugging
- android inject
- OSR
- so inject
- on stack replacement
- Obfuscator
- pinpoint
- LLVM Obfuscator
- on-stack replacement
- linux thread
- anti debugging
- uftrace
- tracerpid
- Linux packer
- apm
- pthread
- Linux custom packer
- v8 optimizing
- custom packer
- v8 tracing
- 난독화
- Injection
- LLVM 난독화
- tracing
- initial-exec
- 안티디버깅
- thread local storage
Archives
- Today
- Total
Why should I know this?
Javascript Interpreting 분석 본문
0. v8 소개 및 v8 Javascript Engine Interpreting 분석을 위한 준비물
1. 당신의 Javascript, Bytecode로 대체되었다.
2. Interpreting은 function 단위로
3. Interpreting의 과정 한 눈에 보기
Interpreting은 생성된 Script class의 Run을 호출하는 것으로 시작된다.
Interpreting이 이뤄지는 과정을 일목요연하게 보기 위해,
- 최소한의 Javascript code "1 + 1"을 실행시킨다.
- Uftrace를 사용하여 Tracing 데이터를 생성한다.
이를 통해 다음과 같은 결과를 얻을 수 있따.
$ uftrace record --no-libcall -F v8::Script::Run -P. out.gn/x64.release/v8_shell
V8 version 7.4.0 (candidate) [sample shell]
> 1+1
2
$ uftrace replay
# DURATION TID FUNCTION
[113991] | v8::Script::Run() {
0.324 us [113991] | v8::platform::tracing::TracingController::GetCategoryGroupEnabled();
0.140 us [113991] | v8::HandleScope::Initialize();
0.276 us [113991] | v8::_GLOBAL__N_1::CallDepthScope::CallDepthScope();
0.143 us [113991] | v8::internal::TimedHistogram::Start();
0.627 us [113991] | v8::internal::TimerEventScope::LogTimerEvent();
0.503 us [113991] | v8::internal::Context::global_proxy();
[113991] | v8::internal::Execution::Call() {
[113991] | v8::internal::_GLOBAL__N_1::Invoke() {
0.168 us [113991] | v8::internal::PerIsolateAssertScope::IsAllowed();
0.095 us [113991] | v8::internal::PerIsolateAssertScope::IsAllowed();
0.710 us [113991] | v8::internal::PerIsolateAssertScope::IsAllowed();
[113991] | v8::internal::Builtins::builtin_handle() {
0.151 us [113991] | v8::internal::Heap::builtin_address();
0.524 us [113991] | } /* v8::internal::Builtins::builtin_handle */
1.039 us [113991] | v8::internal::SaveContext::SaveContext();
[113991] | v8::internal::Code::OffHeapInstructionStart() {
0.715 us [113991] | v8::internal::EmbeddedData::InstructionStartOfBuiltin();
1.230 us [113991] | } /* v8::internal::Code::OffHeapInstructionStart */
[113991] | Builtins_JSEntry() {
[113991] | Builtins_JSEntryTrampoline() {
[113991] | Builtins_CallFunction_ReceiverIsAny() {
[113991] | Builtins_InterpreterEntryTrampoline() {
[113991] | Builtins_StackCheckHandler() {
[113991] | Builtins_LdaSmiHandler() {
0.112 us [113991] | Builtins_ReturnHandler();
1.327 us [113991] | } /* Builtins_LdaSmiHandler */
2.465 us [113991] | } /* Builtins_StackCheckHandler */
3.668 us [113991] | } /* Builtins_InterpreterEntryTrampoline */
4.756 us [113991] | } /* Builtins_CallFunction_ReceiverIsAny */
5.273 us [113991] | } /* Builtins_JSEntryTrampoline */
6.585 us [113991] | } /* Builtins_JSEntry */
0.125 us [113991] | v8::internal::SaveContext::~SaveContext();
12.128 us [113991] | } /* v8::internal::_GLOBAL__N_1::Invoke */
12.516 us [113991] | } /* v8::internal::Execution::Call */
0.108 us [113991] | v8::internal::TimerEventScope::LogTimerEvent();
0.123 us [113991] | v8::internal::TimedHistogram::Stop();
[113991] | v8::internal::Isolate::FireCallCompletedCallback() {
0.423 us [113991] | v8::internal::Heap::ClearKeepDuringJobSet();
0.901 us [113991] | } /* v8::internal::Isolate::FireCallCompletedCallback */
18.455 us [113991] | } /* v8::Script::Run */
우리가 v8_shell 을 실행하여 "1+1"이라는 Javascript code를 실행하면, v8 내부에서는 "1+1"이라는 Javascript를 컴파일하여 bytecode배열을 생성하게 된다. 이것은 전 챕터에서 다룬 내용이다.
4. Interpreting 상세
'v8' 카테고리의 다른 글
[졸간분] 최적화 기법 on-stack replacement (0) | 2019.11.14 |
---|---|
Nodejs 최적화 Tip? (0) | 2019.11.13 |
Build and Test (0) | 2019.05.31 |
v8 인터프리터 분석 - 함수 호출 (0) | 2019.03.15 |
v8 tracing 지원을 위한 작업 기록 (0) | 2018.11.20 |
Comments