ดำเนินการต่อหลังจากสคริปต์ python-lldb เสร็จสิ้น
มีวิธีที่ดีกว่าในการออกคำสั่งต่อหลังจาก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.
คำตอบ
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 บังคับให้รีสตาร์ทเป้าหมาย