| 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);
|
| }
|
|
|