Index: runtime/vm/service/vmservice.dart |
diff --git a/runtime/vm/service/vmservice.dart b/runtime/vm/service/vmservice.dart |
index ee6f2cd22a63a4007e26af8cc33944a594dfc187..e86b58f4902400424f56225ed1fed6b621a71eaa 100644 |
--- a/runtime/vm/service/vmservice.dart |
+++ b/runtime/vm/service/vmservice.dart |
@@ -140,6 +140,49 @@ class VMService extends MessageRouter { |
message.setResponse(JSON.encode(result)); |
} |
+ Future<String> _getCrashDump() async { |
+ final perIsolateRequests = [ |
+ // ?isolateId=<isolate id> will be appended to each of these requests. |
+ Uri.parse('getIsolate'), // Isolate information. |
+ Uri.parse('_getAllocationProfile'), // State of heap. |
+ Uri.parse('getStack?full=true'), // Call stack + local variables. |
+ ]; |
+ |
+ // Snapshot of running isolates. |
+ var isolates = runningIsolates.isolates.values.toList(); |
+ |
+ // Collect the mapping from request uris to responses. |
+ var responses = { |
+ }; |
+ |
+ // Request VM. |
+ var getVM = Uri.parse('getVM'); |
+ var getVmResponse = await new Message.fromUri(getVM).sendToVM(); |
+ responses[getVM.toString()] = JSON.decode(getVmResponse); |
+ |
+ // Request command line flags. |
+ var getFlagList = Uri.parse('getFlagList'); |
+ var getFlagListResponse = await new Message.fromUri(getFlagList).sendToVM(); |
+ responses[getFlagList.toString()] = JSON.decode(getFlagListResponse); |
+ |
+ // Make requests to each isolate. |
+ for (var isolate in isolates) { |
+ for (var request in perIsolateRequests) { |
+ var message = new Message.forIsolate(request, isolate); |
+ var response = await isolate.route(message); |
+ // Decode the JSON and and insert it into the map. The map key |
+ // is the request Uri. |
+ responses[message.toUri().toString()] = JSON.decode(response); |
+ } |
+ } |
+ |
+ // Encode the entire crash dump. |
+ return JSON.encode({ |
+ 'type' : '_crashDump', |
+ 'responses' : responses, |
+ }); |
+ } |
+ |
Future<String> route(Message message) { |
if (message.completed) { |
return message.response; |
@@ -149,6 +192,9 @@ class VMService extends MessageRouter { |
_clientCollection(message); |
return message.response; |
} |
+ if (message.method == '_getCrashDump') { |
+ return _getCrashDump(); |
+ } |
if (message.params['isolateId'] != null) { |
return runningIsolates.route(message); |
} |