diff options
author | Bradley Farias <bradley.meck@gmail.com> | 2021-04-09 23:36:25 +0300 |
---|---|---|
committer | Bradley Farias <bradley.meck@gmail.com> | 2021-04-13 22:59:32 +0300 |
commit | 8d9d8236b79ea91640f973cc8c1423603694b482 (patch) | |
tree | 3fe22ab0e2ed5e536bb0ef967737c41e29b24c7f /tools | |
parent | 7b2bad40056b43486dcba5e31b5569685108b09d (diff) |
bootstrap: mksnapshot should show JS error
PR-URL: https://github.com/nodejs/node/pull/38174
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/snapshot/snapshot_builder.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/tools/snapshot/snapshot_builder.cc b/tools/snapshot/snapshot_builder.cc index f97c646dfa1..e259604194b 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 <typename T> void WriteVector(std::stringstream* ss, const T* vec, size_t size) { @@ -79,6 +83,10 @@ std::string SnapshotBuilder::Generate( const std::vector<std::string> args, const std::vector<std::string> 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<NodeMainInstance> 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> context = NewContext(isolate); + if (bootstrapCatch.HasCaught()) { + Local<Object> obj = bootstrapCatch.Exception()->ToObject(context) + .ToLocalChecked(); + Local<Value> stack = obj->Get( + context, + FIXED_ONE_BYTE_STRING(isolate, "stack")).ToLocalChecked(); + if (stack->IsUndefined()) { + Local<String> 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(), |