1 ##===-- debuggerdriver.py ------------------------------------*- Python -*-===##
3 # The LLVM Compiler Infrastructure
5 # This file is distributed under the University of Illinois Open Source
6 # License. See LICENSE.TXT for details.
8 ##===----------------------------------------------------------------------===##
14 from threading import Thread
17 class DebuggerDriver(Thread):
18 """ Drives the debugger and responds to events. """
20 def __init__(self, debugger, event_queue):
22 self.event_queue = event_queue
23 # This is probably not great because it does not give liblldb a chance
26 self.initialize(debugger)
28 def initialize(self, debugger):
30 self.debugger = debugger
31 self.listener = debugger.GetListener()
32 if not self.listener.IsValid():
33 raise "Invalid listener"
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
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
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
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
71 def createTarget(self, target_image, args=None):
72 self.handleCommand("target create %s" % target_image)
74 self.handleCommand("settings set target.run-args %s" % args)
76 def attachProcess(self, pid):
77 self.handleCommand("process attach -p %d" % pid)
80 def loadCore(self, corefile):
81 self.handleCommand("target create -c %s" % corefile)
91 return self.debugger.GetPrompt()
93 def getCommandInterpreter(self):
94 return self.debugger.GetCommandInterpreter()
96 def getSourceManager(self):
97 return self.debugger.GetSourceManager()
99 def setSize(self, width, height):
100 # FIXME: respect height
101 self.debugger.SetTerminalWidth(width)
104 return self.debugger.GetTargetAtIndex(0)
106 def handleCommand(self, cmd):
107 ret = lldb.SBCommandReturnObject()
108 self.getCommandInterpreter().HandleCommand(cmd, ret)
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...")
118 elif not event.GetBroadcaster().IsValid():
121 self.event_queue.put(event)
127 lldb.SBDebugger.Terminate()
131 def createDriver(debugger, event_queue):
132 driver = DebuggerDriver(debugger, event_queue)
136 # else if core file specified
137 # - create target from corefile
139 # - create target from file
140 # - settings append target.run-args <args-from-cmdline>
141 # source .lldbinit file