145 lines · python
1#!/usr/bin/env python2##===-- lui.py -----------------------------------------------*- Python -*-===##3##4# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5# See https://llvm.org/LICENSE.txt for license information.6# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7##8##===----------------------------------------------------------------------===##9 10 11import curses12 13import lldb14import lldbutil15 16from optparse import OptionParser17import os18import signal19import sys20import queue21 22import debuggerdriver23import cui24 25import breakwin26import commandwin27import eventwin28import sourcewin29import statuswin30 31event_queue = None32 33 34def handle_args(driver, argv):35 parser = OptionParser()36 parser.add_option(37 "-p", "--attach", dest="pid", help="Attach to specified Process ID", type="int"38 )39 parser.add_option(40 "-c", "--core", dest="core", help="Load specified core file", type="string"41 )42 43 (options, args) = parser.parse_args(argv)44 45 if options.pid is not None:46 try:47 pid = int(options.pid)48 driver.attachProcess(ui, pid)49 except ValueError:50 print("Error: expecting integer PID, got '%s'" % options.pid)51 elif options.core is not None:52 if not os.path.exists(options.core):53 raise Exception("Specified core file '%s' does not exist." % options.core)54 driver.loadCore(options.core)55 elif len(args) == 2:56 if not os.path.isfile(args[1]):57 raise Exception("Specified target '%s' does not exist" % args[1])58 driver.createTarget(args[1])59 elif len(args) > 2:60 if not os.path.isfile(args[1]):61 raise Exception("Specified target '%s' does not exist" % args[1])62 driver.createTarget(args[1], args[2:])63 64 65def sigint_handler(signal, frame):66 global debugger67 debugger.terminate()68 69 70class LLDBUI(cui.CursesUI):71 def __init__(self, screen, event_queue, driver):72 super(LLDBUI, self).__init__(screen, event_queue)73 74 self.driver = driver75 76 h, w = self.screen.getmaxyx()77 78 command_win_height = 2079 break_win_width = 6080 81 self.status_win = statuswin.StatusWin(0, h - 1, w, 1)82 h -= 183 self.command_win = commandwin.CommandWin(84 driver, 0, h - command_win_height, w, command_win_height85 )86 h -= command_win_height87 self.source_win = sourcewin.SourceWin(driver, 0, 0, w - break_win_width - 1, h)88 self.break_win = breakwin.BreakWin(89 driver, w - break_win_width, 0, break_win_width, h90 )91 92 self.wins = [93 self.status_win,94 # self.event_win,95 self.source_win,96 self.break_win,97 self.command_win,98 ]99 100 self.focus = len(self.wins) - 1 # index of command window;101 102 def handleEvent(self, event):103 # hack104 if isinstance(event, int):105 if event == curses.KEY_F10:106 self.driver.terminate()107 if event == 20: # ctrl-T108 109 def foo(cmd):110 ret = lldb.SBCommandReturnObject()111 self.driver.getCommandInterpreter().HandleCommand(cmd, ret)112 113 foo("target create a.out")114 foo("b main")115 foo("run")116 super(LLDBUI, self).handleEvent(event)117 118 119def main(screen):120 signal.signal(signal.SIGINT, sigint_handler)121 122 global event_queue123 event_queue = queue.Queue()124 125 global debugger126 debugger = lldb.SBDebugger.Create()127 128 driver = debuggerdriver.createDriver(debugger, event_queue)129 view = LLDBUI(screen, event_queue, driver)130 131 driver.start()132 133 # hack to avoid hanging waiting for prompts!134 driver.handleCommand("settings set auto-confirm true")135 136 handle_args(driver, sys.argv)137 view.eventLoop()138 139 140if __name__ == "__main__":141 try:142 curses.wrapper(main)143 except KeyboardInterrupt:144 exit()145