import lldb import time class StopHook: # These dictionaries are used to pass data back to the test case. # Since these are global, we need to know which test run is which. # The test passes a key in the extra_args, we use that as the key # for these dictionaries, and then the test can fetch out the right # one. counter = {} non_stops = {} def __init__(self, target, extra_args, dict): self.target = target self.regs = {} self.instance = extra_args.GetValueForKey("instance").GetStringValue(100) StopHook.counter[self.instance] = 0 StopHook.non_stops[self.instance] = 0 def handle_stop(self, exe_ctx, stream): import time # All this stop hook does is sleep a bit and count. There was a bug # where we were sending the secondary listener events when the # private state thread's DoOnRemoval completed, rather than when # the primary public process Listener consumes the event. That # became really clear when a stop hook artificially delayed the # delivery of the primary listener's event - since IT had to come # after the stop hook ran. time.sleep(0.5) StopHook.counter[self.instance] += 1 # When we were sending events too early, one symptom was the stop # event would get triggered before the state had been changed. # Watch for that here. if exe_ctx.process.GetState() != lldb.eStateStopped: StopHook.non_stops[self.instance] += 1