รายละเอียดหน้านี้ใช้ LLDB หรือ GDB สำหรับการพัฒนา OS สำหรับการพัฒนาแอป โปรดดูที่ การดีบักแอปของคุณ แทน ซึ่งจะอธิบายวิธีใช้ Android Studio GUI (ตาม LLDB)
GDB เลิกใช้แล้วและจะถูกลบในไม่ช้า หากคุณเปลี่ยนจาก GDB เป็น LLDB คุณควรเริ่มต้นด้วยการอ่าน บทช่วยสอน LLDB หากคุณเป็นผู้ใช้ GDB ที่เชี่ยวชาญ การแมปคำสั่ง GDB กับ LLDB จะมีประโยชน์มากในขณะเปลี่ยน
ข้อกำหนดเบื้องต้น
หากต้องการใช้ดีบักเกอร์:
- ตั้งค่าสภาพแวดล้อมการสร้างด้วยคำสั่ง
envsetup.sh
ตามปกติ - เรียกใช้คำสั่ง
lunch
แบบเดียวกับที่คุณใช้เมื่อสร้าง โปรดทราบว่ารายการอาหารกลางวันควรตรงกับอุปกรณ์ที่คุณกำลังแก้ไขข้อบกพร่องทุกประการ หากรายการอาหารกลางวันไม่ตรงกับอุปกรณ์ที่แนบมา คุณจะได้รับข้อผิดพลาดของแบบฟอร์ม:You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
- เชื่อมต่ออุปกรณ์ของคุณกับเครื่อง
สำหรับความช่วยเหลือเพิ่มเติมเกี่ยวกับการตั้งค่าสภาพแวดล้อม โปรดดูที่ การตั้งค่าสภาพแวดล้อม
การดีบักไบนารี
ในการดีบักไบนารีที่คุณสร้างขึ้นในเครื่อง ก่อนอื่นคุณต้องคัดลอกไบนารีไปยังอุปกรณ์ จากนั้นเปิดใช้ดีบักเกอร์ ตัวอย่างเช่น:
adb push test.exe /data/local/tmp/test.exe
gdbclient.py --port 5038 -r /data/local/tmp/test.exe
การดีบักแอปหรือกระบวนการที่กำลังทำงานอยู่
หากต้องการเชื่อมต่อกับแอปที่รันอยู่หรือเนทีฟเดมอน ให้ใช้ 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
ระงับกระบวนการที่ขัดข้อง เพื่อให้คุณสามารถแนบดีบักเกอร์ได้ ให้ตั้งค่าคุณสมบัติที่เหมาะสม:
- หลังจาก 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
- ใน VS Code ให้กด Ctrl+Shift+P เพื่อเรียกใช้คำสั่ง ค้นหา Debug: Add Configuration... จากนั้นเลือก LLDB ซึ่งจะเปิดไฟล์
launch.json
และเพิ่มวัตถุ JSON ใหม่ลงในรายการ - แทนที่การกำหนดค่าดีบักเกอร์ที่เพิ่มใหม่ด้วยบรรทัดความคิดเห็นสองบรรทัด -
// #lldbclient-generated-begin
และ// #lldbclient-generated-end
เพื่อให้รายการการกำหนดค่าของคุณมีลักษณะดังนี้:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
ใช้ความคิดเห็นเหล่านี้เพื่อตรวจหาตำแหน่งที่จะเขียนการกำหนดค่า หากมีรายการอื่นๆ ในรายการ ให้เพิ่มบรรทัดความคิดเห็นต่อท้ายหลังการกำหนดค่าอื่นๆ - เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลที่คุณเรียกใช้
envsetup.sh
และlunch
:lldbclient.py --setup-forwarding vscode-lldb \ --vscode-launch-file LAUNCH_JSON_PATH \ ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
lldbclient.py
เขียนการกำหนดค่าที่สร้างขึ้นลงในlaunch.json
และทำงานต่อไป นี้คาดว่าจะ; อย่าปิดโปรแกรมlldbclient.py
หากคุณละเว้น--vscode-launch-file
สคริปต์จะพิมพ์ข้อมูลโค้ด JSON ที่คุณจะต้องคัดลอกและวางในlaunch.json
ด้วยตนเองแฟล็ก
-r
ต้องเป็นแฟล็กสุดท้ายหากมีอยู่เนื่องจากวิธีการแยกวิเคราะห์แฟล็กโดยเครื่องมือ - เปิดแถบด้านข้าง Run and Debug - การกำหนดค่าใหม่ควรปรากฏในรายการดีบักเกอร์ กด เริ่มการแก้จุดบกพร่อง (F5) ดีบักเกอร์ควรเชื่อมต่อหลังจากผ่านไป 10 ถึง 30 วินาที
หากการกำหนดค่าใหม่ไม่ปรากฏในมุมมอง Run and Debug ให้โหลดหน้าต่างซ้ำเพื่อรีเฟรชรายการดีบักเกอร์ - กด Ctrl+Shift+P แล้วพิมพ์
reload window
- เมื่อคุณดีบักเสร็จแล้ว ให้ไปที่เทอร์มินัลที่เรียกใช้
lldbclient.py
แล้วกด Enter เพื่อสิ้นสุดโปรแกรมlldbclient.py
การรันสคริปต์ในครั้งต่อไปจะสร้างการกำหนดค่าระหว่างความคิดเห็น#lldbclient-generated
และแทนที่เนื้อหาเก่า คุณไม่จำเป็นต้องลบด้วยตนเอง
หากต้องการเพิ่มคุณสมบัติแบบกำหนดเองให้กับการกำหนดค่าการเรียกใช้ที่สร้างขึ้น คุณสามารถใช้แฟล็ก --vscode-launch-props
ตัวอย่างเช่น:
lldbclient.py --setup-forwarding vscode-lldb \
--vscode-launch-props \
'{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
...
คุณสมบัติตัวอย่างจะทำให้ VS Code เรียกใช้งานชื่อ Build
ก่อนทำการดีบั๊กและเพิ่มขั้นตอนการเริ่มต้นดีบั๊กใหม่เข้ากับขั้นตอนที่สร้างโดยสคริปต์ คุณสามารถดูภาพรวมของคุณสมบัติที่มีใน เอกสาร VS Code และในคู่มือผู้ใช้ของ ส่วนขยาย CodeLLDB