@@ -37,11 +37,18 @@ using node::Mutex;
3737using node::NativeSymbolDebuggingContext;
3838using node::TIME_TYPE;
3939using node::worker::Worker;
40+ using v8::Array;
41+ using v8::Context;
4042using v8::HeapSpaceStatistics;
4143using v8::HeapStatistics;
4244using v8::Isolate;
4345using v8::Local;
46+ using v8::Number;
47+ using v8::Object;
48+ using v8::StackTrace;
4449using v8::String;
50+ using v8::TryCatch;
51+ using v8::Value;
4552using v8::V8;
4653
4754namespace per_process = node::per_process;
@@ -53,13 +60,16 @@ static void WriteNodeReport(Isolate* isolate,
5360 const char * trigger,
5461 const std::string& filename,
5562 std::ostream& out,
56- Local<String> stackstr ,
63+ Local<Object> error ,
5764 bool compact);
5865static void PrintVersionInformation (JSONWriter* writer);
59- static void PrintJavaScriptStack (JSONWriter* writer,
60- Isolate* isolate,
61- Local<String> stackstr,
62- const char * trigger);
66+ static void PrintJavaScriptErrorStack (JSONWriter* writer,
67+ Isolate* isolate,
68+ Local<Object> error,
69+ const char * trigger);
70+ static void PrintJavaScriptErrorProperties (JSONWriter* writer,
71+ Isolate* isolate,
72+ Local<Object> error);
6373static void PrintNativeStack (JSONWriter* writer);
6474static void PrintResourceUsage (JSONWriter* writer);
6575static void PrintGCStatistics (JSONWriter* writer, Isolate* isolate);
@@ -76,7 +86,7 @@ std::string TriggerNodeReport(Isolate* isolate,
7686 const char * message,
7787 const char * trigger,
7888 const std::string& name,
79- Local<String> stackstr ) {
89+ Local<Object> error ) {
8090 std::string filename;
8191
8292 // Determine the required report filename. In order of priority:
@@ -142,7 +152,7 @@ std::string TriggerNodeReport(Isolate* isolate,
142152 compact = per_process::cli_options->report_compact ;
143153 }
144154 WriteNodeReport (isolate, env, message, trigger, filename, *outstream,
145- stackstr , compact);
155+ error , compact);
146156
147157 // Do not close stdout/stderr, only close files we opened.
148158 if (outfile.is_open ()) {
@@ -161,9 +171,9 @@ void GetNodeReport(Isolate* isolate,
161171 Environment* env,
162172 const char * message,
163173 const char * trigger,
164- Local<String> stackstr ,
174+ Local<Object> error ,
165175 std::ostream& out) {
166- WriteNodeReport (isolate, env, message, trigger, " " , out, stackstr , false );
176+ WriteNodeReport (isolate, env, message, trigger, " " , out, error , false );
167177}
168178
169179// Internal function to coordinate and write the various
@@ -174,7 +184,7 @@ static void WriteNodeReport(Isolate* isolate,
174184 const char * trigger,
175185 const std::string& filename,
176186 std::ostream& out,
177- Local<String> stackstr ,
187+ Local<Object> error ,
178188 bool compact) {
179189 // Obtain the current time and the pid.
180190 TIME_TYPE tm_struct;
@@ -259,8 +269,13 @@ static void WriteNodeReport(Isolate* isolate,
259269 PrintVersionInformation (&writer);
260270 writer.json_objectend ();
261271
262- // Report summary JavaScript stack backtrace
263- PrintJavaScriptStack (&writer, isolate, stackstr, trigger);
272+ writer.json_objectstart (" javascriptStack" );
273+ // Report summary JavaScript error stack backtrace
274+ PrintJavaScriptErrorStack (&writer, isolate, error, trigger);
275+
276+ // Report summary JavaScript error properties backtrace
277+ PrintJavaScriptErrorProperties (&writer, isolate, error);
278+ writer.json_objectend (); // the end of 'javascriptStack'
264279
265280 // Report native stack backtrace
266281 PrintNativeStack (&writer);
@@ -301,7 +316,7 @@ static void WriteNodeReport(Isolate* isolate,
301316 env,
302317 " Worker thread subreport" ,
303318 trigger,
304- Local<String >(),
319+ Local<Object >(),
305320 os);
306321
307322 Mutex::ScopedLock lock (workers_mutex);
@@ -455,18 +470,56 @@ static void PrintNetworkInterfaceInfo(JSONWriter* writer) {
455470 }
456471}
457472
473+ static void PrintJavaScriptErrorProperties (JSONWriter* writer,
474+ Isolate* isolate,
475+ Local<Object> error) {
476+ writer->json_objectstart (" errorProperties" );
477+ if (!error.IsEmpty ()) {
478+ TryCatch try_catch (isolate);
479+ Local<Context> context = error->GetIsolate ()->GetCurrentContext ();
480+ Local<Array> keys;
481+ if (!error->GetOwnPropertyNames (context).ToLocal (&keys)) {
482+ return writer->json_objectend (); // the end of 'errorProperties'
483+ }
484+ uint32_t keys_length = keys->Length ();
485+ for (uint32_t i = 0 ; i < keys_length; i++) {
486+ Local<Value> key;
487+ if (!keys->Get (context, i).ToLocal (&key) || !key->IsString ()) {
488+ continue ;
489+ }
490+ Local<Value> value;
491+ Local<String> value_string;
492+ if (!error->Get (context, key).ToLocal (&value) ||
493+ !value->ToString (context).ToLocal (&value_string)) {
494+ continue ;
495+ }
496+ String::Utf8Value k (isolate, key);
497+ if (!strcmp (*k, " stack" ) || !strcmp (*k, " message" )) continue ;
498+ String::Utf8Value v (isolate, value_string);
499+ writer->json_keyvalue (std::string (*k, k.length ()),
500+ std::string (*v, v.length ()));
501+ }
502+ }
503+ writer->json_objectend (); // the end of 'errorProperties'
504+ }
505+
458506// Report the JavaScript stack.
459- static void PrintJavaScriptStack (JSONWriter* writer,
507+ static void PrintJavaScriptErrorStack (JSONWriter* writer,
460508 Isolate* isolate,
461- Local<String> stackstr ,
509+ Local<Object> error ,
462510 const char * trigger) {
463- writer-> json_objectstart ( " javascriptStack " ) ;
464-
465- std::string ss ;
511+ Local<Value> stackstr ;
512+ std::string ss = " " ;
513+ TryCatch try_catch (isolate) ;
466514 if ((!strcmp (trigger, " FatalError" )) ||
467515 (!strcmp (trigger, " Signal" ))) {
468516 ss = " No stack.\n Unavailable.\n " ;
469- } else {
517+ } else if (!error.IsEmpty () &&
518+ error
519+ ->Get (isolate->GetCurrentContext (),
520+ node::FIXED_ONE_BYTE_STRING (isolate,
521+ " stack" ))
522+ .ToLocal (&stackstr)) {
470523 String::Utf8Value sv (isolate, stackstr);
471524 ss = std::string (*sv, sv.length ());
472525 }
@@ -490,7 +543,6 @@ static void PrintJavaScriptStack(JSONWriter* writer,
490543 }
491544 writer->json_arrayend ();
492545 }
493- writer->json_objectend ();
494546}
495547
496548// Report a native stack backtrace
0 commit comments