brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 27ed8f3 Raw
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