|  | #!/usr/bin/env python | 
|  | ##===-- lui.py -----------------------------------------------*- Python -*-===## | 
|  | ## | 
|  | # The LLVM Compiler Infrastructure | 
|  | ## | 
|  | # This file is distributed under the University of Illinois Open Source | 
|  | # License. See LICENSE.TXT for details. | 
|  | ## | 
|  | ##===----------------------------------------------------------------------===## | 
|  |  | 
|  |  | 
|  | import curses | 
|  |  | 
|  | import lldb | 
|  | import lldbutil | 
|  |  | 
|  | from optparse import OptionParser | 
|  | import os | 
|  | import signal | 
|  | import sys | 
|  |  | 
|  | import Queue | 
|  |  | 
|  | import debuggerdriver | 
|  | import cui | 
|  |  | 
|  | import breakwin | 
|  | import commandwin | 
|  | import eventwin | 
|  | import sourcewin | 
|  | import statuswin | 
|  |  | 
|  | event_queue = None | 
|  |  | 
|  |  | 
|  | def handle_args(driver, argv): | 
|  | parser = OptionParser() | 
|  | parser.add_option( | 
|  | "-p", | 
|  | "--attach", | 
|  | dest="pid", | 
|  | help="Attach to specified Process ID", | 
|  | type="int") | 
|  | parser.add_option( | 
|  | "-c", | 
|  | "--core", | 
|  | dest="core", | 
|  | help="Load specified core file", | 
|  | type="string") | 
|  |  | 
|  | (options, args) = parser.parse_args(argv) | 
|  |  | 
|  | if options.pid is not None: | 
|  | try: | 
|  | pid = int(options.pid) | 
|  | driver.attachProcess(ui, pid) | 
|  | except ValueError: | 
|  | print "Error: expecting integer PID, got '%s'" % options.pid | 
|  | elif options.core is not None: | 
|  | if not os.path.exists(options.core): | 
|  | raise Exception( | 
|  | "Specified core file '%s' does not exist." % | 
|  | options.core) | 
|  | driver.loadCore(options.core) | 
|  | elif len(args) == 2: | 
|  | if not os.path.isfile(args[1]): | 
|  | raise Exception("Specified target '%s' does not exist" % args[1]) | 
|  | driver.createTarget(args[1]) | 
|  | elif len(args) > 2: | 
|  | if not os.path.isfile(args[1]): | 
|  | raise Exception("Specified target '%s' does not exist" % args[1]) | 
|  | driver.createTarget(args[1], args[2:]) | 
|  |  | 
|  |  | 
|  | def sigint_handler(signal, frame): | 
|  | global debugger | 
|  | debugger.terminate() | 
|  |  | 
|  |  | 
|  | class LLDBUI(cui.CursesUI): | 
|  |  | 
|  | def __init__(self, screen, event_queue, driver): | 
|  | super(LLDBUI, self).__init__(screen, event_queue) | 
|  |  | 
|  | self.driver = driver | 
|  |  | 
|  | h, w = self.screen.getmaxyx() | 
|  |  | 
|  | command_win_height = 20 | 
|  | break_win_width = 60 | 
|  |  | 
|  | self.status_win = statuswin.StatusWin(0, h - 1, w, 1) | 
|  | h -= 1 | 
|  | self.command_win = commandwin.CommandWin( | 
|  | driver, 0, h - command_win_height, w, command_win_height) | 
|  | h -= command_win_height | 
|  | self.source_win = sourcewin.SourceWin(driver, 0, 0, | 
|  | w - break_win_width - 1, h) | 
|  | self.break_win = breakwin.BreakWin(driver, w - break_win_width, 0, | 
|  | break_win_width, h) | 
|  |  | 
|  | self.wins = [self.status_win, | 
|  | # self.event_win, | 
|  | self.source_win, | 
|  | self.break_win, | 
|  | self.command_win, | 
|  | ] | 
|  |  | 
|  | self.focus = len(self.wins) - 1  # index of command window; | 
|  |  | 
|  | def handleEvent(self, event): | 
|  | # hack | 
|  | if isinstance(event, int): | 
|  | if event == curses.KEY_F10: | 
|  | self.driver.terminate() | 
|  | if event == 20:  # ctrl-T | 
|  | def foo(cmd): | 
|  | ret = lldb.SBCommandReturnObject() | 
|  | self.driver.getCommandInterpreter().HandleCommand(cmd, ret) | 
|  | foo('target create a.out') | 
|  | foo('b main') | 
|  | foo('run') | 
|  | super(LLDBUI, self).handleEvent(event) | 
|  |  | 
|  |  | 
|  | def main(screen): | 
|  | signal.signal(signal.SIGINT, sigint_handler) | 
|  |  | 
|  | global event_queue | 
|  | event_queue = Queue.Queue() | 
|  |  | 
|  | global debugger | 
|  | debugger = lldb.SBDebugger.Create() | 
|  |  | 
|  | driver = debuggerdriver.createDriver(debugger, event_queue) | 
|  | view = LLDBUI(screen, event_queue, driver) | 
|  |  | 
|  | driver.start() | 
|  |  | 
|  | # hack to avoid hanging waiting for prompts! | 
|  | driver.handleCommand("settings set auto-confirm true") | 
|  |  | 
|  | handle_args(driver, sys.argv) | 
|  | view.eventLoop() | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | try: | 
|  | curses.wrapper(main) | 
|  | except KeyboardInterrupt: | 
|  | exit() |