diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2016-01-06 20:12:03 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2016-01-06 20:12:03 +0000 |
commit | 9e6d35490a6542f9c97607f93c2ef8ca8e03cbcc (patch) | |
tree | dd2a1ddf0476664c2b823409c36cbccd52662ca7 /utils/lui/debuggerdriver.py | |
parent | 3bd2e91faeb9eeec1aae82c64a3253afff551cfd (diff) | |
download | src-503acc3a0a1fd9a610f1a126b8608cb84b185170.tar.gz src-503acc3a0a1fd9a610f1a126b8608cb84b185170.zip |
Vendor import of lldb trunk r256945:vendor/lldb/lldb-trunk-r256945
Diffstat (limited to 'utils/lui/debuggerdriver.py')
-rw-r--r-- | utils/lui/debuggerdriver.py | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/utils/lui/debuggerdriver.py b/utils/lui/debuggerdriver.py new file mode 100644 index 000000000000..f7b885107cc6 --- /dev/null +++ b/utils/lui/debuggerdriver.py @@ -0,0 +1,138 @@ +##===-- debuggerdriver.py ------------------------------------*- Python -*-===## +## +## The LLVM Compiler Infrastructure +## +## This file is distributed under the University of Illinois Open Source +## License. See LICENSE.TXT for details. +## +##===----------------------------------------------------------------------===## + + +import lldb +import lldbutil +import sys +from threading import Thread + +class DebuggerDriver(Thread): + """ Drives the debugger and responds to events. """ + def __init__(self, debugger, event_queue): + Thread.__init__(self) + self.event_queue = event_queue + # This is probably not great because it does not give liblldb a chance to clean up + self.daemon = True + self.initialize(debugger) + + def initialize(self, debugger): + self.done = False + self.debugger = debugger + self.listener = debugger.GetListener() + if not self.listener.IsValid(): + raise "Invalid listener" + + self.listener.StartListeningForEventClass(self.debugger, + lldb.SBTarget.GetBroadcasterClassName(), + lldb.SBTarget.eBroadcastBitBreakpointChanged + #| lldb.SBTarget.eBroadcastBitModuleLoaded + #| lldb.SBTarget.eBroadcastBitModuleUnloaded + | lldb.SBTarget.eBroadcastBitWatchpointChanged + #| lldb.SBTarget.eBroadcastBitSymbolLoaded + ) + + self.listener.StartListeningForEventClass(self.debugger, + lldb.SBThread.GetBroadcasterClassName(), + lldb.SBThread.eBroadcastBitStackChanged + # lldb.SBThread.eBroadcastBitBreakpointChanged + | lldb.SBThread.eBroadcastBitThreadSuspended + | lldb.SBThread.eBroadcastBitThreadResumed + | lldb.SBThread.eBroadcastBitSelectedFrameChanged + | lldb.SBThread.eBroadcastBitThreadSelected + ) + + self.listener.StartListeningForEventClass(self.debugger, + lldb.SBProcess.GetBroadcasterClassName(), + lldb.SBProcess.eBroadcastBitStateChanged + | lldb.SBProcess.eBroadcastBitInterrupt + | lldb.SBProcess.eBroadcastBitSTDOUT + | lldb.SBProcess.eBroadcastBitSTDERR + | lldb.SBProcess.eBroadcastBitProfileData + ) + self.listener.StartListeningForEventClass(self.debugger, + lldb.SBCommandInterpreter.GetBroadcasterClass(), + lldb.SBCommandInterpreter.eBroadcastBitThreadShouldExit + | lldb.SBCommandInterpreter.eBroadcastBitResetPrompt + | lldb.SBCommandInterpreter.eBroadcastBitQuitCommandReceived + | lldb.SBCommandInterpreter.eBroadcastBitAsynchronousOutputData + | lldb.SBCommandInterpreter.eBroadcastBitAsynchronousErrorData + ) + def createTarget(self, target_image, args=None): + self.handleCommand("target create %s" % target_image) + if args is not None: + self.handleCommand("settings set target.run-args %s" % args) + + def attachProcess(self, pid): + self.handleCommand("process attach -p %d" % pid) + pass + + def loadCore(self, corefile): + self.handleCommand("target create -c %s" % corefile) + pass + + def setDone(self): + self.done = True + + def isDone(self): + return self.done + + def getPrompt(self): + return self.debugger.GetPrompt() + + def getCommandInterpreter(self): + return self.debugger.GetCommandInterpreter() + + def getSourceManager(self): + return self.debugger.GetSourceManager() + + def setSize(self, width, height): + # FIXME: respect height + self.debugger.SetTerminalWidth(width) + + def getTarget(self): + return self.debugger.GetTargetAtIndex(0) + + def handleCommand(self, cmd): + ret = lldb.SBCommandReturnObject() + self.getCommandInterpreter().HandleCommand(cmd, ret) + return ret + + def eventLoop(self): + while not self.isDone(): + event = lldb.SBEvent() + got_event = self.listener.WaitForEvent(lldb.UINT32_MAX, event) + if got_event and not event.IsValid(): + self.winAddStr("Warning: Invalid or no event...") + continue + elif not event.GetBroadcaster().IsValid(): + continue + + self.event_queue.put(event) + + def run(self): + self.eventLoop() + + def terminate(self): + lldb.SBDebugger.Terminate() + sys.exit(0) + +def createDriver(debugger, event_queue): + driver = DebuggerDriver(debugger, event_queue) + #driver.start() + # if pid specified: + # - attach to pid + # else if core file specified + # - create target from corefile + # else + # - create target from file + # - settings append target.run-args <args-from-cmdline> + # source .lldbinit file + + return driver |