Fahren Sie fort, nachdem das Python-Lldb-Skript beendet wurde

Oct 05 2020

Gibt es eine bessere Möglichkeit, den Befehl continue auszuführen, nachdem mein python-lldbSkript beendet wurde?

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

Das Beispiel gibt der App die Kontrolle zurück, aber ich habe keine interaktive lldbKonsole mehr.

Die Antworten auf dieser Seite haben nicht geholfen: LLDB: Fahren Sie still fort, nachdem die Ausführung des Python-Skripts abgeschlossen ist

Nebenbemerkung: Gleiches Verhalten, wenn ich über XCodeoder anhänge Terminal.

Antworten

1 JimIngham Oct 05 2020 at 19:23

lldb kann in zwei Modi ausgeführt werden: "synchron" oder "asynchron".

Im asynchronen Modus werden alle Ausführungssteuerungsbefehle (Schritt, Weiter usw.) abgeschlossen und geben die Steuerung an lldb zurück, sobald der Debugee mit der Ausführung beginnt.

Im synchronen Modus warten Ausführungssteuerungsbefehle, bis der Prozess gestoppt ist, bevor sie zurückkehren.

Das korrekte Synchronisierungs- / Asynchronisierungsverhalten wird von lldb heuristisch ermittelt, kann aber auch mithilfe der SBDebugger.SetAsyncAPI von Hand festgelegt werden .

Wenn Sie einen von Python unterstützten lldb-Befehl ausführen, versetzt sich lldb in den synchronen Modus. Dies ist im Allgemeinen das, was Sie möchten. Wenn Sie beispielsweise möchten, dass Ihr Befehl einen Schritt ausführt, etwas überprüft und einen weiteren Schritt ausführt, möchten Sie nicht, dass der erste stepBefehl zurückgegeben wird, bevor der eigentliche Schritt im Prozess abgeschlossen ist, oder dass Sie etwas überprüfen würde zu früh passieren.

Wenn Sie jedoch möchten, dass Ihr Befehl die Kontrolle sofort nach dem Fortfahren zurückgibt und nicht darauf wartet, dass der Prozess beendet wird, können Sie in Ihrem von Python unterstützten Befehl debugger.SetAsync(True)direkt vor dem Finale aufrufen process.Continue().

Beachten Sie, dass diese Geschichte noch eine weitere Komplikation darstellt. Wenn ein Prozess von lldb gestartet wird, besteht das Standardverhalten darin, das Terminal für den Debugee freizugeben. Während der Prozess ausgeführt wird, besitzt er das Terminal, und bis der Prozess stoppt, wird keine lldb-Eingabeaufforderung angezeigt (die die Prozessausgabe überschreiben würde) oder Sie können Befehle eingeben. Wenn Sie möchten, dass der Debugger aktiv ist und Befehle akzeptiert, während der Prozess ausgeführt wird, müssen Sie lldb und der App separate Terminals zuweisen. In lldb, use process launch --ttyund in Xcode gibt es auf der Registerkarte Options des Run-Schemas eine Reihe von Optionsfeldern, mit denen Sie ein separates Terminal auswählen können, anstatt die Xcode-Konsole zu verwenden.

Übrigens, es klang aus Ihrer Notiz, als ob der Prozess, den Sie durch das exe_ctx-Argument (das Sie in dieser Version ausgelassen haben) erhalten haben, für Sie nicht funktioniert haben? Aber vielleicht ist das mit anderen Problemen verwechselt. Wenn ich vor dem Fortfahren AsAsync (True) setze, exe_ctx.processfunktioniert das Fortfahren für mich einwandfrei .

Und schließlich, wenn Ihr Python-Befehl den Prozessstatus von gestoppt auf ausgeführt ändert, sollten Sie lldb dies mitteilen, indem Sie Folgendes aufrufen:

result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)

oder

result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)

Dies ist wichtig, wenn Ihr Befehl in einem Haltepunkt-Rückruf oder Stopp-Hook verwendet wird, wobei lldb das Ergebnis verwendet, um zu verfolgen, ob der Haltepunkt-Befehl oder Stopp-Hook das Ziel zwangsweise neu gestartet hat.