]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - utils/lui/lui.py
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / utils / lui / lui.py
1 #!/usr/bin/env python
2 ##===-- lui.py -----------------------------------------------*- Python -*-===##
3 ##
4 # The LLVM Compiler Infrastructure
5 ##
6 # This file is distributed under the University of Illinois Open Source
7 # License. See LICENSE.TXT for details.
8 ##
9 ##===----------------------------------------------------------------------===##
10
11
12 import curses
13
14 import lldb
15 import lldbutil
16
17 from optparse import OptionParser
18 import os
19 import signal
20 import sys
21
22 import Queue
23
24 import debuggerdriver
25 import cui
26
27 import breakwin
28 import commandwin
29 import eventwin
30 import sourcewin
31 import statuswin
32
33 event_queue = None
34
35
36 def handle_args(driver, argv):
37     parser = OptionParser()
38     parser.add_option(
39         "-p",
40         "--attach",
41         dest="pid",
42         help="Attach to specified Process ID",
43         type="int")
44     parser.add_option(
45         "-c",
46         "--core",
47         dest="core",
48         help="Load specified core file",
49         type="string")
50
51     (options, args) = parser.parse_args(argv)
52
53     if options.pid is not None:
54         try:
55             pid = int(options.pid)
56             driver.attachProcess(ui, pid)
57         except ValueError:
58             print "Error: expecting integer PID, got '%s'" % options.pid
59     elif options.core is not None:
60         if not os.path.exists(options.core):
61             raise Exception(
62                 "Specified core file '%s' does not exist." %
63                 options.core)
64         driver.loadCore(options.core)
65     elif len(args) == 2:
66         if not os.path.isfile(args[1]):
67             raise Exception("Specified target '%s' does not exist" % args[1])
68         driver.createTarget(args[1])
69     elif len(args) > 2:
70         if not os.path.isfile(args[1]):
71             raise Exception("Specified target '%s' does not exist" % args[1])
72         driver.createTarget(args[1], args[2:])
73
74
75 def sigint_handler(signal, frame):
76     global debugger
77     debugger.terminate()
78
79
80 class LLDBUI(cui.CursesUI):
81
82     def __init__(self, screen, event_queue, driver):
83         super(LLDBUI, self).__init__(screen, event_queue)
84
85         self.driver = driver
86
87         h, w = self.screen.getmaxyx()
88
89         command_win_height = 20
90         break_win_width = 60
91
92         self.status_win = statuswin.StatusWin(0, h - 1, w, 1)
93         h -= 1
94         self.command_win = commandwin.CommandWin(
95             driver, 0, h - command_win_height, w, command_win_height)
96         h -= command_win_height
97         self.source_win = sourcewin.SourceWin(driver, 0, 0,
98                                               w - break_win_width - 1, h)
99         self.break_win = breakwin.BreakWin(driver, w - break_win_width, 0,
100                                            break_win_width, h)
101
102         self.wins = [self.status_win,
103                      # self.event_win,
104                      self.source_win,
105                      self.break_win,
106                      self.command_win,
107                      ]
108
109         self.focus = len(self.wins) - 1  # index of command window;
110
111     def handleEvent(self, event):
112         # hack
113         if isinstance(event, int):
114             if event == curses.KEY_F10:
115                 self.driver.terminate()
116             if event == 20:  # ctrl-T
117                 def foo(cmd):
118                     ret = lldb.SBCommandReturnObject()
119                     self.driver.getCommandInterpreter().HandleCommand(cmd, ret)
120                 foo('target create a.out')
121                 foo('b main')
122                 foo('run')
123         super(LLDBUI, self).handleEvent(event)
124
125
126 def main(screen):
127     signal.signal(signal.SIGINT, sigint_handler)
128
129     global event_queue
130     event_queue = Queue.Queue()
131
132     global debugger
133     debugger = lldb.SBDebugger.Create()
134
135     driver = debuggerdriver.createDriver(debugger, event_queue)
136     view = LLDBUI(screen, event_queue, driver)
137
138     driver.start()
139
140     # hack to avoid hanging waiting for prompts!
141     driver.handleCommand("settings set auto-confirm true")
142
143     handle_args(driver, sys.argv)
144     view.eventLoop()
145
146 if __name__ == "__main__":
147     try:
148         curses.wrapper(main)
149     except KeyboardInterrupt:
150         exit()