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

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

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

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

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

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

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

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

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

gdbclient.py -p 1234

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

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

การแก้ปัญหากระบวนการที่มันเริ่มใช้ gdbclient.py กับ -r ตัวเลือก ตัวอย่างเช่นในการแก้ปัญหา ls /bin , ทำงานนี้ในพื้นที่:

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

จากนั้นป้อน continue ที่บั๊กของพรอมต์

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

บางครั้งคุณต้องการที่จะแก้ปัญหาแอปที่มันเริ่มเช่นเมื่อมีความผิดพลาดและคุณต้องการขั้นตอนผ่านรหัสเพื่อดูสิ่งที่เกิดขึ้นก่อนที่จะตก ติด งานในบางกรณี แต่ในกรณีอื่น ๆ ที่เป็นไปไม่ได้เพราะแอปล้มเหลวก่อนที่คุณจะสามารถแนบ logwrapper วิธี (ใช้สำหรับ strace ) ไม่ทำงานเสมอเพราะ app อาจจะไม่ได้รับอนุญาตให้เปิดพอร์ตและ 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 จะระงับกระบวนการตรวจค้นเพื่อให้คุณสามารถแนบการดีบักเกอร์ตั้งค่าคุณสมบัติที่เหมาะสม:

  • หลังจาก 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 รหัส คุณสามารถใช้ส่วนหน้าของดีบักเกอร์ VS Code แทนอินเทอร์เฟซ LLDB CLI เพื่อควบคุมและดีบักโค้ดเนทีฟที่ทำงานบนอุปกรณ์

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