Exemplo n.º 1
0
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)
Exemplo n.º 2
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')
Exemplo n.º 3
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')
Exemplo n.º 4
0
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)
Exemplo n.º 5
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