Continua dopo che lo script python-lldb è terminato

Oct 05 2020

C'è un modo migliore per emettere il comando continue , dopo che il mio python-lldbscript è terminato?

def HelloWorld(debugger, command, result, internal_dict):
    """
        HelloWorld function. It will print "Hello World", regardless of where lldb stopped.
        Auto-Continues after script has ran.
    """
    target = debugger.GetSelectedTarget()
    process = target.GetProcess()
    print("[*] Hello World from :{}".format(process))
    process.Continue()

L'esempio restituisce il controllo all'app ma non ho più la lldbconsole interattiva .

Le risposte in questa pagina non hanno aiutato: LLDB: continua silenziosamente dopo che lo script python ha terminato l'esecuzione

Nota a margine: stesso comportamento se allego tramite XCodeo Terminal.

Risposte

1 JimIngham Oct 05 2020 at 19:23

lldb può essere eseguito in due modalità "sincrono" o "asincrono".

In modalità asincrona, tutti i comandi di controllo dell'esecuzione (passo, successivo, ecc.) Vengono completati e restituiscono il controllo a lldb non appena il debugiato inizia l'esecuzione.

In modalità sincrona, i comandi di controllo dell'esecuzione attendono l'arresto del processo prima di tornare.

Il corretto comportamento di sincronizzazione / asincrono è calcolato euristicamente da lldb, ma può anche essere impostato manualmente utilizzando l' SBDebugger.SetAsyncAPI.

Quando si esegue un comando lldb supportato da Python, lldb si imposta in modalità sincrona. In genere è quello che vuoi, ad esempio se vuoi che il tuo comando esegua un passaggio, controlli qualcosa e ne esegua un altro, non vorresti che il primo stepcomando ritorni prima che il passaggio effettivo del processo sia stato completato o la tua azione "controlla qualcosa" sarebbe successo troppo presto.

Tuttavia, se vuoi che il tuo comando ritorni il controllo immediatamente dopo aver continuato, senza aspettare che il processo si interrompa, puoi chiamare debugger.SetAsync(True)subito prima della finale process.Continue()nel tuo comando supportato da Python.

Nota, c'è un'altra complicazione in questa storia. Quando un processo viene avviato da lldb, il comportamento predefinito è condividere il terminale con il debugiato. Quindi, mentre il processo è in esecuzione, sarà il proprietario del terminale e fino a quando il processo non si arresta non vedrai un prompt lldb (che sovrascriverebbe l'output del processo) né avrai un modo per inserire i comandi. Se vuoi che il debugger sia attivo e accetti i comandi mentre il processo è in esecuzione, devi dare lldb e l'app ai terminali separati. In lldb, usa process launch --ttye in Xcode c'è una serie di pulsanti di opzione nella scheda Opzioni dello schema Esegui che ti consente di scegliere un terminale separato invece di usare la console Xcode.

A proposito, suonava dalla tua nota come se il processo che hai ottenuto dall'argomento exe_ctx (che hai tralasciato in questa versione) non funzionasse per te ?, Ma forse è confuso con altri problemi. Se ho impostato su SetAsync (True) prima di continuare, continuare exe_ctx.processfunziona bene per me.

E infine, se il tuo comando Python cambia lo stato del processo da interrotto a in esecuzione, dovresti dirlo a lldb chiamando:

result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)

o

result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)

Ciò è importante se il tuo comando viene utilizzato in un callback di breakpoint o stop-hook, dove lldb utilizza il risultato per tenere traccia se il comando breakpoint o stop hook ha riavviato forzatamente il target.