Lanjutkan setelah skrip python-lldb selesai

Oct 05 2020

Apakah ada cara yang lebih baik untuk mengeluarkan perintah lanjutkan , setelah python-lldbskrip saya selesai?

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

Contoh ini memberikan kontrol kembali ke aplikasi tetapi saya tidak lagi memiliki lldbkonsol interaktif .

Jawaban di halaman ini tidak membantu: LLDB: lanjutkan secara diam-diam setelah skrip python selesai dijalankan

Catatan sisi: perilaku yang sama jika saya lampirkan melalui XCodeatau Terminal.

Jawaban

1 JimIngham Oct 05 2020 at 19:23

lldb dapat berjalan dalam dua mode "sinkron" atau "asinkron".

Dalam mode asynchronous, semua perintah kontrol eksekusi (langkah, berikutnya, dll.) Selesai dan mengembalikan kontrol ke lldb segera setelah debugee mulai mengeksekusi.

Dalam mode sinkron, perintah kontrol eksekusi menunggu proses berhenti sebelum kembali.

Perilaku sinkronisasi / asinkron yang benar diketahui secara heuristik oleh lldb, tetapi juga dapat disetel secara manual menggunakan SBDebugger.SetAsyncAPI.

Saat menjalankan perintah lldb yang didukung Python, lldb mengatur dirinya sendiri ke mode sinkron. Biasanya itulah yang Anda inginkan, misalnya jika Anda ingin perintah Anda melakukan satu langkah, memeriksa sesuatu dan melakukan langkah lain, Anda tidak ingin stepperintah pertama kembali sebelum langkah sebenarnya dalam proses tersebut selesai atau tindakan "periksa sesuatu" akan terjadi terlalu cepat.

Namun, jika Anda ingin perintah Anda segera mengembalikan kontrol setelah melanjutkan, tidak menunggu prosesnya berhenti, maka Anda dapat memanggil debugger.SetAsync(True)tepat sebelum final process.Continue()dengan perintah yang didukung Python Anda.

Perhatikan, ada satu komplikasi lain dari cerita ini. Ketika sebuah proses diluncurkan oleh lldb, perilaku default-nya adalah berbagi terminal dengan debugee. Jadi saat proses sedang berjalan, terminal akan memiliki, dan sampai proses berhenti Anda tidak akan melihat prompt lldb (yang akan menimpa keluaran proses) atau memiliki cara untuk memasukkan perintah. Jika Anda ingin debugger aktif dan menerima perintah saat proses berjalan, Anda perlu memberikan lldb & aplikasi terminal terpisah. Di lldb, gunakan process launch --ttydan di Xcode ada satu set tombol radio di tab Opsi skema Jalankan yang memungkinkan Anda memilih terminal terpisah daripada menggunakan Konsol Xcode.

BTW, itu terdengar dari catatan Anda seperti proses yang Anda dapatkan dari argumen exe_ctx (yang Anda tinggalkan di versi ini) tidak bekerja untuk Anda ?, Tapi mungkin itu bingung dengan masalah lain. Jika saya SetAsync (True) sebelum melanjutkan, maka melanjutkan exe_ctx.processberfungsi dengan baik untuk saya.

Dan terakhir, jika perintah Python Anda mengubah status proses dari berhenti menjadi berjalan, Anda harus memberi tahu lldb bahwa dengan memanggil:

result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)

atau

result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)

Hal ini penting jika perintah Anda digunakan dalam callback breakpoint atau stop-hook, di mana lldb menggunakan hasilnya untuk melacak apakah perintah breakpoint atau stop hook secara paksa memulai ulang target.