'Perform execution using any applicable engine. Enumerate the current engines and use the
first one that works. Return a SimSuccessors object classifying the results of the run.
:param state:           The state to analyze
:param addr:            optional, an address to execute at instead of the state\'s ip
:param jumpkind:        optional, the jumpkind of the previous exit
:param inline:          This is an inline execution. Do not bother copying the state.
:param default_engine:  Whether we should only attempt to use the default engine (usually VEX)
:param engines:         A list of engines to try to use, instead of the default.
Additional keyword arguments will be passed directly into each engine\'s process method.'

def successors(self, state, addr=None, jumpkind=None, inline=False, default_engine=False, engines=None, **kwargs):

    if default_engine:
        engines = [self.default_engine]
    if (engines is None):
        engines = self.engines
    if ((addr is not None) or (jumpkind is not None)):
        state = state.copy()
        if (addr is not None):
            state.ip = addr
        if (jumpkind is not None):
            state.history.jumpkind = jumpkind
    r = None
    for engine in engines:
        if engine.check(state, inline=inline, **kwargs):
            r = engine.process(state, inline=inline, **kwargs)
            if r.processed:
                break
    if ((r is None) or (not r.processed)):
        raise AngrExitError('All    engines    failed    to    execute!')
    if (r.successors and r.successors[0].history.jumpkind.startswith('Ijk_Sys')):
        self._fix_syscall_ip(r.successors[0])
    for succ in r.successors:
        succ.history.description = str(r)
    return r
