แก้ไขข้อบกพร่องของโค้ดแพลตฟอร์ม

Android Studio for Platform (ASfP) มีโปรแกรมแก้ไขข้อบกพร่องที่มีประสิทธิภาพซึ่งช่วยให้คุณทำสิ่งต่อไปนี้ได้

  • เลือกอุปกรณ์ที่จะใช้แก้ไขข้อบกพร่อง
  • ตั้งค่าเบรกพอยต์ในโค้ด Java, Kotlin, C/C++ และ Rust
  • ตรวจสอบตัวแปรและประเมินนิพจน์ขณะรันไทม์

ก่อนใช้โปรแกรมแก้ไขข้อบกพร่อง คุณต้องแฟลชบิลด์ไปยังอุปกรณ์หรือโปรแกรมจำลอง

การแก้ไขข้อบกพร่องของกระบวนการแอป (Java/Kotlin)

วิธีแก้ไขข้อบกพร่องในกระบวนการสมัครเข้าร่วมโปรแกรม Java หรือ Kotlin

  1. ตั้งค่าเบรกพอยต์ในโค้ด Java หรือ Kotlin ภายใน ASfP

  2. เลือกเรียกใช้ > แนบดีบักเกอร์กับกระบวนการ Android จากเมนู

  3. ในกล่องโต้ตอบเลือกกระบวนการ ให้ตรวจสอบว่าได้ตั้งค่าประเภทการแก้ไขข้อบกพร่องเป็น Java เท่านั้น

  4. เลือกอุปกรณ์จากรายการ

  5. เลือกกระบวนการสมัครเฉพาะที่คุณต้องการแก้ไขข้อบกพร่อง

  6. คลิกตกลง

  7. โต้ตอบกับแอปพลิเคชันในอุปกรณ์เพื่อเข้าถึงจุดพัก

การแก้ไขข้อบกพร่องของกระบวนการของระบบ (C/C++)

วิธีแก้ไขข้อบกพร่องของกระบวนการของระบบที่เขียนด้วย C หรือ C++

  1. ตรวจสอบว่าคุณมีอุปกรณ์หรือโปรแกรมจำลองที่ทำงานอยู่เพียงเครื่องเดียว

  2. เปิดเทอร์มินัลและเรียกใช้ adb root จากรูทการชำระเงิน AOSP: bash adb root

  1. ตั้งค่าเบรกพอยต์ในโค้ด C/C++ ภายใน ASfP

  2. เลือกเรียกใช้ > แนบดีบักเกอร์กับกระบวนการ Android จากเมนู

  3. ในกล่องโต้ตอบเลือกกระบวนการ ให้เปลี่ยนประเภทการแก้ไขข้อบกพร่องเป็นเนทีฟ เท่านั้นหรือคู่ (Java + เนทีฟ)

  4. เลือกช่องแสดงกระบวนการทั้งหมดเพื่อดูกระบวนการของระบบ

  5. เลือกอุปกรณ์จากรายการ

  6. เลือกกระบวนการของระบบที่ต้องการแก้ไขข้อบกพร่อง (เช่น surfaceflinger หรือ system_server)

  7. คลิกตกลง

  8. โต้ตอบกับอุปกรณ์เพื่อเข้าถึงจุดพัก

การแก้ไขข้อบกพร่องของ Rust

ASfP รองรับการแก้ไขข้อบกพร่องของ Rust โดยใช้ Debug Adapter Protocol (DAP) กับ LLDB ส่วนนี้จะอธิบายวิธีตั้งค่า CodeLLDB เป็นเซิร์ฟเวอร์ Debug Adapter และแก้ไขข้อบกพร่องของโค้ด Rust ในโฮสต์และในอุปกรณ์ Android

ตั้งค่า CodeLLDB เป็นเซิร์ฟเวอร์อะแดปเตอร์การแก้ไขข้อบกพร่อง

  1. สร้างการกำหนดค่าการเรียกใช้/การแก้ไขข้อบกพร่องของ Debug Adapter Protocol ใหม่

    1. เลือกเรียกใช้ > แก้ไขการกำหนดค่าจากเมนู
    2. คลิกปุ่ม +
    3. เลือกโปรโตคอลอะแดปเตอร์การแก้ไขข้อบกพร่อง
  2. ในแท็บเซิร์ฟเวอร์ ให้คลิกสร้างเซิร์ฟเวอร์ใหม่

  3. ในกล่องโต้ตอบที่เปิดขึ้นใหม่ ให้คลิกเลือกเทมเพลต แล้วเลือก CodeLLDB จากรายการ

  4. หลังจากเลือกเทมเพลต CodeLLDB แล้ว ระบบจะเพิ่มเซิร์ฟเวอร์ใหม่พร้อมการกำหนดค่าที่กำหนดไว้ล่วงหน้า

    1. เปิดใช้การติดตามแบบละเอียดโดยเลือกแบบละเอียดในเมนูแบบเลื่อนลงการติดตาม
    2. เพิ่มตัวแปรสภาพแวดล้อมที่ระบุเส้นทางไปยัง lldb-server ใน แหล่งที่มาของ Android ที่สร้างไว้ล่วงหน้า
        LLDB_DEBUGSERVER_PATH=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/runtimes_ndk_cxx/x86_64/lldb-server
        ```
    
    Replace `REPO_ROOT` with the absolute path to your Android source checkout.
    To find `CLANG_VERSION`, run the `get_clang_version.py` script from the root of
    your Android source tree:
    
    ```bash
        ./build/soong/scripts/get_clang_version.py
    
    1. อย่าแก้ไขส่วน <<insert base directory>>

แก้ไขข้อบกพร่องไบนารี Rust ในโฮสต์

  1. เปิดแท็บการกำหนดค่าในการกำหนดค่าการเรียกใช้/การแก้ไขข้อบกพร่องของโปรโตคอล Debug Adapter
  2. เลือกเปิดตัวเป็นโหมดแก้ไขข้อบกพร่อง
  3. อัปเดตไดเรกทอรีการทำงาน แล้วเลือกไฟล์ไบนารีที่ต้องการ แก้ไขข้อบกพร่อง
  4. คลิก OK เพื่อบันทึกการกำหนดค่า
  5. เริ่มเซสชันการแก้ไขข้อบกพร่องโดยคลิกไอคอนแก้ไขข้อบกพร่องข้างการกำหนดค่า

เมื่อเรียกใช้เป็นครั้งแรก CodeLLDB จะดาวน์โหลด คุณควรเห็นร่องรอย DAP ในคอนโซล เบรกพอยท์ที่ตั้งไว้ในโค้ด Rust ควรจะทำงานตามที่คาดไว้

แก้ไขข้อบกพร่องของไบนารี Rust ในอุปกรณ์ Android (โหมดแนบ)

  1. ค้นหา PID: ระบุรหัสกระบวนการ (PID) ของแอปพลิเคชันที่คุณต้องการ แก้ไขข้อบกพร่องในอุปกรณ์ Android

  2. เริ่ม lldb-server ในอุปกรณ์: จากรูทของแผนผังแหล่งที่มาของ Android ให้เรียกใช้สคริปต์ lldbclient.py โดยแทนที่ <PID> ด้วยรหัสกระบวนการ

    lldbclient.py --setup-forwarding vscode-lldb -p <PID>
    

    สคริปต์นี้จะส่ง lldb-server ที่ถูกต้องไปยังอุปกรณ์ เริ่มต้น lldb-server ตั้งค่าการส่งต่อพอร์ต (พอร์ตโฮสต์ 5039 ไปยังอุปกรณ์) และแสดงผลการกำหนดค่า DAP JSON ที่จำเป็นสำหรับขั้นตอนถัดไป เปิดเทอร์มินัลนี้ไว้

  3. เริ่มตัวดัดแปลงการแก้ไขข้อบกพร่อง CodeLLDB ในโฮสต์

    • ไปที่ไดเรกทอรีส่วนขยาย CodeLLDB (ค่าเริ่มต้น: ~/.lsp4ij/dap/codelldb/extension/adapter)
    • ตั้งค่าตัวแปรสภาพแวดล้อมที่จำเป็นและเริ่มเซิร์ฟเวอร์อะแดปเตอร์ โดยแทนที่ REPO_ROOT และ CLANG_VERSION ตามที่กำหนดในการตั้งค่าเซิร์ฟเวอร์
        # Sets PYTHONHOME env variable
        export PYTHONHOME=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3
    
        # Tell the dynamic linker where to find python libs
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3/lib
    
        # Starts the CodeLLDB Debugger Adapter server on port 1234
        ./codelldb --liblldb REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/lib/liblldb.so --port 1234
    
  4. กำหนดค่าไคลเอ็นต์ ASfP DAP:

    1. กลับไปที่การกำหนดค่าการเรียกใช้/การแก้ไขข้อบกพร่องของโปรโตคอลอะแดปเตอร์การแก้ไขข้อบกพร่องใน ASfP
    2. เลือกแท็บการกำหนดค่า
    3. ตั้งค่าโหมดแก้ไขข้อบกพร่องเป็นแนบ
    4. ตั้งค่าที่อยู่เป็น localhost
    5. ตั้งค่าพอร์ตเป็น 1234
    6. วางเอาต์พุต JSON จากคำสั่ง lldbclient.py (ขั้นตอนที่ 2) ลงในช่องพารามิเตอร์ DAP (JSON)
  5. คลิกแก้ไขข้อบกพร่องเพื่อเริ่มเซสชันการแก้ไขข้อบกพร่อง

การแก้ปัญหา

  • หากเห็นข้อผิดพลาด error: Connection shut down by remote side while waiting for reply to initial handshake packet ให้สิ้นสุดเซสชันการแก้ไขข้อบกพร่องปัจจุบัน และรีสตาร์ท lldb-server ในอุปกรณ์และอะแดปเตอร์ CodeLLDB ในโฮสต์