diff --git a/debugger/src/datasources.js b/debugger/src/datasources.js index edeea46b6..3119f0514 100644 --- a/debugger/src/datasources.js +++ b/debugger/src/datasources.js @@ -61,6 +61,39 @@ module.service('DataSource', function($q) { DataSource.prototype.dispose = function() {}; DataSource.prototype.issue = function(command) {}; + DataSource.prototype.makeReady = function() { + return this.issue({ + command: 'debug.make_ready' + }); + }; + + DataSource.prototype.getModuleList = function() { + return this.issue({ + command: 'cpu.get_module_list' + }); + }; + + DataSource.prototype.getModule = function(moduleName) { + return this.issue({ + command: 'cpu.get_module', + module: moduleName + }); + }; + + DataSource.prototype.getFunctionList = function(moduleName) { + return this.issue({ + command: 'cpu.get_function_list', + module: moduleName + }); + }; + + DataSource.prototype.getFunction = function(address) { + return this.issue({ + command: 'cpu.get_function', + address: address + }); + }; + DataSource.prototype.addBreakpoint = function(breakpoint) { return this.addBreakpoints([breakpoint]); }; @@ -96,33 +129,6 @@ module.service('DataSource', function($q) { }); }; - DataSource.prototype.getModuleList = function() { - return this.issue({ - command: 'cpu.get_module_list' - }); - }; - - DataSource.prototype.getModule = function(moduleName) { - return this.issue({ - command: 'cpu.get_module', - module: moduleName - }); - }; - - DataSource.prototype.getFunctionList = function(moduleName) { - return this.issue({ - command: 'cpu.get_function_list', - module: moduleName - }); - }; - - DataSource.prototype.getFunction = function(address) { - return this.issue({ - command: 'cpu.get_function', - address: address - }); - }; - return DataSource; }); diff --git a/debugger/src/session.js b/debugger/src/session.js index e79350cb0..6395f33a2 100644 --- a/debugger/src/session.js +++ b/debugger/src/session.js @@ -52,7 +52,9 @@ module.service('Session', function( }; for (var key in this.breakpoints) { var breakpoint = this.breakpoints[key]; - json.breakpoints.push(breakpoint.toJSON()); + if (breakpoint.type != Breakpoint.TEMP) { + json.breakpoints.push(breakpoint.toJSON()); + } } window.localStorage[this.id] = JSON.stringify(json); }; @@ -100,8 +102,11 @@ module.service('Session', function( p.then((function() { log.info('Connected!'); log.clearProgress(); - this.setDataSource(dataSource); - d.resolve(this); + this.setDataSource(dataSource).then((function() { + d.resolve(this); + }).bind(this), (function(e) { + d.reject(e); + }).bind(this)); }).bind(this), (function(e) { log.error('Unable to connect: ' + e); log.clearProgress(); @@ -119,22 +124,42 @@ module.service('Session', function( }; Session.prototype.setDataSource = function(dataSource) { + var d = $q.defer(); if (this.dataSource) { this.dataSource.dispose(); this.dataSource = null; - $rootScope.$emit('refresh'); } + $rootScope.$emit('refresh'); if (!dataSource) { - return; + d.resolve(); + return d.promise; } this.dataSource = dataSource; + var ps = []; + + // Add breakpoints. var breakpointList = []; for (var key in this.breakpoints) { breakpointList.push(this.breakpoints[key]); } - this.dataSource.addBreakpoints(breakpointList); + ps.push(this.dataSource.addBreakpoints(breakpointList)); + + $q.all(ps).then((function() { + this.dataSource.makeReady().then(function() { + d.resolve(); + }, function(e) { + log.error('Error making target ready: ' + e); + d.reject(e); + }); + }).bind(this), (function(e) { + log.error('Errors preparing target: ' + e); + this.disconnect(); + d.reject(e); + }).bind(this)); + + return d.promise; }; Session.prototype.addBreakpoint = function(breakpoint) { diff --git a/src/xenia/cpu/processor.cc b/src/xenia/cpu/processor.cc index e4da4a76d..a9dc25d8e 100644 --- a/src/xenia/cpu/processor.cc +++ b/src/xenia/cpu/processor.cc @@ -279,6 +279,14 @@ json_t* Processor::OnDebugRequest( delete fn; return fn_json; + } else if (xestrcmpa(command, "add_breakpoints") == 0) { + // breakpoints: [] + return json_null(); + } else if (xestrcmpa(command, "remove_breakpoints") == 0) { + // breakpointIds: ['id'] + return json_null(); + } else if (xestrcmpa(command, "remove_all_breakpoints") == 0) { + return json_null(); } else { succeeded = false; return json_string("Unknown command"); diff --git a/src/xenia/debug/protocols/ws/ws_client.cc b/src/xenia/debug/protocols/ws/ws_client.cc index e00261daf..fd0d7c5af 100644 --- a/src/xenia/debug/protocols/ws/ws_client.cc +++ b/src/xenia/debug/protocols/ws/ws_client.cc @@ -36,9 +36,9 @@ using namespace xe::kernel::xboxkrnl; WSClient::WSClient(DebugServer* debug_server, socket_t socket_id) : - DebugClient(debug_server), thread_(NULL), - socket_id_(socket_id) { + socket_id_(socket_id), + DebugClient(debug_server) { mutex_ = xe_mutex_alloc(1000); loop_ = xe_socket_loop_create(socket_id); @@ -322,8 +322,6 @@ void WSClient::EventThread() { return; } - MakeReady(); - // Prep callbacks. struct wslay_event_callbacks callbacks = { (wslay_event_recv_callback)WSClientRecvCallback, @@ -505,6 +503,18 @@ json_t* WSClient::HandleMessage(const char* command, json_t* request, command, dot - command); const char* sub_command = command + (dot - command + 1); + // Check debugger meta commands. + if (xestrcmpa(target_name, "debug") == 0) { + succeeded = true; + if (xestrcmpa(sub_command, "make_ready") == 0) { + MakeReady(); + return json_true(); + } else { + succeeded = false; + return json_string("Unknown command"); + } + } + // Lookup target. DebugTarget* target = debug_server_->GetTarget(target_name); if (!target) {