ดำเนินการต่อหลังจากสคริปต์ python-lldb เสร็จสิ้น

Oct 05 2020

มีวิธีที่ดีกว่าในการออกคำสั่งต่อหลังจากpython-lldbสคริปต์ของฉันเสร็จสิ้นหรือไม่

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

ตัวอย่างให้การควบคุมกลับไปที่แอป แต่ฉันไม่มีlldbคอนโซลแบบโต้ตอบอีกต่อไป

คำตอบในหน้านี้ไม่ได้ช่วยอะไร: LLDB: ดำเนินการต่ออย่างเงียบ ๆ หลังจากเรียกใช้สคริปต์ python เสร็จแล้ว

Sidenote: พฤติกรรมเดียวกันถ้าฉันแนบผ่านXCodeหรือTerminal.

คำตอบ

1 JimIngham Oct 05 2020 at 19:23

lldb สามารถทำงานในสองโหมด "ซิงโครนัส" หรือ "อะซิงโครนัส"

ในโหมดอะซิงโครนัสคำสั่งควบคุมการดำเนินการทั้งหมด (ขั้นตอนถัดไป ฯลฯ ) จะดำเนินการให้เสร็จสิ้นและส่งคืนการควบคุมไปที่ lldb ทันทีที่ debugee เริ่มดำเนินการ

ในโหมดซิงโครนัสคำสั่งควบคุมการดำเนินการจะรอให้กระบวนการหยุดก่อนที่จะกลับมา

ลักษณะการทำงานของการซิงค์ / async ที่ถูกต้องจะคำนวณโดย lldb แบบฮิวริสติก แต่ยังสามารถตั้งค่าด้วยมือโดยใช้SBDebugger.SetAsyncAPI

เมื่อเรียกใช้คำสั่ง lldb ที่สำรองไว้ด้วย Python lldb จะตั้งค่าตัวเองเป็นโหมดซิงโครนัส นั่นคือสิ่งที่คุณต้องการโดยทั่วไปเช่นหากคุณต้องการให้คำสั่งของคุณทำตามขั้นตอนตรวจสอบบางสิ่งและทำขั้นตอนอื่นคุณจะไม่ต้องการให้stepคำสั่งแรกกลับมาก่อนที่ขั้นตอนจริงในกระบวนการจะเสร็จสมบูรณ์หรือการดำเนินการ "ตรวจสอบบางสิ่ง" ของคุณ จะเกิดขึ้นเร็วเกินไป

อย่างไรก็ตามหากคุณต้องการให้คำสั่งของคุณคืนค่าการควบคุมทันทีหลังจากดำเนินการต่อโดยไม่ต้องรอให้กระบวนการหยุดคุณสามารถเรียกใช้debugger.SetAsync(True)ก่อนprocess.Continue()คำสั่งสุดท้ายใน Python ที่สำรองไว้

โปรดทราบว่าเรื่องนี้มีความซับซ้อนอีกอย่างหนึ่ง เมื่อกระบวนการถูกเรียกใช้โดย lldb ลักษณะการทำงานเริ่มต้นคือการแชร์เทอร์มินัลกับ debugee ดังนั้นในขณะที่กำลังดำเนินการกระบวนการจะเป็นเจ้าของเทอร์มินัลและจนกว่ากระบวนการจะหยุดคุณจะไม่เห็นพรอมต์ lldb (ซึ่งจะเขียนทับผลลัพธ์ของกระบวนการ) หรือมีวิธีป้อนคำสั่ง หากคุณต้องการให้ดีบักเกอร์ใช้งานได้และยอมรับคำสั่งในขณะที่กระบวนการกำลังทำงานอยู่คุณต้องให้ lldb & app แยกเทอร์มินัล ใน lldb ให้ใช้process launch --ttyและใน Xcode มีชุดปุ่มตัวเลือกในแท็บตัวเลือกของแบบแผนเรียกใช้ที่ให้คุณเลือกเทอร์มินัลแยกต่างหากแทนที่จะใช้ Xcode Console

BTW มันฟังจากบันทึกของคุณเหมือนกับกระบวนการที่คุณได้รับจากอาร์กิวเมนต์ exe_ctx (ซึ่งคุณได้ทิ้งไว้ในเวอร์ชันนี้) ไม่ได้ผลสำหรับคุณใช่หรือไม่ แต่อาจสับสนกับปัญหาอื่น ๆ หากฉัน SetAsync (True) ก่อนดำเนินการต่อการดำเนินการต่อจะexe_ctx.processใช้ได้ดีสำหรับฉัน

และในที่สุดหากคำสั่ง Python ของคุณเปลี่ยนสถานะกระบวนการจากหยุดเป็นทำงานคุณควรบอก lldb โดยเรียก:

result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)

หรือ

result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)

สิ่งนี้มีความสำคัญหากคำสั่งของคุณถูกใช้ในการเรียกกลับเบรกพอยต์หรือสต็อปฮุกโดยที่ lldb ใช้ผลลัพธ์เพื่อติดตามว่าคำสั่งเบรกพอยต์หรือ stop hook บังคับให้รีสตาร์ทเป้าหมาย