llvm-project/lldb/utils/lui/lui.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

153 lines
4.1 KiB
Python
Raw Normal View History

#!/usr/bin/env python
##===-- lui.py -----------------------------------------------*- Python -*-===##
##
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
##
##===----------------------------------------------------------------------===##
import curses
import lldb
import lldbutil
from optparse import OptionParser
import os
import signal
import sys
try:
import queue
except ImportError:
import Queue as 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()