diff options
Diffstat (limited to 'utils/lui/lui.py')
| -rwxr-xr-x | utils/lui/lui.py | 135 | 
1 files changed, 135 insertions, 0 deletions
| diff --git a/utils/lui/lui.py b/utils/lui/lui.py new file mode 100755 index 000000000000..31b152c77f0d --- /dev/null +++ b/utils/lui/lui.py @@ -0,0 +1,135 @@ +#!/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() | 
