summaryrefslogtreecommitdiff
path: root/utils/lui/lui.py
diff options
context:
space:
mode:
Diffstat (limited to 'utils/lui/lui.py')
-rwxr-xr-xutils/lui/lui.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/utils/lui/lui.py b/utils/lui/lui.py
new file mode 100755
index 0000000000000..31b152c77f0dc
--- /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()