| 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__) |