136 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/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()
 |