@@ -37,11 +37,18 @@ using node::Mutex;
37
37
using node::NativeSymbolDebuggingContext;
38
38
using node::TIME_TYPE;
39
39
using node::worker::Worker;
40
+ using v8::Array;
41
+ using v8::Context;
40
42
using v8::HeapSpaceStatistics;
41
43
using v8::HeapStatistics;
42
44
using v8::Isolate;
43
45
using v8::Local;
46
+ using v8::Number;
47
+ using v8::Object;
48
+ using v8::StackTrace;
44
49
using v8::String;
50
+ using v8::TryCatch;
51
+ using v8::Value;
45
52
using v8::V8;
46
53
47
54
namespace per_process = node::per_process;
@@ -53,13 +60,16 @@ static void WriteNodeReport(Isolate* isolate,
53
60
const char * trigger,
54
61
const std::string& filename,
55
62
std::ostream& out,
56
- Local<String> stackstr ,
63
+ Local<Object> error ,
57
64
bool compact);
58
65
static 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);
63
73
static void PrintNativeStack (JSONWriter* writer);
64
74
static void PrintResourceUsage (JSONWriter* writer);
65
75
static void PrintGCStatistics (JSONWriter* writer, Isolate* isolate);
@@ -76,7 +86,7 @@ std::string TriggerNodeReport(Isolate* isolate,
76
86
const char * message,
77
87
const char * trigger,
78
88
const std::string& name,
79
- Local<String> stackstr ) {
89
+ Local<Object> error ) {
80
90
std::string filename;
81
91
82
92
// Determine the required report filename. In order of priority:
@@ -142,7 +152,7 @@ std::string TriggerNodeReport(Isolate* isolate,
142
152
compact = per_process::cli_options->report_compact ;
143
153
}
144
154
WriteNodeReport (isolate, env, message, trigger, filename, *outstream,
145
- stackstr , compact);
155
+ error , compact);
146
156
147
157
// Do not close stdout/stderr, only close files we opened.
148
158
if (outfile.is_open ()) {
@@ -161,9 +171,9 @@ void GetNodeReport(Isolate* isolate,
161
171
Environment* env,
162
172
const char * message,
163
173
const char * trigger,
164
- Local<String> stackstr ,
174
+ Local<Object> error ,
165
175
std::ostream& out) {
166
- WriteNodeReport (isolate, env, message, trigger, " " , out, stackstr , false );
176
+ WriteNodeReport (isolate, env, message, trigger, " " , out, error , false );
167
177
}
168
178
169
179
// Internal function to coordinate and write the various
@@ -174,7 +184,7 @@ static void WriteNodeReport(Isolate* isolate,
174
184
const char * trigger,
175
185
const std::string& filename,
176
186
std::ostream& out,
177
- Local<String> stackstr ,
187
+ Local<Object> error ,
178
188
bool compact) {
179
189
// Obtain the current time and the pid.
180
190
TIME_TYPE tm_struct;
@@ -259,8 +269,13 @@ static void WriteNodeReport(Isolate* isolate,
259
269
PrintVersionInformation (&writer);
260
270
writer.json_objectend ();
261
271
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'
264
279
265
280
// Report native stack backtrace
266
281
PrintNativeStack (&writer);
@@ -301,7 +316,7 @@ static void WriteNodeReport(Isolate* isolate,
301
316
env,
302
317
" Worker thread subreport" ,
303
318
trigger,
304
- Local<String >(),
319
+ Local<Object >(),
305
320
os);
306
321
307
322
Mutex::ScopedLock lock (workers_mutex);
@@ -455,18 +470,56 @@ static void PrintNetworkInterfaceInfo(JSONWriter* writer) {
455
470
}
456
471
}
457
472
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
+
458
506
// Report the JavaScript stack.
459
- static void PrintJavaScriptStack (JSONWriter* writer,
507
+ static void PrintJavaScriptErrorStack (JSONWriter* writer,
460
508
Isolate* isolate,
461
- Local<String> stackstr ,
509
+ Local<Object> error ,
462
510
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) ;
466
514
if ((!strcmp (trigger, " FatalError" )) ||
467
515
(!strcmp (trigger, " Signal" ))) {
468
516
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)) {
470
523
String::Utf8Value sv (isolate, stackstr);
471
524
ss = std::string (*sv, sv.length ());
472
525
}
@@ -490,7 +543,6 @@ static void PrintJavaScriptStack(JSONWriter* writer,
490
543
}
491
544
writer->json_arrayend ();
492
545
}
493
- writer->json_objectend ();
494
546
}
495
547
496
548
// Report a native stack backtrace
0 commit comments