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

หน้านี้แสดงรายละเอียดการใช้ 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 แนบ:

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

  1. ตรวจสอบให้แน่ใจว่าบิวด์อาร์ติแฟกต์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นในการรัน lldbclient.py หรือ lldbclient.py มีอยู่
  2. ใน VS Code ให้กด Ctrl+Shift+P เพื่อรันคำสั่ง ค้นหา Debug: Add Configuration... จากนั้นเลือก LLDB ซึ่งจะเปิดไฟล์ launch.json และเพิ่มออบเจ็กต์ JSON ใหม่ลงในรายการ
  3. แทนที่การกำหนดค่าดีบักเกอร์ที่เพิ่มใหม่ด้วยบรรทัดความคิดเห็นสองบรรทัด - // #lldbclient-generated-begin และ // #lldbclient-generated-end เพื่อให้รายการการกำหนดค่าของคุณมีลักษณะดังนี้:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py ใช้ความคิดเห็นเหล่านี้เพื่อตรวจหาตำแหน่งที่จะเขียนการกำหนดค่า หากมีรายการอื่นๆ ในรายการ ให้เพิ่มบรรทัดความคิดเห็นต่อท้ายการกำหนดค่าอื่นๆ

  4. เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลที่คุณเรียกใช้ 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 ต้องเป็นแฟล็กสุดท้ายหากมีอยู่ เนื่องจากเครื่องมือแยกวิเคราะห์แฟล็ก

  5. เปิดแถบด้านข้าง Run and Debug - การกำหนดค่าใหม่ควรปรากฏในรายการดีบักเกอร์ กด เริ่มการดีบัก (F5) ดีบักเกอร์ควรเชื่อมต่อหลังจากผ่านไป 10 ถึง 30 วินาที

    หากการกำหนดค่าใหม่ไม่ปรากฏในมุมมอง Run และ Debug ให้โหลดหน้าต่างใหม่เพื่อรีเฟรชรายการดีบักเกอร์ - กด Ctrl+Shift+P แล้วพิมพ์ reload window

  6. เมื่อคุณแก้ไขจุดบกพร่องเสร็จแล้ว ให้ไปที่เทอร์มินัลที่รัน 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