def __init__(self, vimx): """ Creates the LLDB SBDebugger object and more! """ import logging self.logger = logging.getLogger(__name__) self.logger.setLevel(logging.INFO) self._sink = open('/dev/null') self._dbg = lldb.SBDebugger.Create() self._dbg.SetOutputFileHandle(self._sink, False) self._ipreter = self._dbg.GetCommandInterpreter() self._rcx = lldb.SBListener("the_ear") # receiver self._trx = lldb.SBBroadcaster("the_mouth") # transmitter for user events self._trx.AddListener(self._rcx, self.CTRL_VOICE) self._target = None self._process = None self._num_bps = 0 self.in_queue = Queue(maxsize=2) self.out_queue = Queue(maxsize=1) self.vimx = vimx self.busy_stack = 0 # when > 0, buffers are not updated self.buffers = VimBuffers(vimx) self.session = Session(self, vimx) super(Controller, self).__init__() # start the thread
def fuzz_obj(obj): obj.AddEvent(lldb.SBEvent()) obj.StartListeningForEvents(lldb.SBBroadcaster(), 0xffffffff) obj.StopListeningForEvents(lldb.SBBroadcaster(), 0xffffffff) event = lldb.SBEvent() broadcaster = lldb.SBBroadcaster() obj.WaitForEvent(5, event) obj.WaitForEventForBroadcaster(5, broadcaster, event) obj.WaitForEventForBroadcasterWithType(5, broadcaster, 0xffffffff, event) obj.PeekAtNextEvent(event) obj.PeekAtNextEventForBroadcaster(broadcaster, event) obj.PeekAtNextEventForBroadcasterWithType(broadcaster, 0xffffffff, event) obj.GetNextEvent(event) obj.GetNextEventForBroadcaster(broadcaster, event) obj.GetNextEventForBroadcasterWithType(broadcaster, 0xffffffff, event) obj.HandleBroadcastEvent(event)
def test_SBBroadcaster(self): obj = lldb.SBBroadcaster() if self.TraceOn(): print obj self.assertFalse(obj) # Do fuzz testing on the invalid obj, it should not crash lldb. import sb_broadcaster sb_broadcaster.fuzz_obj(obj)
def test_dwarf_symbol_loading_progress_report(self): """Test that we are able to fetch dwarf symbol loading progress events""" self.build() test_broadcaster = lldb.SBBroadcaster('lldb.broadcaster.test') listener_thread = threading.Thread(target=self.fetch_events, args=[test_broadcaster]) listener_thread.start() lldbutil.run_to_source_breakpoint(self, 'break here', lldb.SBFileSpec('main.c')) test_broadcaster.BroadcastEventByType( self.eBroadcastBitStopProgressThread) listener_thread.join() self.assertTrue(len(self.progress_events) > 0)
def test_dwarf_symbol_loading_progress_report(self): """Test that we are able to fetch dwarf symbol loading progress events""" self.build() self.listener = lldb.SBListener("lldb.progress.listener") self.test_broadcaster = lldb.SBBroadcaster('lldb.broadcaster.test') self.listener.StartListeningForEvents(self.test_broadcaster, self.eBroadcastBitStopProgressThread) self.progress_broadcaster = self.dbg.GetBroadcaster() self.progress_broadcaster.AddListener(self.listener, lldb.SBDebugger.eBroadcastBitProgress) listener_thread = threading.Thread(target=self.fetch_events) listener_thread.start() lldbutil.run_to_source_breakpoint(self, 'break here', lldb.SBFileSpec('main.c')) self.test_broadcaster.BroadcastEventByType(self.eBroadcastBitStopProgressThread) listener_thread.join() self.assertGreater(len(self.progress_events), 0)
def test_dwarf_symbol_loading_diagnostic_report(self): """Test that we are able to fetch diagnostic events""" self.listener = lldb.SBListener("lldb.diagnostic.listener") self.test_broadcaster = lldb.SBBroadcaster('lldb.broadcaster.test') self.listener.StartListeningForEvents( self.test_broadcaster, self.eBroadcastBitStopDiagnosticThread) self.diagnostic_broadcaster = self.dbg.GetBroadcaster() self.diagnostic_broadcaster.AddListener( self.listener, lldb.SBDebugger.eBroadcastBitWarning) self.diagnostic_broadcaster.AddListener( self.listener, lldb.SBDebugger.eBroadcastBitError) listener_thread = threading.Thread(target=self.fetch_events) listener_thread.start() self.yaml2obj("minidump.yaml", self.getBuildArtifact("minidump.core")) self.dbg.CreateTarget(None) self.target = self.dbg.GetSelectedTarget() self.process = self.target.LoadCore( self.getBuildArtifact("minidump.core")) self.test_broadcaster.BroadcastEventByType( self.eBroadcastBitStopDiagnosticThread) listener_thread.join() self.assertEquals(len(self.diagnostic_events), 1) diagnostic_event = self.diagnostic_events[0] self.assertEquals( diagnostic_event.GetValueForKey("type").GetStringValue(100), "warning") self.assertEquals( diagnostic_event.GetValueForKey("message").GetStringValue(100), "unable to retrieve process ID from minidump file, setting process ID to 1" )