| 19 | using v8::StackTrace; |
| 20 | |
| 21 | void NodeReport::SetJavaScriptStack(JSONWriter* writer, bool fatal_error) { |
| 22 | if (isolate_ == nullptr) { |
| 23 | return; |
| 24 | } |
| 25 | HandleScope scope(isolate_); |
| 26 | RegisterState state; |
| 27 | SampleInfo info; |
| 28 | |
| 29 | // init state |
| 30 | state.pc = nullptr; |
| 31 | state.fp = &state; |
| 32 | state.sp = &state; |
| 33 | |
| 34 | // instruction pointer |
| 35 | void* samples[kMaxFramesCount]; |
| 36 | |
| 37 | // get instruction pointer |
| 38 | isolate_->GetStackSample(state, samples, kMaxFramesCount, &info); |
| 39 | |
| 40 | // set current vm state |
| 41 | if (static_cast<size_t>(info.vm_state) < arraysize(v8_states)) { |
| 42 | writer->json_keyvalue("vmState", v8_states[info.vm_state]); |
| 43 | } else { |
| 44 | writer->json_keyvalue("vmState", "unknown"); |
| 45 | } |
| 46 | |
| 47 | if (fatal_error) { |
| 48 | writer->json_arraystart("jsStacks"); |
| 49 | writer->json_arrayend(); |
| 50 | return; |
| 51 | } |
| 52 | |
| 53 | // get js stacks |
| 54 | Local<StackTrace> stack = StackTrace::CurrentStackTrace( |
| 55 | isolate_, kMaxFramesCount, StackTrace::kDetailed); |
| 56 | writer->json_arraystart("jsStacks"); |
| 57 | for (int i = 0; i < stack->GetFrameCount(); i++) { |
| 58 | writer->json_start(); |
| 59 | |
| 60 | if (static_cast<size_t>(i) < info.frames_count) |
| 61 | writer->json_keyvalue("pcAddress", GetPcAddress(samples[i])); |
| 62 | else |
| 63 | writer->json_keyvalue("pcAddress", "nullptr"); |
| 64 | |
| 65 | // needs v8 version >= 6.8 |
| 66 | Local<StackFrame> frame = stack->GetFrame(isolate_, i); |
| 67 | |
| 68 | Utf8String fn_name_s(frame->GetFunctionName()); |
| 69 | Utf8String script_name(frame->GetScriptName()); |
| 70 | const int line_number = frame->GetLineNumber(); |
| 71 | const int column = frame->GetColumn(); |
| 72 | |
| 73 | if (fn_name_s.length() == 0) |
| 74 | writer->json_keyvalue("functionName", "anonymous"); |
| 75 | else |
| 76 | writer->json_keyvalue("functionName", *fn_name_s); |
| 77 | writer->json_keyvalue("scriptName", *script_name); |
| 78 | writer->json_keyvalue("lineNumber", line_number); |
nothing calls this directly
no test coverage detected