Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorBradley Farias <bradley.meck@gmail.com>2021-04-09 23:36:25 +0300
committerBradley Farias <bradley.meck@gmail.com>2021-04-13 22:59:32 +0300
commit8d9d8236b79ea91640f973cc8c1423603694b482 (patch)
tree3fe22ab0e2ed5e536bb0ef967737c41e29b24c7f /tools
parent7b2bad40056b43486dcba5e31b5569685108b09d (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.cc41
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(),