]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - utils/lui/debuggerdriver.py
Vendor import of lldb trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / utils / lui / debuggerdriver.py
1 ##===-- debuggerdriver.py ------------------------------------*- Python -*-===##
2 ##
3 # The LLVM Compiler Infrastructure
4 ##
5 # This file is distributed under the University of Illinois Open Source
6 # License. See LICENSE.TXT for details.
7 ##
8 ##===----------------------------------------------------------------------===##
9
10
11 import lldb
12 import lldbutil
13 import sys
14 from threading import Thread
15
16
17 class DebuggerDriver(Thread):
18     """ Drives the debugger and responds to events. """
19
20     def __init__(self, debugger, event_queue):
21         Thread.__init__(self)
22         self.event_queue = event_queue
23         # This is probably not great because it does not give liblldb a chance
24         # to clean up
25         self.daemon = True
26         self.initialize(debugger)
27
28     def initialize(self, debugger):
29         self.done = False
30         self.debugger = debugger
31         self.listener = debugger.GetListener()
32         if not self.listener.IsValid():
33             raise "Invalid listener"
34
35         self.listener.StartListeningForEventClass(self.debugger,
36                                                   lldb.SBTarget.GetBroadcasterClassName(),
37                                                   lldb.SBTarget.eBroadcastBitBreakpointChanged
38                                                   #| lldb.SBTarget.eBroadcastBitModuleLoaded
39                                                   #| lldb.SBTarget.eBroadcastBitModuleUnloaded
40                                                   | lldb.SBTarget.eBroadcastBitWatchpointChanged
41                                                   #| lldb.SBTarget.eBroadcastBitSymbolLoaded
42                                                   )
43
44         self.listener.StartListeningForEventClass(self.debugger,
45                                                   lldb.SBThread.GetBroadcasterClassName(),
46                                                   lldb.SBThread.eBroadcastBitStackChanged
47                                                   #  lldb.SBThread.eBroadcastBitBreakpointChanged
48                                                   | lldb.SBThread.eBroadcastBitThreadSuspended
49                                                   | lldb.SBThread.eBroadcastBitThreadResumed
50                                                   | lldb.SBThread.eBroadcastBitSelectedFrameChanged
51                                                   | lldb.SBThread.eBroadcastBitThreadSelected
52                                                   )
53
54         self.listener.StartListeningForEventClass(self.debugger,
55                                                   lldb.SBProcess.GetBroadcasterClassName(),
56                                                   lldb.SBProcess.eBroadcastBitStateChanged
57                                                   | lldb.SBProcess.eBroadcastBitInterrupt
58                                                   | lldb.SBProcess.eBroadcastBitSTDOUT
59                                                   | lldb.SBProcess.eBroadcastBitSTDERR
60                                                   | lldb.SBProcess.eBroadcastBitProfileData
61                                                   )
62         self.listener.StartListeningForEventClass(self.debugger,
63                                                   lldb.SBCommandInterpreter.GetBroadcasterClass(),
64                                                   lldb.SBCommandInterpreter.eBroadcastBitThreadShouldExit
65                                                   | lldb.SBCommandInterpreter.eBroadcastBitResetPrompt
66                                                   | lldb.SBCommandInterpreter.eBroadcastBitQuitCommandReceived
67                                                   | lldb.SBCommandInterpreter.eBroadcastBitAsynchronousOutputData
68                                                   | lldb.SBCommandInterpreter.eBroadcastBitAsynchronousErrorData
69                                                   )
70
71     def createTarget(self, target_image, args=None):
72         self.handleCommand("target create %s" % target_image)
73         if args is not None:
74             self.handleCommand("settings set target.run-args %s" % args)
75
76     def attachProcess(self, pid):
77         self.handleCommand("process attach -p %d" % pid)
78         pass
79
80     def loadCore(self, corefile):
81         self.handleCommand("target create -c %s" % corefile)
82         pass
83
84     def setDone(self):
85         self.done = True
86
87     def isDone(self):
88         return self.done
89
90     def getPrompt(self):
91         return self.debugger.GetPrompt()
92
93     def getCommandInterpreter(self):
94         return self.debugger.GetCommandInterpreter()
95
96     def getSourceManager(self):
97         return self.debugger.GetSourceManager()
98
99     def setSize(self, width, height):
100         # FIXME: respect height
101         self.debugger.SetTerminalWidth(width)
102
103     def getTarget(self):
104         return self.debugger.GetTargetAtIndex(0)
105
106     def handleCommand(self, cmd):
107         ret = lldb.SBCommandReturnObject()
108         self.getCommandInterpreter().HandleCommand(cmd, ret)
109         return ret
110
111     def eventLoop(self):
112         while not self.isDone():
113             event = lldb.SBEvent()
114             got_event = self.listener.WaitForEvent(lldb.UINT32_MAX, event)
115             if got_event and not event.IsValid():
116                 self.winAddStr("Warning: Invalid or no event...")
117                 continue
118             elif not event.GetBroadcaster().IsValid():
119                 continue
120
121             self.event_queue.put(event)
122
123     def run(self):
124         self.eventLoop()
125
126     def terminate(self):
127         lldb.SBDebugger.Terminate()
128         sys.exit(0)
129
130
131 def createDriver(debugger, event_queue):
132     driver = DebuggerDriver(debugger, event_queue)
133     # driver.start()
134     # if pid specified:
135     # - attach to pid
136     # else if core file specified
137     # - create target from corefile
138     # else
139     # - create target from file
140     # - settings append target.run-args <args-from-cmdline>
141     # source .lldbinit file
142
143     return driver