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

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

  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
    
    ที่ต่ำกว่า7
  • Android 6.0 Marshmallow และ
    adb shell setprop debug.db.uid 999999
    
    ที่ต่ำกว่า8

ในตอนท้ายของเอาต์พุตข้อขัดข้องตามปกติ 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:

  1. ตรวจสอบให้แน่ใจว่ามีการสร้างสิ่งประดิษฐ์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นในการรัน gdbclient.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 and 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 Code เรียกใช้งานชื่อ Build ก่อนทำการดีบั๊กและเพิ่มขั้นตอนการเริ่มต้นดีบั๊กใหม่เข้ากับขั้นตอนที่สร้างโดยสคริปต์ คุณสามารถดูภาพรวมของคุณสมบัติที่มีใน เอกสาร VS Code และในคู่มือผู้ใช้ของ ส่วนขยาย CodeLLDB