การใช้ดีบักเกอร์

หน้านี้แสดงรายละเอียดโดยใช้ LLDB หรือ GDB สำหรับการพัฒนาระบบปฏิบัติการ สำหรับการพัฒนาแอป โปรดดูที่ ดีบักแอปของคุณ แทน ซึ่งจะอธิบายวิธีใช้ Android Studio GUI (ตาม LLDB)

GDB เลิกใช้แล้วและจะถูกลบออกในไม่ช้า หากคุณกำลังเปลี่ยนจาก GDB เป็น LLDB คุณควรเริ่มต้นด้วยการอ่าน LLDB Tutorial หากคุณเป็นผู้ใช้ GDB ที่เชี่ยวชาญ แผนผังคำสั่ง GDB เป็น LLDB จะมีประโยชน์มากในขณะทำการเปลี่ยนแปลง

ข้อกำหนดเบื้องต้น

ในการใช้ดีบักเกอร์:

  • ตั้งค่าสภาพแวดล้อมการสร้างด้วยคำสั่ง envsetup.sh ปกติ
  • รันคำสั่ง lunch เดียวกับที่คุณใช้ในการสร้าง

สำหรับความช่วยเหลือเพิ่มเติมเกี่ยวกับการตั้งค่าสภาพแวดล้อมของคุณ โปรดดูที่ ตั้งค่าสภาพแวดล้อม

การดีบักแอปหรือกระบวนการที่ทำงานอยู่

ในการเชื่อมต่อกับแอพที่รันอยู่หรือ native daemon ให้ใช้ gdbclient.py กับ PID ตัวอย่างเช่น ในการดีบักกระบวนการด้วย PID 1234 ให้รันสิ่งนี้บนโฮสต์:

gdbclient.py -p 1234

สคริปต์ตั้งค่าการส่งต่อพอร์ต เริ่มต้นต้นขั้วดีบักระยะไกลที่เหมาะสมบนอุปกรณ์ เริ่มดีบักเกอร์บนโฮสต์ กำหนดค่าให้ค้นหาสัญลักษณ์ และเชื่อมต่อกับต้นขั้วดีบักระยะไกล

การดีบักการเริ่มต้นกระบวนการดั้งเดิม

ในการดีบักกระบวนการเมื่อเริ่มต้น ให้ใช้ gdbclient.py พร้อมตัวเลือก -r ตัวอย่างเช่น ในการดีบัก ls /bin ให้รันสิ่งนี้บนโฮสต์:

gdbclient.py -r /system/bin/ls /bin

จากนั้นป้อน continue การต่อที่ข้อความแจ้งของดีบักเกอร์

การดีบักการเริ่มต้นแอป

บางครั้งคุณต้องการดีบักแอปเมื่อเริ่มทำงาน เช่น เมื่อมีการขัดข้องและคุณต้องการทำตามขั้นตอนเพื่อดูว่าเกิดอะไรขึ้น ก่อน เกิดข้อขัดข้อง การแนบ ใช้งานได้ในบางกรณี แต่ในบางกรณีอาจเป็นไปไม่ได้เนื่องจากแอปขัดข้องก่อนที่คุณจะแนบได้ วิธี logwrapper (ใช้สำหรับ strace ) ไม่ได้ผลเสมอไปเพราะแอปอาจไม่มีสิทธิ์ในการเปิดพอร์ต และ gdbserver สืบทอดข้อจำกัดนั้น

ในการดีบักการเริ่มต้นแอป ให้ใช้ตัวเลือกนักพัฒนาในการตั้งค่าเพื่อสั่งให้แอปรอให้ดีบักเกอร์ Java แนบ:

  1. ไปที่ การตั้งค่า > ตัวเลือกนักพัฒนา > เลือกแอปแก้ไขข้อบกพร่อง แล้วเลือกแอปของคุณจากรายการ จากนั้นคลิก รอโปรแกรมแก้ไขข้อบกพร่อง
  2. เริ่มแอปจากตัวเรียกใช้งานหรือโดยใช้บรรทัดคำสั่งเพื่อเรียกใช้:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. รอให้แอปโหลดและกล่องโต้ตอบปรากฏขึ้นเพื่อแจ้งให้คุณทราบว่าแอปกำลังรอดีบักเกอร์
  4. แนบ gdbserver / gdbclient ตามปกติ ตั้งค่าเบรกพอยต์ จากนั้นดำเนินการตามขั้นตอนต่อ

หากต้องการให้แอปทำงาน ให้แนบดีบักเกอร์ Java Debug Wire Protocol (JDWP) เช่น Java Debugger (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

การดีบักแอปหรือกระบวนการที่ขัดข้อง

หากคุณต้องการให้ debuggerd ระงับกระบวนการที่ขัดข้อง เพื่อให้คุณสามารถแนบ debugger ได้ ให้ตั้งค่าคุณสมบัติที่เหมาะสม:

  • หลังจาก Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 และต่ำกว่า
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow และต่ำกว่า
    adb shell setprop debug.db.uid 999999
    

ที่ส่วนท้ายของเอาต์พุตข้อขัดข้องปกติ debuggerd จะให้คำแนะนำในการคัดลอกและวางใน logcat ที่แสดงวิธีเชื่อมต่อดีบักเกอร์กับกระบวนการที่ขัดข้อง

การดีบักโดยไม่มีสัญลักษณ์

สำหรับ ARM แบบ 32 บิต หากคุณไม่มีสัญลักษณ์ gdb จะไม่สามารถระบุได้ว่าชุดคำสั่งใดที่จะแยกส่วนประกอบ (ARM หรือ Thumb) ในการระบุชุดคำสั่งที่เลือกเป็นค่าเริ่มต้นเมื่อข้อมูลสัญลักษณ์หายไป ให้ตั้งค่าคุณสมบัติต่อไปนี้:

set arm fallback-mode arm  # or thumb

การดีบักด้วย VS Code

LLDB รองรับโค้ดแพลตฟอร์มการดีบักบน Visual Studio Code คุณสามารถใช้ส่วนหน้าของดีบักเกอร์ VS Code แทนอินเทอร์เฟซ LLDB CLI เพื่อควบคุมและดีบักโค้ดเนทีฟที่ทำงานบนอุปกรณ์

ก่อนใช้ VS Code สำหรับการดีบัก ให้ติดตั้ง ส่วนขยาย CodeLLDB

ในการดีบักโค้ดโดยใช้ VS Code:

  1. ตรวจสอบให้แน่ใจว่ามีการสร้างสิ่งประดิษฐ์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นในการรัน gdbclient.py หรือ lldbclient.py
  2. เรียกใช้คำสั่งต่อไปนี้:
    lldbclient.py --setup-forwarding
          vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    สิ่งนี้จะพิมพ์วัตถุ JSON และ lldbclient.py ยังคงทำงานต่อไป เป็นที่คาดหวัง; อย่าฆ่าโปรแกรม lldbclient.py

    แฟล็ก -r ต้องเป็นแฟล็กสุดท้าย หากมี เนื่องจากแฟล็กถูกแยกวิเคราะห์โดยเครื่องมือ

  3. ในแท็บการดีบักใน VS Code ให้เลือก เพิ่มการกำหนดค่า จากนั้นเลือก LLDB: Custom Launch ซึ่งจะเปิดไฟล์ launch.json และเพิ่มออบเจ็กต์ JSON ใหม่ลงในรายการ
  4. ลบการกำหนดค่าดีบักเกอร์ที่เพิ่มใหม่
  5. คัดลอกวัตถุ JSON ที่พิมพ์โดย lldbclient.py และวางลงในวัตถุที่คุณเพิ่งลบ บันทึกการเปลี่ยนแปลง
  6. หากต้องการโหลดหน้าต่างซ้ำเพื่อรีเฟรชรายการดีบักเกอร์ ให้กด Ctrl+Shift+P แล้วพิมพ์ reload window
  7. เลือกการกำหนดค่าดีบักเกอร์ใหม่และกด เรียกใช้ ดีบักเกอร์ควรเชื่อมต่อหลังจาก 10 ถึง 30 วินาที
  8. เมื่อคุณแก้ไขข้อบกพร่องเสร็จแล้ว ให้ไปที่เทอร์มินัลที่รัน lldbclient.py แล้วกด Enter เพื่อสิ้นสุดโปรแกรม lldbclient.py