Sử dụng Trình gỡ lỗi

Trang này trình bày chi tiết về cách sử dụng LLDB để phát triển hệ điều hành. Để phát triển ứng dụng, hãy xem Gỡ lỗi ứng dụng của bạn để giải thích cách sử dụng GUI của Android Studio (dựa trên LLDB).

GDB không còn được hỗ trợ hoặc cung cấp nữa. Nếu bạn đang chuyển từ GDB sang LLDB, có lẽ bạn nên bắt đầu bằng cách đọc Hướng dẫn LLDB . Nếu bạn là người dùng GDB chuyên nghiệp, bản đồ lệnh GDB sang LLDB rất hữu ích khi chuyển đổi.

Điều kiện tiên quyết

Để sử dụng trình gỡ lỗi:

  • Thiết lập môi trường xây dựng bằng lệnh envsetup.sh thông thường.
  • Chạy lệnh lunch giống như bạn đã sử dụng khi xây dựng. Lưu ý rằng món ăn trưa phải khớp chính xác với thiết bị bạn đang gỡ lỗi. Nếu món ăn trưa không khớp với thiết bị đi kèm, bạn sẽ gặp lỗi dạng: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Kết nối thiết bị của bạn với máy.

Để được trợ giúp thêm về việc thiết lập môi trường của bạn, hãy xem Thiết lập môi trường .

Gỡ lỗi nhị phân

Để gỡ lỗi tệp nhị phân mà bạn đã tạo trên máy của mình, trước tiên, bạn phải sao chép tệp nhị phân vào thiết bị rồi khởi chạy trình gỡ lỗi. Ví dụ:

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

Gỡ lỗi các ứng dụng hoặc tiến trình đang chạy

Để kết nối với một ứng dụng đang chạy hoặc daemon gốc, hãy sử dụng lldbclient.py với PID. Ví dụ: để gỡ lỗi quy trình với PID 1234, hãy chạy quy trình này trên máy chủ:

lldbclient.py -p 1234

Tập lệnh thiết lập chuyển tiếp cổng, khởi động sơ khai gỡ lỗi từ xa thích hợp trên thiết bị, khởi động trình gỡ lỗi trên máy chủ, định cấu hình nó để tìm các biểu tượng và kết nối nó với sơ khai gỡ lỗi từ xa.

Gỡ lỗi khởi động quy trình gốc

Để gỡ lỗi một quá trình khi nó bắt đầu, hãy sử dụng lldbclient.py với tùy chọn -r . Ví dụ: để gỡ lỗi ls /bin , hãy chạy cái này trên Máy chủ:

lldbclient.py -r /system/bin/ls /bin

Sau đó, nhập continue tại dấu nhắc của trình gỡ lỗi.

Gỡ lỗi khởi động ứng dụng

Đôi khi bạn muốn gỡ lỗi một ứng dụng khi nó khởi động, chẳng hạn như khi xảy ra sự cố và bạn muốn duyệt qua mã để xem điều gì đã xảy ra trước sự cố. Việc đính kèm có hiệu quả trong một số trường hợp, nhưng trong những trường hợp khác là không thể thực hiện được do ứng dụng gặp sự cố trước khi bạn có thể đính kèm. Cách tiếp cận logwrapper (được sử dụng cho strace ) không phải lúc nào cũng hoạt động vì ứng dụng có thể không có quyền mở cổng và lldbserver kế thừa hạn chế đó.

Để gỡ lỗi khi khởi động ứng dụng, hãy sử dụng tùy chọn nhà phát triển trong Cài đặt để hướng dẫn ứng dụng đợi trình gỡ lỗi Java đính kèm:

  1. Đi tới Cài đặt > Tùy chọn nhà phát triển > Chọn ứng dụng gỡ lỗi và chọn ứng dụng của bạn từ danh sách, sau đó nhấp vào Chờ trình gỡ lỗi .
  2. Khởi động ứng dụng từ trình khởi chạy hoặc bằng cách sử dụng dòng lệnh để chạy:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Đợi ứng dụng tải và hộp thoại xuất hiện cho bạn biết ứng dụng đang chờ trình gỡ lỗi.
  4. Đính kèm lldbserver / lldbclient bình thường, đặt điểm ngắt, sau đó tiếp tục quá trình.

Để cho phép ứng dụng chạy, hãy đính kèm trình gỡ lỗi Giao thức dây gỡ lỗi Java (JDWP), chẳng hạn như Trình gỡ lỗi Java (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

Gỡ lỗi ứng dụng hoặc quy trình bị lỗi

Nếu bạn muốn debuggerd tạm dừng các quy trình bị lỗi để bạn có thể đính kèm trình gỡ lỗi, hãy đặt thuộc tính thích hợp:

  • Sau Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 trở xuống
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow trở xuống
    adb shell setprop debug.db.uid 999999
    

Ở cuối đầu ra sự cố thông thường, debuggerd cung cấp hướng dẫn sao chép và dán trong logcat cho biết cách kết nối trình gỡ lỗi với quy trình bị lỗi.

Gỡ lỗi bằng mã VS

LLDB hỗ trợ gỡ lỗi mã nền tảng trên Visual Studio Code . Bạn có thể sử dụng giao diện người gỡ lỗi VS Code thay vì giao diện LLDB CLI để kiểm soát và gỡ lỗi mã gốc chạy trên thiết bị.

Trước khi sử dụng VS Code để gỡ lỗi, hãy cài đặt tiện ích mở rộng CodeLLDB .

Để gỡ lỗi mã bằng Mã VS:

  1. Đảm bảo rằng tất cả các tạo phẩm xây dựng (chẳng hạn như ký hiệu) cần thiết để chạy lldbclient.py hoặc lldbclient.py đều có mặt.
  2. Trong Mã VS, nhấn Ctrl+Shift+P để chạy lệnh, tìm kiếm Debug: Add Configuration... , sau đó chọn LLDB . Thao tác này sẽ mở tệp launch.json và thêm đối tượng JSON mới vào danh sách.
  3. Thay thế cấu hình trình gỡ lỗi mới được thêm bằng hai dòng nhận xét - // #lldbclient-generated-begin// #lldbclient-generated-end , để danh sách cấu hình của bạn trông như thế này:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py sử dụng những nhận xét này để phát hiện vị trí ghi cấu hình. Nếu có các mục khác trong danh sách, hãy thêm dòng chú thích vào cuối sau các cấu hình khác.

  4. Chạy lệnh sau trong thiết bị đầu cuối nơi bạn đã chạy envsetup.shlunch :
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py ghi cấu hình đã tạo vào launch.json và tiếp tục chạy. Điều này được mong đợi; đừng tắt chương trình lldbclient.py . Nếu bạn bỏ qua --vscode-launch-file tập lệnh sẽ in đoạn mã JSON mà bạn cần sao chép và dán vào launch.json theo cách thủ công.

    Cờ -r phải là cờ cuối cùng nếu nó xuất hiện do cách công cụ phân tích cú pháp cờ.

  5. Mở thanh bên Chạy và Gỡ lỗi - cấu hình mới sẽ xuất hiện trong danh sách trình gỡ lỗi. Nhấn Bắt đầu gỡ lỗi (F5) . Trình gỡ lỗi sẽ kết nối sau 10 đến 30 giây.

    Nếu cấu hình mới không xuất hiện trong chế độ xem Chạy và Gỡ lỗi, hãy tải lại cửa sổ để làm mới danh sách trình gỡ lỗi - nhấn Ctrl+Shift+P và nhập reload window .

  6. Khi bạn gỡ lỗi xong, hãy đi tới thiết bị đầu cuối đang chạy lldbclient.py và nhấn Enter để kết thúc chương trình lldbclient.py . Các lần chạy tập lệnh tiếp theo sẽ tạo cấu hình giữa các nhận xét #lldbclient-generated và thay thế nội dung cũ, bạn không cần phải xóa chúng theo cách thủ công.

Để thêm thuộc tính tùy chỉnh vào cấu hình khởi chạy đã tạo, bạn có thể sử dụng cờ --vscode-launch-props . Ví dụ:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
Các thuộc tính mẫu sẽ làm cho VS Code chạy một tác vụ có tên Build trước khi gỡ lỗi và nối thêm bước khởi tạo gỡ lỗi mới vào các bước do tập lệnh tạo ra. Bạn có thể tìm thấy thông tin tổng quan về các thuộc tính có sẵn trong tài liệu VS Code và trong Hướng dẫn sử dụng của tiện ích mở rộng CodeLLDB .