Index: runtime/vm/service.cc |
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
index 036bb832f9b9ae2f61ed7538a2e18acb884a27a6..0f38d611a5022a837d395075d2ca556d67fe0f8d 100644 |
--- a/runtime/vm/service.cc |
+++ b/runtime/vm/service.cc |
@@ -733,17 +733,26 @@ static bool GetStack(Isolate* isolate, JSONStream* js) { |
const bool full = BoolParameter::Parse(js->LookupParam("full"), false); |
JSONObject jsobj(js); |
jsobj.AddProperty("type", "Stack"); |
- JSONArray jsarr(&jsobj, "frames"); |
+ { |
+ JSONArray jsarr(&jsobj, "frames"); |
+ |
+ intptr_t num_frames = stack->Length(); |
+ for (intptr_t i = 0; i < num_frames; i++) { |
+ ActivationFrame* frame = stack->FrameAt(i); |
+ JSONObject jsobj(&jsarr); |
+ frame->PrintToJSONObject(&jsobj, full); |
+ // TODO(turnidge): Implement depth differently -- differentiate |
+ // inlined frames. |
+ jsobj.AddProperty("depth", i); |
+ } |
+ } |
- intptr_t num_frames = stack->Length(); |
- for (intptr_t i = 0; i < num_frames; i++) { |
- ActivationFrame* frame = stack->FrameAt(i); |
- JSONObject jsobj(&jsarr); |
- frame->PrintToJSONObject(&jsobj, full); |
- // TODO(turnidge): Implement depth differently -- differentiate |
- // inlined frames. |
- jsobj.AddProperty("depth", i); |
+ { |
+ MessageHandler::AcquiredQueues aq; |
+ isolate->message_handler()->AcquireQueues(&aq); |
+ jsobj.AddProperty("messages", aq.queue()); |
} |
+ |
return true; |
} |
@@ -1163,14 +1172,11 @@ static void PrintSentinel(JSONStream* js, |
static SourceBreakpoint* LookupBreakpoint(Isolate* isolate, const char* id) { |
size_t end_pos = strcspn(id, "/"); |
- const char* rest = NULL; |
- if (end_pos < strlen(id)) { |
- rest = id + end_pos + 1; // +1 for '/'. |
+ if (end_pos == strlen(id)) { |
+ return false; |
} |
+ const char* rest = id + end_pos + 1; // +1 for '/'. |
if (strncmp("breakpoints", id, end_pos) == 0) { |
- if (rest == NULL) { |
- return NULL; |
- } |
intptr_t bpt_id = 0; |
SourceBreakpoint* bpt = NULL; |
if (GetIntegerId(rest, &bpt_id)) { |
@@ -1182,6 +1188,40 @@ static SourceBreakpoint* LookupBreakpoint(Isolate* isolate, const char* id) { |
} |
+// Scans |isolate|'s message queue looking for a message with |id|. |
+// If found, the message is printed to |js| and true is returned. |
+// If not found, false is returned. |
+static bool PrintMessage(JSONStream* js, Isolate* isolate, const char* id) { |
+ size_t end_pos = strcspn(id, "/"); |
+ if (end_pos == strlen(id)) { |
+ return false; |
+ } |
+ const char* rest = id + end_pos + 1; // +1 for '/'. |
+ if (strncmp("messages", id, end_pos) == 0) { |
+ uword message_id = 0; |
+ if (GetUnsignedIntegerId(rest, &message_id, 16)) { |
+ MessageHandler::AcquiredQueues aq; |
+ isolate->message_handler()->AcquireQueues(&aq); |
+ Message* message = aq.queue()->FindMessageById(message_id); |
+ if (message == NULL) { |
+ printf("Could not find message %" Px "\n", message_id); |
+ // Not found. |
+ return false; |
+ } |
+ SnapshotReader reader(message->data(), |
+ message->len(), |
+ Snapshot::kMessage, |
+ isolate, |
+ isolate->current_zone()); |
+ const Object& msg_obj = Object::Handle(reader.ReadObject()); |
+ msg_obj.PrintJSON(js); |
+ return true; |
+ } else { |
+ printf("Could not get id from %s\n", rest); |
+ } |
+ } |
+ return false; |
+} |
static bool PrintInboundReferences(Isolate* isolate, |
@@ -2331,6 +2371,10 @@ static bool GetObject(Isolate* isolate, JSONStream* js) { |
return true; |
} |
+ if (PrintMessage(js, isolate, id)) { |
+ return true; |
+ } |
+ |
PrintError(js, "Unrecognized object id: %s\n", id); |
return true; |
} |