def process_stopped(driver, process, state=None): ui_updater().process_stopped(state, lambda: driver.maybe_get_input()) # Open a new view on source code/disassembly, if needed. if process and driver.process_is_stopped(process): filespec = None line_entry = process.GetSelectedThread().GetSelectedFrame( ).GetLineEntry() if line_entry: # We don't need to run 'process status' like Driver.cpp # Since we open the file and show the source line. r = driver.interpret_command('thread list') lldb_view_send(stdout_msg(r[0].GetOutput())) lldb_view_send(stderr_msg(r[0].GetError())) r = driver.interpret_command('frame info') lldb_view_send(stdout_msg(r[0].GetOutput())) lldb_view_send(stderr_msg(r[0].GetError())) filespec = line_entry.GetFileSpec() else: # Give us some assembly to check the crash/stop r = driver.interpret_command('process status') lldb_view_send(stdout_msg(r[0].GetOutput())) lldb_view_send(stderr_msg(r[0].GetError())) if not line_entry: # Get ALL the SBFrames t = process.GetSelectedThread() n = t.GetNumFrames() for i in xrange(0, n): f = t.GetFrameAtIndex(i) if f: line_entry = f.GetLineEntry() if line_entry and line_entry.GetFileSpec(): filespec = line_entry.GetFileSpec() if filespec: filename = filespec.GetDirectory() + '/' + filespec.GetFilename() # Maybe we don't need to focus the first group. The user knows # what he/she wants. def to_ui_thread(): window_ref().focus_group(0) v = window_ref().open_file(filename) lldb_view = get_lldb_view_for(v) if lldb_view is None: lldb_view = LLDBCodeView(v, driver) # TODO: Maybe bring the view to the front? sublime.set_timeout(to_ui_thread, 0) else: # TODO: If we don't have a filespec, we can try to disassemble # around the thread's PC. sublime.set_timeout( lambda: window_ref(). run_command('lldb_disassemble_frame', {'thread': process.GetSelectedThread()}), 0)
def cleanup(cls, w=None): global _is_debugging _is_debugging = False set_disabled_bps([]) ui_updater().stop() driver = driver_instance() if driver: driver.stop() set_driver_instance(None) lldb_view_send('\nDebugging session ended.\n')
def process_stopped(driver, process, state=None): ui_updater().process_stopped(state, lambda: driver.maybe_get_input()) # Open a new view on source code/disassembly, if needed. if process and driver.process_is_stopped(process): filespec = None line_entry = process.GetSelectedThread().GetSelectedFrame().GetLineEntry() if line_entry: # We don't need to run 'process status' like Driver.cpp # Since we open the file and show the source line. r = driver.interpret_command('thread list') lldb_view_send(stdout_msg(r[0].GetOutput())) lldb_view_send(stderr_msg(r[0].GetError())) r = driver.interpret_command('frame info') lldb_view_send(stdout_msg(r[0].GetOutput())) lldb_view_send(stderr_msg(r[0].GetError())) filespec = line_entry.GetFileSpec() else: # Give us some assembly to check the crash/stop r = driver.interpret_command('process status') lldb_view_send(stdout_msg(r[0].GetOutput())) lldb_view_send(stderr_msg(r[0].GetError())) if not line_entry: # Get ALL the SBFrames t = process.GetSelectedThread() n = t.GetNumFrames() for i in xrange(0, n): f = t.GetFrameAtIndex(i) if f: line_entry = f.GetLineEntry() if line_entry and line_entry.GetFileSpec(): filespec = line_entry.GetFileSpec() if filespec: filename = filespec.GetDirectory() + '/' + filespec.GetFilename() # Maybe we don't need to focus the first group. The user knows # what he/she wants. def to_ui_thread(): window_ref().focus_group(0) v = window_ref().open_file(filename) lldb_view = get_lldb_view_for(v) if lldb_view is None: lldb_view = LLDBCodeView(v, driver) # TODO: Maybe bring the view to the front? sublime.set_timeout(to_ui_thread, 0) else: # TODO: If we don't have a filespec, we can try to disassemble # around the thread's PC. sublime.set_timeout(lambda: window_ref().run_command('lldb_disassemble_frame', {'thread': process.GetSelectedThread()}), 0)
def __handle_breakpoint_event(self, ev): type = lldb.SBBreakpoint.GetBreakpointEventTypeFromEvent(ev) # TODO: Remove duplicate code for adding/deleting BP if type & lldb.eBreakpointEventTypeCommandChanged \ or type & lldb.eBreakpointEventTypeIgnoreChanged \ or type & lldb.eBreakpointEventTypeConditionChanged \ or type & lldb.eBreakpointEventTypeLocationsResolved: None elif type & lldb.eBreakpointEventTypeAdded: # TODO: show disabled bps bp = lldb.SBBreakpoint.GetBreakpointFromEvent(ev) for loc in bp: entry = None if loc and loc.GetAddress(): line_entry = loc.GetAddress().GetLineEntry() if line_entry: filespec = line_entry.GetFileSpec() if filespec: entry = (filespec.GetDirectory() + '/' + filespec.GetFilename(), \ line_entry.GetLine()) else: return None if entry: ui_updater().breakpoint_added(entry[0], entry[1], loc.IsEnabled()) elif type & lldb.eBreakpointEventTypeEnabled \ or type & lldb.eBreakpointEventTypeDisabled: bp = lldb.SBBreakpoint.GetBreakpointFromEvent(ev) for loc in bp: entry = None if loc and loc.GetAddress(): line_entry = loc.GetAddress().GetLineEntry() if line_entry: filespec = line_entry.GetFileSpec() if filespec: entry = (filespec.GetDirectory() + '/' + filespec.GetFilename(), \ line_entry.GetLine()) else: return None if entry: ui_updater().breakpoint_changed(entry[0], entry[1], loc.IsEnabled()) elif type & lldb.eBreakpointEventTypeRemoved: bp = lldb.SBBreakpoint.GetBreakpointFromEvent(ev) for loc in bp: entry = None if loc and loc.GetAddress(): line_entry = loc.GetAddress().GetLineEntry() if line_entry: filespec = line_entry.GetFileSpec() if filespec: entry = (filespec.GetDirectory() + '/' + filespec.GetFilename(), \ line_entry.GetLine()) else: return None if entry: ui_updater().breakpoint_removed(entry[0], entry[1], loc.IsEnabled()) elif type & lldb.eBreakpointEventTypeLocationsAdded: new_locs = lldb.SBBreakpoint.GetNumBreakpointLocationsFromEvent(ev) if new_locs > 0: bp = lldb.SBBreakpoint.GetBreakpointFromEvent(ev) lldb_view_send("%d locations added to breakpoint %d\n" % (new_locs, bp.GetID())) elif type & lldb.eBreakpointEventTypeLocationsRemoved: None