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

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

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

หากต้องการเชื่อมต่อกับแอปที่ทำงานอยู่หรือเดรัมเนทีฟ ให้ใช้ 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. เริ่มแอปจาก Launcher หรือใช้บรรทัดคำสั่งเพื่อเรียกใช้
    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 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. แทนที่การกําหนดค่าโปรแกรมแก้ไขข้อบกพร่องที่เพิ่มใหม่ด้วยบรรทัดความคิดเห็น 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 ด้วยตนเอง

    Flag -r ต้องเป็น Flag สุดท้ายหากมี เนื่องจากเครื่องมือจะแยกวิเคราะห์ Flag

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

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

  6. เมื่อแก้ไขข้อบกพร่องเสร็จแล้ว ให้ไปที่เทอร์มินัลที่ทำงานอยู่ lldbclient.py แล้วกด Enter เพื่อสิ้นสุดโปรแกรม lldbclient.py การเรียกใช้สคริปต์ในภายหลังจะสร้างการกําหนดค่าระหว่างความคิดเห็น #lldbclient-generated และแทนที่เนื้อหาเก่า คุณจึงไม่ต้องนําความคิดเห็นออกด้วยตนเอง

หากต้องการเพิ่มพร็อพเพอร์ตี้ที่กำหนดเองลงในการกำหนดค่าการเปิดตัวที่สร้างขึ้น ให้ใช้ Flag --vscode-launch-props เช่น

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
พร็อพเพอร์ตี้ตัวอย่างจะทำให้ VS Code เรียกใช้งานชื่อ Build ก่อนการแก้ไขข้อบกพร่อง และเพิ่มขั้นตอนเริ่มต้นการแก้ไขข้อบกพร่องใหม่ต่อท้ายขั้นตอนที่สร้างขึ้นโดยสคริปต์ คุณดูภาพรวมของพร็อพเพอร์ตี้ที่ใช้ได้ใน เอกสารประกอบของ VS Code และในคู่มือผู้ใช้ของ ส่วนขยาย CodeLLDB