diff --git a/tools/snapshot/snapshot_builder.cc b/tools/snapshot/snapshot_builder.cc index f97c646dfa17c4..e259604194b5bd 100644 --- a/tools/snapshot/snapshot_builder.cc +++ b/tools/snapshot/snapshot_builder.cc @@ -15,8 +15,12 @@ using v8::Context; using v8::HandleScope; using v8::Isolate; using v8::Local; +using v8::Object; using v8::SnapshotCreator; using v8::StartupData; +using v8::String; +using v8::TryCatch; +using v8::Value; template void WriteVector(std::stringstream* ss, const T* vec, size_t size) { @@ -79,6 +83,10 @@ std::string SnapshotBuilder::Generate( const std::vector args, const std::vector exec_args) { Isolate* isolate = Isolate::Allocate(); + isolate->SetCaptureStackTraceForUncaughtExceptions( + true, + 10, + v8::StackTrace::StackTraceOptions::kDetailed); per_process::v8_platform.Platform()->RegisterIsolate(isolate, uv_default_loop()); std::unique_ptr main_instance; @@ -104,7 +112,40 @@ std::string SnapshotBuilder::Generate( creator.SetDefaultContext(Context::New(isolate)); isolate_data_indexes = main_instance->isolate_data()->Serialize(&creator); + TryCatch bootstrapCatch(isolate); Local context = NewContext(isolate); + if (bootstrapCatch.HasCaught()) { + Local obj = bootstrapCatch.Exception()->ToObject(context) + .ToLocalChecked(); + Local stack = obj->Get( + context, + FIXED_ONE_BYTE_STRING(isolate, "stack")).ToLocalChecked(); + if (stack->IsUndefined()) { + Local str = obj->Get( + context, + FIXED_ONE_BYTE_STRING(isolate, "name")) + .ToLocalChecked()->ToString(context).ToLocalChecked(); + str = String::Concat( + isolate, + str, + FIXED_ONE_BYTE_STRING(isolate, ": ")); + stack = String::Concat( + isolate, + str, + obj->Get( + context, + FIXED_ONE_BYTE_STRING(isolate, "message")) + .ToLocalChecked()->ToString(context).ToLocalChecked()); + } + v8::String::Utf8Value utf8_value(isolate, stack); + if (*utf8_value != nullptr) { + std::string out(*utf8_value, utf8_value.length()); + fprintf(stderr, "Had Exception: %s\n", out.c_str()); + } else { + fprintf(stderr, "Unknown JS Exception\n"); + } + abort(); + } Context::Scope context_scope(context); env = new Environment(main_instance->isolate_data(),