def _run_debugger_custom(self): self.step_collection.debugger = self.debugger.debugger_info self._break_point_all_lines() self.debugger.launch() for command_obj in chain.from_iterable(self.step_collection.commands.values()): self.watches.update(command_obj.get_watches()) max_steps = self.context.options.max_steps for _ in range(max_steps): while self.debugger.is_running: pass if self.debugger.is_finished: break self.step_index += 1 step_info = self.debugger.get_step_info(self.watches, self.step_index) if step_info.current_frame: update_step_watches(step_info, self.watches, self.step_collection.commands) self.step_collection.new_step(self.context, step_info) if in_source_file(self.source_files, step_info): self.debugger.step() else: self.debugger.go() time.sleep(self.context.options.pause_between_steps) else: raise DebuggerException( 'maximum number of steps reached ({})'.format(max_steps))
def _run_debugger_custom(self, cmdline): # TODO: Add conditional and unconditional breakpoint support to dbgeng. if self.debugger.get_name() == 'dbgeng': raise DebuggerException('DexLimitSteps commands are not supported by dbgeng') self.step_collection.clear_steps() self._set_leading_bps() for command_obj in chain.from_iterable(self.step_collection.commands.values()): self._watches.update(command_obj.get_watches()) self.debugger.launch(cmdline) time.sleep(self._pause_between_steps) exit_desired = False while not self.debugger.is_finished: while self.debugger.is_running: pass step_info = self.debugger.get_step_info(self._watches, self._step_index) if step_info.current_frame: self._step_index += 1 update_step_watches(step_info, self._watches, self.step_collection.commands) self.step_collection.new_step(self.context, step_info) bp_to_delete = [] for bp_id in self.debugger.get_triggered_breakpoint_ids(): try: # See if this is one of our leading breakpoints. bpr = self._leading_bp_handles[bp_id] except KeyError: # This is a trailing bp. Mark it for removal. bp_to_delete.append(bp_id) continue bpr.add_hit() if bpr.should_be_removed(): if bpr.finish_on_remove: exit_desired = True bp_to_delete.append(bp_id) del self._leading_bp_handles[bp_id] # Add a range of trailing breakpoints covering the lines # requested in the DexLimitSteps command. Ignore first line as # that's covered by the leading bp we just hit and include the # final line. for line in range(bpr.range_from + 1, bpr.range_to + 1): self.debugger.add_breakpoint(bpr.path, line) # Remove any trailing or expired leading breakpoints we just hit. self.debugger.delete_breakpoints(bp_to_delete) if exit_desired: break self.debugger.go() time.sleep(self._pause_between_steps)
def _run_debugger_custom(self): # TODO: Add conditional and unconditional breakpoint support to dbgeng. if self.debugger.get_name() == 'dbgeng': raise DebuggerException( 'DexLimitSteps commands are not supported by dbgeng') self.step_collection.clear_steps() self._set_conditional_bps() for command_obj in chain.from_iterable( self.step_collection.commands.values()): self._watches.update(command_obj.get_watches()) self.debugger.launch() time.sleep(self._pause_between_steps) while not self.debugger.is_finished: while self.debugger.is_running: pass step_info = self.debugger.get_step_info(self._watches, self._step_index) if step_info.current_frame: self._step_index += 1 update_step_watches(step_info, self._watches, self.step_collection.commands) self.step_collection.new_step(self.context, step_info) bp_to_delete = [] for bp_id in self.debugger.get_triggered_breakpoint_ids(): try: # See if this is one of our conditional breakpoints. cbp = self._conditional_bp_handles[bp_id] except KeyError: # This is an unconditional bp. Mark it for removal. bp_to_delete.append(bp_id) continue # We have triggered a breakpoint with a condition. Check that # the condition has been met. if self._conditional_met(cbp): # Add a range of unconditional breakpoints covering the # lines requested in the DexLimitSteps command. Ignore # first line as that's the conditional bp we just hit and # include the final line. for line in range(cbp.range_from + 1, cbp.range_to + 1): self.debugger.add_breakpoint(cbp.path, line) # Remove any unconditional breakpoints we just hit. for bp_id in bp_to_delete: self.debugger.delete_breakpoint(bp_id) self.debugger.go() time.sleep(self._pause_between_steps)
def _run_debugger_custom(self): # TODO: Add conditional and unconditional breakpoint support to dbgeng. if self.debugger.get_name() == 'dbgeng': raise DebuggerException( 'DexLimitSteps commands are not supported by dbgeng') self.step_collection.clear_steps() self._set_conditional_bps() for command_obj in chain.from_iterable( self.step_collection.commands.values()): self._watches.update(command_obj.get_watches()) self.debugger.launch() time.sleep(self._pause_between_steps) while not self.debugger.is_finished: while self.debugger.is_running: pass step_info = self.debugger.get_step_info(self._watches, self._step_index) if step_info.current_frame: self._step_index += 1 update_step_watches(step_info, self._watches, self.step_collection.commands) self.step_collection.new_step(self.context, step_info) loc = step_info.current_location conditional_bp_key = (loc.path, loc.lineno) if conditional_bp_key in self._path_and_line_to_conditional_bp: conditional_bps = self._path_and_line_to_conditional_bp[ conditional_bp_key] for cbp in conditional_bps: if self._conditional_met(cbp): # Unconditional range should ignore first line as that's the # conditional bp we just hit and should be inclusive of final line for line in range(cbp.range_from + 1, cbp.range_to + 1): self.debugger.add_conditional_breakpoint( cbp.path, line, condition='') # Clear any uncondtional break points at this loc. self.debugger.delete_conditional_breakpoint(file_=loc.path, line=loc.lineno, condition='') self.debugger.go() time.sleep(self._pause_between_steps)