หน้านี้แสดงรายละเอียดโดยใช้ 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 แนบ:
- ไปที่ การตั้งค่า > ตัวเลือกนักพัฒนา > เลือกแอปแก้ไขข้อบกพร่อง แล้วเลือกแอปของคุณจากรายการ จากนั้นคลิก รอโปรแกรมแก้ไขข้อบกพร่อง
- เริ่มแอปจากตัวเรียกใช้งานหรือโดยใช้บรรทัดคำสั่งเพื่อเรียกใช้:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- รอให้แอปโหลดและกล่องโต้ตอบปรากฏขึ้นเพื่อแจ้งให้คุณทราบว่าแอปกำลังรอดีบักเกอร์
- แนบ
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:
- ตรวจสอบให้แน่ใจว่ามีการสร้างสิ่งประดิษฐ์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นในการรัน
gdbclient.py
หรือlldbclient.py
- เรียกใช้คำสั่งต่อไปนี้:
lldbclient.py --setup-forwarding vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
สิ่งนี้จะพิมพ์วัตถุ JSON และ
lldbclient.py
ยังคงทำงานต่อไป เป็นที่คาดหวัง; อย่าฆ่าโปรแกรมlldbclient.py
แฟล็ก
-r
ต้องเป็นแฟล็กสุดท้าย หากมี เนื่องจากแฟล็กถูกแยกวิเคราะห์โดยเครื่องมือ - ในแท็บการดีบักใน VS Code ให้เลือก เพิ่มการกำหนดค่า จากนั้นเลือก LLDB: Custom Launch ซึ่งจะเปิดไฟล์
launch.json
และเพิ่มออบเจ็กต์ JSON ใหม่ลงในรายการ - ลบการกำหนดค่าดีบักเกอร์ที่เพิ่มใหม่
- คัดลอกวัตถุ JSON ที่พิมพ์โดย
lldbclient.py
และวางลงในวัตถุที่คุณเพิ่งลบ บันทึกการเปลี่ยนแปลง - หากต้องการโหลดหน้าต่างซ้ำเพื่อรีเฟรชรายการดีบักเกอร์ ให้กด Ctrl+Shift+P แล้วพิมพ์
reload window
- เลือกการกำหนดค่าดีบักเกอร์ใหม่และกด เรียกใช้ ดีบักเกอร์ควรเชื่อมต่อหลังจาก 10 ถึง 30 วินาที
- เมื่อคุณแก้ไขข้อบกพร่องเสร็จแล้ว ให้ไปที่เทอร์มินัลที่รัน
lldbclient.py
แล้วกด Enter เพื่อสิ้นสุดโปรแกรมlldbclient.py