import lldb from lldb.plugins.parsed_cmd import ParsedCommand import time class EnableThemLater(ParsedCommand): program = "delayed_enable" def __init__(self, debugger: lldb.SBDebugger, internal_dict): super().__init__(debugger, internal_dict) def setup_command_definition(self): ov_parser = self.get_parser() ov_parser.add_argument_set( [ ov_parser.make_argument_element( lldb.eArgTypeUnsignedInteger, repeat="plain", groups=None ) ] ) def __call__(self, debugger, args_array, exe_ctx, result): target = exe_ctx.target breakpoints = [] for breakpoint in target.breakpoints: if breakpoint.enabled: breakpoints.append(breakpoint) breakpoint.SetEnabled(False) interval = 5 process = exe_ctx.process # If the process is running we don't need to do anything, lldb # will auto-pause/continue around disabling the breakpoints, # but if we're stopped we want to continue. if process.IsValid() and process.state == lldb.eStateStopped: old_async = self.debugger.GetAsync() self.debugger.SetAsync(True) process.Continue() self.debugger.SetAsync(old_async) # num_args can only be 0 or 1 due to the command definition. num_args = args_array.GetSize() if num_args == 1: interval = args_array.GetItemAtIndex(0).GetUnsignedIntegerValue(5) time.sleep(interval) for breakpoint in breakpoints: breakpoint.SetEnabled(True) def get_short_help(self): return "Disable all enabled breakpoints, sleep and re-enable" def get_long_help(self): return ( "Disable all enabled breakpoints in the target passed to the " "command; sleep for 5 seconds - or the interval passed as the " "argument command; then reenable them. " "\nThis is useful when you need to set up a situation in a GUI app w/o " "hitting breakpoints, and then start hitting them again w/o disturbing " "the GUI state. For instance, if you want to hit a breakpoint " "while testing a drag and drop action, you can't interact with " "the debugger once you've started the drag so you need a delayed " "enable." ) def __lldb_init_module(debugger, internal_dict): ParsedCommand.do_register_cmd(EnableThemLater, debugger, __name__)