ใช้โปรแกรมแก้ไขข้อบกพร่อง

หน้านี้แสดงรายละเอียดโดยใช้ LLDB สำหรับการพัฒนาระบบปฏิบัติการ สำหรับการพัฒนาแอป โปรดดู แก้ไขข้อบกพร่องของแอป ซึ่งอธิบายวิธีใช้ GUI ของ Android Studio (อิงตาม 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
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

แก้ไขข้อบกพร่องของแอปหรือกระบวนการที่ทำงานอยู่

หากต้องการเชื่อมต่อกับแอปที่กำลังทำงานหรือ Daemon ดั้งเดิม ให้ใช้ lldbclient.py ที่มี PID ตัวอย่างเช่น ในการดีบักกระบวนการด้วย PID 1234 ให้เรียกใช้ในโฮสต์:

lldbclient.py -p 1234

สคริปต์จะตั้งค่าการส่งต่อพอร์ต ต้นขั้วแก้ข้อบกพร่องระยะไกลในอุปกรณ์ เริ่มต้นโปรแกรมแก้ไขข้อบกพร่องบน โฮสต์ กำหนดค่าเพื่อค้นหาสัญลักษณ์ และเชื่อมต่อ ไปยังต้นขั้วดีบักระยะไกล

แก้ไขข้อบกพร่องการเริ่มต้นกระบวนการดั้งเดิม

หากต้องการแก้ไขข้อบกพร่องของกระบวนการเมื่อเริ่มต้น ให้ใช้ 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 ระงับกระบวนการที่ขัดข้องเพื่อให้คุณทำสิ่งต่อไปนี้ได้ แนบโปรแกรมแก้ไขข้อบกพร่อง ให้ตั้งค่าคุณสมบัติที่เหมาะสมดังนี้

  • หลังจาก 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

LLDB รองรับการแก้ไขข้อบกพร่องของโค้ดแพลตฟอร์ม โค้ด Visual Studio คุณสามารถใช้ฟรอนท์เอนด์ของโปรแกรมแก้ไขข้อบกพร่อง VS Code แทนอินเทอร์เฟซ LLDB CLI เพื่อควบคุมและ ดีบักโค้ดแบบเนทีฟที่ทำงานในอุปกรณ์

ก่อนใช้ VS Code เพื่อแก้ไขข้อบกพร่อง ให้ติดตั้ง ส่วนขยาย CodeLLDB

วิธีดีบักโค้ดโดยใช้ VS Code

  1. ตรวจสอบว่าอาร์ติแฟกต์ของบิลด์ทั้งหมด (เช่น สัญลักษณ์) ที่จำเป็นต่อการเรียกใช้ มี lldbclient.py หรือ lldbclient.py อยู่
  2. ใน VS Code ให้กด Ctrl+Shift+P เพื่อเรียกใช้คำสั่ง ค้นหา Debug: เพิ่มการกำหนดค่า... แล้วเลือก LLDB การดำเนินการนี้จะเปิดไฟล์ launch.json และเพิ่มออบเจ็กต์ JSON ใหม่ลงในรายการ
  3. แทนที่การกำหนดค่าโปรแกรมแก้ไขข้อบกพร่องที่เพิ่มใหม่ด้วยบรรทัดความคิดเห็น 2 บรรทัด // #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. เปิดแถบด้านข้างเรียกใช้และแก้ไขข้อบกพร่อง การกำหนดค่าใหม่ควรปรากฏใน รายการโปรแกรมแก้ไขข้อบกพร่อง กดเริ่มแก้ไขข้อบกพร่อง (F5) โปรแกรมแก้ไขข้อบกพร่องควรเชื่อมต่อหลังจาก 10-30 วินาที

    หากการกำหนดค่าใหม่ไม่ปรากฏในมุมมองเรียกใช้และแก้ไขข้อบกพร่อง ให้โหลดหน้าต่างซ้ำเพื่อ รีเฟรชรายการโปรแกรมแก้ไขข้อบกพร่อง - กด 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 และในคู่มือผู้ใช้ของ ส่วนขยาย CodeLLDB