หน้านี้แสดงรายละเอียดการใช้ LLDB สำหรับการพัฒนาระบบปฏิบัติการ สำหรับการพัฒนาแอป โปรดดู ดีบักแอปของคุณ แทน ซึ่งจะอธิบายวิธีใช้ Android Studio GUI (อิงตาม LLDB)
GDB ไม่ได้รับการสนับสนุนหรือจัดเตรียมอีกต่อไป หากคุณเปลี่ยนจาก GDB เป็น LLDB คุณควรเริ่มต้นด้วยการอ่าน บทช่วยสอน LLDB หากคุณเป็นผู้ใช้ GDB ผู้เชี่ยวชาญ การแมปคำสั่ง GDB เป็น LLDB จะมีประโยชน์มากในขณะเปลี่ยน
ข้อกำหนดเบื้องต้น
หากต้องการใช้ดีบักเกอร์:
- ตั้งค่าสภาพแวดล้อม build ด้วยคำสั่ง
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
lldbclient.py --port 5038 -r /data/local/tmp/test.exe
การดีบักแอปหรือกระบวนการที่ทำงานอยู่
หากต้องการเชื่อมต่อกับแอปที่รันอยู่หรือเนทีฟดีมอน ให้ใช้ lldbclient.py
กับ PID ตัวอย่างเช่น หากต้องการดีบักกระบวนการด้วย PID 1234 ให้รันสิ่งนี้บนโฮสต์:
lldbclient.py -p 1234
สคริปต์จะตั้งค่าการส่งต่อพอร์ต เริ่ม stub การดีบักระยะไกลที่เหมาะสมบนอุปกรณ์ เริ่มการดีบักเกอร์บนโฮสต์ กำหนดค่าให้ค้นหาสัญลักษณ์ และเชื่อมต่อกับ stub การดีบักระยะไกล
การดีบักการเริ่มต้นกระบวนการดั้งเดิม
หากต้องการดีบักกระบวนการเมื่อเริ่มต้น ให้ใช้ lldbclient.py
พร้อมกับตัวเลือก -r
ตัวอย่างเช่น หากต้องการดีบัก ls /bin
ให้รันสิ่งนี้บนโฮสต์:
lldbclient.py -r /system/bin/ls /bin
จากนั้นให้ป้อน continue
ที่พรอมต์ของดีบักเกอร์
กำลังแก้ไขข้อบกพร่องในการเริ่มต้นแอป
บางครั้งคุณต้องการดีบักแอปเมื่อเริ่มต้น เช่น เมื่อเกิดข้อขัดข้อง และคุณต้องการก้าวผ่านโค้ดเพื่อดูว่าเกิดอะไรขึ้น ก่อน เกิดข้อขัดข้อง การแนบ ใช้งานได้ในบางกรณี แต่ในกรณีอื่น ๆ เป็นไปไม่ได้เนื่องจากแอปขัดข้องก่อนที่คุณจะสามารถแนบได้ วิธีการ logwrapper
(ใช้สำหรับ strace
) ไม่ได้ผลเสมอไป เนื่องจากแอปอาจไม่มีสิทธิ์ในการเปิดพอร์ต และ lldbserver
สืบทอดข้อจำกัดนั้น
หากต้องการดีบักการเริ่มต้นแอป ให้ใช้ตัวเลือกนักพัฒนาในการตั้งค่าเพื่อสั่งให้แอปรอให้ดีบักเกอร์ Java แนบ:
- ไปที่ การตั้งค่า > ตัวเลือกสำหรับนักพัฒนา > เลือกแอปแก้ไขข้อบกพร่อง และเลือกแอปของคุณจากรายการ จากนั้นคลิก รอโปรแกรมแก้ไขข้อบกพร่อง
- เริ่มแอปจากตัวเรียกใช้งานหรือโดยใช้บรรทัดคำสั่งเพื่อรัน:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- รอให้แอปโหลดและกล่องโต้ตอบปรากฏขึ้นเพื่อแจ้งให้คุณทราบว่าแอปกำลังรอตัวดีบักเกอร์
- แนบ
lldbserver
/lldbclient
ตามปกติ ตั้งค่าเบรกพอยต์ จากนั้นดำเนินการต่อ
หากต้องการให้แอปทำงาน ให้แนบดีบักเกอร์ 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 ที่แสดงวิธีเชื่อมต่อโปรแกรมดีบักเกอร์กับกระบวนการที่ขัดข้อง
การดีบักด้วย VS Code
LLDB รองรับการดีบักโค้ดแพลตฟอร์มบน Visual Studio Code คุณสามารถใช้ฟรอนต์เอนด์ดีบักเกอร์ VS Code แทนอินเทอร์เฟซ LLDB CLI เพื่อควบคุมและดีบักโค้ดเนทีฟที่ทำงานบนอุปกรณ์ได้
ก่อนที่จะใช้ VS Code สำหรับการดีบัก ให้ติดตั้ง ส่วนขยาย CodeLLDB
วิธีแก้ไขโค้ดโดยใช้ VS Code:
- ตรวจสอบให้แน่ใจว่าบิวด์อาร์ติแฟกต์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นในการรัน
lldbclient.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 และ 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 รันงานที่ชื่อ Build
ก่อนที่จะทำการดีบัก และผนวกขั้นตอนการเริ่มต้นการดีบักใหม่เข้ากับขั้นตอนที่สร้างโดยสคริปต์ คุณสามารถดูภาพรวมของคุณสมบัติที่มีอยู่ใน เอกสาร VS Code และในคู่มือผู้ใช้ของ ส่วนขยาย CodeLLDB , หน้านี้แสดงรายละเอียดการใช้ LLDB สำหรับการพัฒนาระบบปฏิบัติการ สำหรับการพัฒนาแอป โปรดดู ดีบักแอปของคุณ แทน ซึ่งจะอธิบายวิธีใช้ Android Studio GUI (อิงตาม LLDB)
GDB ไม่ได้รับการสนับสนุนหรือจัดเตรียมอีกต่อไป หากคุณเปลี่ยนจาก GDB เป็น LLDB คุณควรเริ่มต้นด้วยการอ่าน บทช่วยสอน LLDB หากคุณเป็นผู้ใช้ GDB ผู้เชี่ยวชาญ การแมปคำสั่ง GDB เป็น LLDB จะมีประโยชน์มากในขณะเปลี่ยน
ข้อกำหนดเบื้องต้น
หากต้องการใช้ดีบักเกอร์:
- ตั้งค่าสภาพแวดล้อม build ด้วยคำสั่ง
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
lldbclient.py --port 5038 -r /data/local/tmp/test.exe
การดีบักแอปหรือกระบวนการที่ทำงานอยู่
หากต้องการเชื่อมต่อกับแอปที่รันอยู่หรือเนทีฟดีมอน ให้ใช้ lldbclient.py
กับ PID ตัวอย่างเช่น หากต้องการดีบักกระบวนการด้วย PID 1234 ให้รันสิ่งนี้บนโฮสต์:
lldbclient.py -p 1234
สคริปต์จะตั้งค่าการส่งต่อพอร์ต เริ่ม stub การดีบักระยะไกลที่เหมาะสมบนอุปกรณ์ เริ่มการดีบักเกอร์บนโฮสต์ กำหนดค่าให้ค้นหาสัญลักษณ์ และเชื่อมต่อกับ stub การดีบักระยะไกล
การดีบักการเริ่มต้นกระบวนการดั้งเดิม
หากต้องการดีบักกระบวนการเมื่อเริ่มต้น ให้ใช้ lldbclient.py
พร้อมกับตัวเลือก -r
ตัวอย่างเช่น หากต้องการดีบัก ls /bin
ให้รันสิ่งนี้บนโฮสต์:
lldbclient.py -r /system/bin/ls /bin
จากนั้นให้ป้อน continue
ที่พรอมต์ของดีบักเกอร์
กำลังแก้ไขข้อบกพร่องในการเริ่มต้นแอป
บางครั้งคุณต้องการดีบักแอปเมื่อเริ่มต้น เช่น เมื่อเกิดข้อขัดข้อง และคุณต้องการก้าวผ่านโค้ดเพื่อดูว่าเกิดอะไรขึ้น ก่อน เกิดข้อขัดข้อง การแนบ ใช้งานได้ในบางกรณี แต่ในกรณีอื่น ๆ เป็นไปไม่ได้เนื่องจากแอปขัดข้องก่อนที่คุณจะสามารถแนบได้ วิธีการ logwrapper
(ใช้สำหรับ strace
) ไม่ได้ผลเสมอไป เนื่องจากแอปอาจไม่มีสิทธิ์ในการเปิดพอร์ต และ lldbserver
สืบทอดข้อจำกัดนั้น
หากต้องการดีบักการเริ่มต้นแอป ให้ใช้ตัวเลือกนักพัฒนาในการตั้งค่าเพื่อสั่งให้แอปรอให้ดีบักเกอร์ Java แนบ:
- ไปที่ การตั้งค่า > ตัวเลือกสำหรับนักพัฒนา > เลือกแอปแก้ไขข้อบกพร่อง และเลือกแอปของคุณจากรายการ จากนั้นคลิก รอโปรแกรมแก้ไขข้อบกพร่อง
- เริ่มแอปจากตัวเรียกใช้งานหรือโดยใช้บรรทัดคำสั่งเพื่อรัน:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- รอให้แอปโหลดและกล่องโต้ตอบปรากฏขึ้นเพื่อแจ้งให้คุณทราบว่าแอปกำลังรอตัวดีบักเกอร์
- แนบ
lldbserver
/lldbclient
ตามปกติ ตั้งค่าเบรกพอยต์ จากนั้นดำเนินการต่อ
หากต้องการให้แอปทำงาน ให้แนบดีบักเกอร์ 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 ที่แสดงวิธีเชื่อมต่อโปรแกรมดีบักเกอร์กับกระบวนการที่ขัดข้อง
การดีบักด้วย VS Code
LLDB รองรับการดีบักโค้ดแพลตฟอร์มบน Visual Studio Code คุณสามารถใช้ฟรอนต์เอนด์ดีบักเกอร์ VS Code แทนอินเทอร์เฟซ LLDB CLI เพื่อควบคุมและดีบักโค้ดเนทีฟที่ทำงานบนอุปกรณ์ได้
ก่อนที่จะใช้ VS Code สำหรับการดีบัก ให้ติดตั้ง ส่วนขยาย CodeLLDB
วิธีแก้ไขโค้ดโดยใช้ VS Code:
- ตรวจสอบให้แน่ใจว่าบิวด์อาร์ติแฟกต์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นในการรัน
lldbclient.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 และ 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 รันงานที่ชื่อ Build
ก่อนที่จะทำการดีบัก และผนวกขั้นตอนการเริ่มต้นการดีบักใหม่เข้ากับขั้นตอนที่สร้างโดยสคริปต์ คุณสามารถดูภาพรวมของคุณสมบัติที่มีอยู่ใน เอกสาร VS Code และในคู่มือผู้ใช้ของ ส่วนขยาย CodeLLDB , หน้านี้แสดงรายละเอียดการใช้ LLDB สำหรับการพัฒนาระบบปฏิบัติการ สำหรับการพัฒนาแอป โปรดดู ดีบักแอปของคุณ แทน ซึ่งจะอธิบายวิธีใช้ Android Studio GUI (อิงตาม LLDB)
GDB ไม่ได้รับการสนับสนุนหรือจัดเตรียมอีกต่อไป หากคุณเปลี่ยนจาก GDB เป็น LLDB คุณควรเริ่มต้นด้วยการอ่าน บทช่วยสอน LLDB หากคุณเป็นผู้ใช้ GDB ผู้เชี่ยวชาญ การแมปคำสั่ง GDB เป็น LLDB จะมีประโยชน์มากในขณะเปลี่ยน
ข้อกำหนดเบื้องต้น
หากต้องการใช้ดีบักเกอร์:
- ตั้งค่าสภาพแวดล้อม build ด้วยคำสั่ง
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
lldbclient.py --port 5038 -r /data/local/tmp/test.exe
การดีบักแอปหรือกระบวนการที่ทำงานอยู่
หากต้องการเชื่อมต่อกับแอปที่รันอยู่หรือเนทีฟดีมอน ให้ใช้ lldbclient.py
กับ PID ตัวอย่างเช่น หากต้องการดีบักกระบวนการด้วย PID 1234 ให้รันสิ่งนี้บนโฮสต์:
lldbclient.py -p 1234
สคริปต์จะตั้งค่าการส่งต่อพอร์ต เริ่ม stub การดีบักระยะไกลที่เหมาะสมบนอุปกรณ์ เริ่มการดีบักเกอร์บนโฮสต์ กำหนดค่าให้ค้นหาสัญลักษณ์ และเชื่อมต่อกับ stub การดีบักระยะไกล
การดีบักการเริ่มต้นกระบวนการดั้งเดิม
หากต้องการดีบักกระบวนการเมื่อเริ่มต้น ให้ใช้ lldbclient.py
พร้อมกับตัวเลือก -r
ตัวอย่างเช่น หากต้องการดีบัก ls /bin
ให้รันสิ่งนี้บนโฮสต์:
lldbclient.py -r /system/bin/ls /bin
จากนั้นให้ป้อน continue
ที่พรอมต์ของดีบักเกอร์
กำลังแก้ไขข้อบกพร่องในการเริ่มต้นแอป
บางครั้งคุณต้องการดีบักแอปเมื่อเริ่มต้น เช่น เมื่อเกิดข้อขัดข้อง และคุณต้องการก้าวผ่านโค้ดเพื่อดูว่าเกิดอะไรขึ้น ก่อน เกิดข้อขัดข้อง การแนบ ใช้งานได้ในบางกรณี แต่ในกรณีอื่น ๆ เป็นไปไม่ได้เนื่องจากแอปขัดข้องก่อนที่คุณจะสามารถแนบได้ วิธีการ logwrapper
(ใช้สำหรับ strace
) ไม่ได้ผลเสมอไป เนื่องจากแอปอาจไม่มีสิทธิ์ในการเปิดพอร์ต และ lldbserver
สืบทอดข้อจำกัดนั้น
หากต้องการดีบักการเริ่มต้นแอป ให้ใช้ตัวเลือกนักพัฒนาในการตั้งค่าเพื่อสั่งให้แอปรอให้ดีบักเกอร์ Java แนบ:
- ไปที่ การตั้งค่า > ตัวเลือกสำหรับนักพัฒนา > เลือกแอปแก้ไขข้อบกพร่อง และเลือกแอปของคุณจากรายการ จากนั้นคลิก รอโปรแกรมแก้ไขข้อบกพร่อง
- เริ่มแอปจากตัวเรียกใช้งานหรือโดยใช้บรรทัดคำสั่งเพื่อรัน:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- รอให้แอปโหลดและกล่องโต้ตอบปรากฏขึ้นเพื่อแจ้งให้คุณทราบว่าแอปกำลังรอตัวดีบักเกอร์
- แนบ
lldbserver
/lldbclient
ตามปกติ ตั้งค่าเบรกพอยต์ จากนั้นดำเนินการต่อ
หากต้องการให้แอปทำงาน ให้แนบดีบักเกอร์ 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 ที่แสดงวิธีเชื่อมต่อโปรแกรมดีบักเกอร์กับกระบวนการที่ขัดข้อง
การดีบักด้วย VS Code
LLDB รองรับการดีบักโค้ดแพลตฟอร์มบน Visual Studio Code คุณสามารถใช้ฟรอนต์เอนด์ดีบักเกอร์ VS Code แทนอินเทอร์เฟซ LLDB CLI เพื่อควบคุมและดีบักโค้ดเนทีฟที่ทำงานบนอุปกรณ์ได้
ก่อนที่จะใช้ VS Code สำหรับการดีบัก ให้ติดตั้ง ส่วนขยาย CodeLLDB
วิธีแก้ไขโค้ดโดยใช้ VS Code:
- ตรวจสอบให้แน่ใจว่าบิวด์อาร์ติแฟกต์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นในการรัน
lldbclient.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 และ 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 รันงานที่ชื่อ Build
ก่อนที่จะทำการดีบัก และผนวกขั้นตอนการเริ่มต้นการดีบักใหม่เข้ากับขั้นตอนที่สร้างโดยสคริปต์ คุณสามารถดูภาพรวมของคุณสมบัติที่มีอยู่ใน เอกสาร VS Code และในคู่มือผู้ใช้ของ ส่วนขยาย CodeLLDB