Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: runtime/vm/service.cc

Issue 381383010: Add breakpoints and single-stepping to Observatory. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« runtime/vm/debugger.cc ('K') | « runtime/vm/json_stream.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/service.h" 5 #include "vm/service.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/globals.h" 8 #include "platform/globals.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 1572 matching lines...) Expand 10 before | Expand all | Expand 10 after
1583 1583
1584 1584
1585 static bool HandleScriptsCoverage( 1585 static bool HandleScriptsCoverage(
1586 Isolate* isolate, const String& script_url, JSONStream* js) { 1586 Isolate* isolate, const String& script_url, JSONStream* js) {
1587 ScriptCoverageFilter sf(script_url); 1587 ScriptCoverageFilter sf(script_url);
1588 CodeCoverage::PrintJSON(isolate, js, &sf); 1588 CodeCoverage::PrintJSON(isolate, js, &sf);
1589 return true; 1589 return true;
1590 } 1590 }
1591 1591
1592 1592
1593 static bool HandleScriptsSetBreakpoint(
1594 Isolate* isolate, const String& script_url, JSONStream* js) {
1595 if (!js->HasOption("line")) {
1596 PrintError(js, "Missing 'line' option");
1597 return true;
1598 }
1599 const char* line_option = js->LookupOption("line");
1600 intptr_t line = -1;
1601 if (!GetIntegerId(line_option, &line)) {
1602 PrintError(js, "Invalid 'line' value: %s", line_option);
1603 return true;
1604 }
1605 SourceBreakpoint* bpt =
1606 isolate->debugger()->SetBreakpointAtLine(script_url, line);
1607 if (bpt == NULL) {
1608 PrintError(js, "Unable to set breakpoint at line %s", line_option);
1609 return true;
1610 }
1611 bpt->PrintJSON(js);
1612 return true;
1613 }
1614
1615
1593 static bool HandleScripts(Isolate* isolate, JSONStream* js) { 1616 static bool HandleScripts(Isolate* isolate, JSONStream* js) {
1594 if (js->num_arguments() == 1) { 1617 if (js->num_arguments() == 1) {
1595 // Enumerate all scripts. 1618 // Enumerate all scripts.
1596 return HandleScriptsEnumerate(isolate, js); 1619 return HandleScriptsEnumerate(isolate, js);
1597 } 1620 }
1598 // Subcommands of scripts require a valid script id. 1621 // Subcommands of scripts require a valid script id.
1599 const String& id = String::Handle(String::New(js->GetArgument(1))); 1622 const String& id = String::Handle(String::New(js->GetArgument(1)));
1600 ASSERT(!id.IsNull()); 1623 ASSERT(!id.IsNull());
1601 // The id is the url of the script % encoded, decode it. 1624 // The id is the url of the script % encoded, decode it.
1602 String& requested_url = String::Handle(String::DecodeURI(id)); 1625 String& requested_url = String::Handle(String::DecodeURI(id));
(...skipping 25 matching lines...) Expand all
1628 return true; 1651 return true;
1629 } 1652 }
1630 if (js->num_arguments() == 2) { 1653 if (js->num_arguments() == 2) {
1631 // If no subcommand is given, just fetch the script. 1654 // If no subcommand is given, just fetch the script.
1632 return HandleScriptsFetch(isolate, script, js); 1655 return HandleScriptsFetch(isolate, script, js);
1633 } else if (js->num_arguments() == 3) { 1656 } else if (js->num_arguments() == 3) {
1634 const char* arg = js->GetArgument(2); 1657 const char* arg = js->GetArgument(2);
1635 if (strcmp(arg, "coverage") == 0) { 1658 if (strcmp(arg, "coverage") == 0) {
1636 return HandleScriptsCoverage(isolate, requested_url, js); 1659 return HandleScriptsCoverage(isolate, requested_url, js);
1637 } 1660 }
1661 if (strcmp(arg, "setBreakpoint") == 0) {
1662 return HandleScriptsSetBreakpoint(isolate, requested_url, js);
1663 }
1638 PrintError(js, "Unrecognized subcommand '%s'", arg); 1664 PrintError(js, "Unrecognized subcommand '%s'", arg);
1639 return true; 1665 return true;
1640 } else { 1666 } else {
1641 PrintError(js, "Command too long"); 1667 PrintError(js, "Command too long");
1642 return true; 1668 return true;
1643 } 1669 }
1644 } 1670 }
1645 1671
1646 1672
1647 static bool HandleDebugResume(Isolate* isolate, JSONStream* js) { 1673 static bool HandleDebugResume(Isolate* isolate,
1674 const char* step_option,
1675 JSONStream* js) {
1648 if (isolate->message_handler()->paused_on_start()) { 1676 if (isolate->message_handler()->paused_on_start()) {
1649 isolate->message_handler()->set_pause_on_start(false); 1677 isolate->message_handler()->set_pause_on_start(false);
1650 JSONObject jsobj(js); 1678 JSONObject jsobj(js);
1651 jsobj.AddProperty("type", "Success"); 1679 jsobj.AddProperty("type", "Success");
1652 jsobj.AddProperty("id", ""); 1680 jsobj.AddProperty("id", "");
1653 return true; 1681 return true;
1654 } 1682 }
1655 if (isolate->message_handler()->paused_on_exit()) { 1683 if (isolate->message_handler()->paused_on_exit()) {
1656 isolate->message_handler()->set_pause_on_exit(false); 1684 isolate->message_handler()->set_pause_on_exit(false);
1657 JSONObject jsobj(js); 1685 JSONObject jsobj(js);
1658 jsobj.AddProperty("type", "Success"); 1686 jsobj.AddProperty("type", "Success");
1659 jsobj.AddProperty("id", ""); 1687 jsobj.AddProperty("id", "");
1660 return true; 1688 return true;
1661 } 1689 }
1662 if (isolate->debugger()->PauseEvent() != NULL) { 1690 if (isolate->debugger()->PauseEvent() != NULL) {
1691 if (step_option != NULL) {
1692 fprintf(stderr, "step option is %s\n", step_option);
Cutch 2014/07/15 19:42:34 remove before committing.
turnidge 2014/07/15 23:37:24 Done.
1693 if (strcmp(step_option, "into") == 0) {
1694 isolate->debugger()->SetSingleStep();
1695 } else if (strcmp(step_option, "over") == 0) {
1696 isolate->debugger()->SetStepOver();
1697 } else if (strcmp(step_option, "out") == 0) {
1698 isolate->debugger()->SetStepOut();
1699 } else {
1700 PrintError(js, "Invalid 'step' option: %s", step_option);
1701 return true;
1702 }
1703 }
1663 isolate->Resume(); 1704 isolate->Resume();
1664 JSONObject jsobj(js); 1705 JSONObject jsobj(js);
1665 jsobj.AddProperty("type", "Success"); 1706 jsobj.AddProperty("type", "Success");
1666 jsobj.AddProperty("id", ""); 1707 jsobj.AddProperty("id", "");
1667 return true; 1708 return true;
1668 } 1709 }
1669 1710
1670 PrintError(js, "VM was not paused"); 1711 PrintError(js, "VM was not paused");
1671 return true; 1712 return true;
1672 } 1713 }
1673 1714
1674 1715
1675 static bool HandleDebug(Isolate* isolate, JSONStream* js) { 1716 static bool HandleDebug(Isolate* isolate, JSONStream* js) {
1676 if (js->num_arguments() == 1) { 1717 if (js->num_arguments() == 1) {
1677 PrintError(js, "Must specify a subcommand"); 1718 PrintError(js, "Must specify a subcommand");
1678 return true; 1719 return true;
1679 } 1720 }
1680 const char* command = js->GetArgument(1); 1721 const char* command = js->GetArgument(1);
1681 if (strcmp(command, "breakpoints") == 0) { 1722 if (strcmp(command, "breakpoints") == 0) {
1682 if (js->num_arguments() == 2) { 1723 if (js->num_arguments() == 2) {
1683 // Print breakpoint list. 1724 // Print breakpoint list.
1684 JSONObject jsobj(js); 1725 JSONObject jsobj(js);
1685 jsobj.AddProperty("type", "BreakpointList"); 1726 jsobj.AddProperty("type", "BreakpointList");
1727 jsobj.AddProperty("id", "debug/breakpoints");
1686 JSONArray jsarr(&jsobj, "breakpoints"); 1728 JSONArray jsarr(&jsobj, "breakpoints");
1687 isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr); 1729 isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr);
1688 return true; 1730 return true;
1689 } else if (js->num_arguments() == 3) { 1731 } else {
1690 // Print individual breakpoint.
1691 intptr_t id = 0; 1732 intptr_t id = 0;
1692 SourceBreakpoint* bpt = NULL; 1733 SourceBreakpoint* bpt = NULL;
1693 if (GetIntegerId(js->GetArgument(2), &id)) { 1734 if (GetIntegerId(js->GetArgument(2), &id)) {
1694 bpt = isolate->debugger()->GetBreakpointById(id); 1735 bpt = isolate->debugger()->GetBreakpointById(id);
1695 } 1736 }
1696 if (bpt != NULL) { 1737 if (bpt == NULL) {
1697 bpt->PrintJSON(js);
1698 return true;
1699 } else {
1700 PrintError(js, "Unrecognized breakpoint id %s", js->GetArgument(2)); 1738 PrintError(js, "Unrecognized breakpoint id %s", js->GetArgument(2));
1701 return true; 1739 return true;
1702 } 1740 }
1703 } else { 1741 if (js->num_arguments() == 3) {
1704 PrintError(js, "Command too long"); 1742 // Print individual breakpoint.
1705 return true; 1743 bpt->PrintJSON(js);
1744 return true;
1745 } else if (js->num_arguments() == 4) {
1746 const char* sub_command = js->GetArgument(3);
1747 if (strcmp(sub_command, "clear") == 0) {
1748 // Clear this breakpoint.
1749 isolate->debugger()->RemoveBreakpoint(id);
1750
1751 JSONObject jsobj(js);
1752 jsobj.AddProperty("type", "Success");
1753 jsobj.AddProperty("id", "");
1754 return true;
1755 } else {
1756 PrintError(js, "Unrecognized subcommand %s", sub_command);
1757 return true;
1758 }
1759 } else {
1760 PrintError(js, "Command too long");
1761 return true;
1762 }
1706 } 1763 }
1707 } else if (strcmp(command, "pause") == 0) { 1764 } else if (strcmp(command, "pause") == 0) {
1708 if (js->num_arguments() == 2) { 1765 if (js->num_arguments() == 2) {
1709 // TODO(turnidge): Don't double-interrupt the isolate here. 1766 // TODO(turnidge): Don't double-interrupt the isolate here.
1710 isolate->ScheduleInterrupts(Isolate::kApiInterrupt); 1767 isolate->ScheduleInterrupts(Isolate::kApiInterrupt);
1711 JSONObject jsobj(js); 1768 JSONObject jsobj(js);
1712 jsobj.AddProperty("type", "Success"); 1769 jsobj.AddProperty("type", "Success");
1713 jsobj.AddProperty("id", ""); 1770 jsobj.AddProperty("id", "");
1714 return true; 1771 return true;
1715 } else { 1772 } else {
1716 PrintError(js, "Command too long"); 1773 PrintError(js, "Command too long");
1717 return true; 1774 return true;
1718 } 1775 }
1719 } else if (strcmp(command, "resume") == 0) { 1776 } else if (strcmp(command, "resume") == 0) {
1720 if (js->num_arguments() == 2) { 1777 if (js->num_arguments() == 2) {
1721 return HandleDebugResume(isolate, js); 1778 const char* step_option = js->LookupOption("step");
1779 return HandleDebugResume(isolate, step_option, js);
1722 } else { 1780 } else {
1723 PrintError(js, "Command too long"); 1781 PrintError(js, "Command too long");
1724 return true; 1782 return true;
1725 } 1783 }
1726 } else { 1784 } else {
1727 PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1)); 1785 PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1));
1728 return true; 1786 return true;
1729 } 1787 }
1730 } 1788 }
1731 1789
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after
2347 while (current != NULL) { 2405 while (current != NULL) {
2348 if (strcmp(name, current->name()) == 0) { 2406 if (strcmp(name, current->name()) == 0) {
2349 return current; 2407 return current;
2350 } 2408 }
2351 current = current->next(); 2409 current = current->next();
2352 } 2410 }
2353 return NULL; 2411 return NULL;
2354 } 2412 }
2355 2413
2356 } // namespace dart 2414 } // namespace dart
OLDNEW
« runtime/vm/debugger.cc ('K') | « runtime/vm/json_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698