ndk-gdb

NDK bao gồm cả một tập lệnh shell có tên là ndk-gdb để bắt đầu một phiên gỡ lỗi gốc command-line. Nếu muốn sử dụng GUI (Giao diện người dùng đồ hoạ), người dùng nên đọc tài liệu về cách gỡ lỗi trong Android Studio.

Yêu cầu

Để tính năng gỡ lỗi gốc của dòng lệnh hoạt động, bạn phải đáp ứng các yêu cầu sau:

  • Dùng tập lệnh ndk-build để xây dựng ứng dụng. Tập lệnh ndk-gdb không hỗ trợ xây dựng bằng phương thức make APP=<name> cũ.
  • Bật tính năng gỡ lỗi ứng dụng trong tệp AndroidManifest.xml bằng cách thêm phần tử <application> có tác dụng đặt thuộc tính android:debuggable thành true.
  • Xây dựng ứng dụng sao cho ứng dụng có thể chạy trên Android 2.2 (Android API cấp 8) trở lên.
  • Gỡ lỗi trên thiết bị hoặc trình mô phỏng chạy Android 2.2 trở lên. Đối với mục đích gỡ lỗi, cấp độ API mục tiêu mà bạn khai báo trong tệp AndroidManifest.xml không quan trọng.
  • Phát triển ứng dụng trong vỏ Unix. Trên Windows, hãy sử dụng phương thức triển khai Cygwin hoặc ndk-gdb-py Python thử nghiệm.
  • Sử dụng GNU Make 3.81 trở lên.

Cách sử dụng

Để gọi tập lệnh ndk-gdb, hãy đổi sang thư mục ứng dụng hoặc bất kỳ thư mục nào khác trong đó. Ví dụ:

cd $PROJECT
$NDK/ndk-gdb

Ở đây, $PROJECT trỏ đến thư mục gốc của dự án và $NDK trỏ đến đường dẫn cài đặt NDK.

Khi bạn gọi ndk-gdb, lệnh này sẽ định cấu hình phiên để tìm tệp nguồn và phiên bản ký hiệu/gỡ lỗi của thư viện gốc đã tạo. Khi đính kèm thành công vào quy trình ứng dụng, ndk-gdb sẽ xuất ra một loạt dài các thông báo lỗi, lưu ý về việc không tìm thấy các thư viện hệ thống khác nhau. Điều này là bình thường, vì máy chủ lưu trữ không chứa phiên bản ký hiệu/gỡ lỗi của những thư viện này trên thiết bị mục tiêu. Bạn có thể yên tâm bỏ qua những thông báo này.

Tiếp theo, ndk-gdb sẽ hiển thị lời nhắc GDB bình thường.

Bạn tương tác với ndk-gdb theo cách tương tự như với GDB GNU. Ví dụ: Bạn có thể sử dụng b <location> để đặt các điểm ngắt và c (cho "continue" (tiếp tục)) nhằm tiếp tục thực thi. Để biết danh sách đầy đủ các lệnh, hãy xem hướng dẫn sử dụng GDB. Nếu bạn muốn sử dụng Trình gỡ lỗi LLDB, hãy sử dụng tuỳ chọn --lldb khi gọi tập lệnh ndk-gdb.

Lưu ý: Khi bạn thoát lời nhắc GDB, quy trình của ứng dụng mà bạn đang gỡ lỗi sẽ dừng lại. Hành vi này là một điểm hạn chế của gdb.

ndk-gdb xử lý nhiều điều kiện lỗi và hiển thị một thông báo lỗi bổ ích nếu tìm thấy sự cố. Các hoạt động kiểm tra này bao gồm việc đảm bảo rằng bạn đáp ứng các điều kiện sau:

  • Kiểm tra để đảm bảo rằng ADB ở trong đường dẫn.
  • Kiểm tra để đảm bảo rằng ứng dụng được khai báo là có thể gỡ lỗi trong tệp kê khai.
  • Kiểm tra để đảm bảo rằng trên thiết bị, ứng dụng đã cài đặt có cùng tên gói cũng có thể gỡ lỗi.

Theo mặc định, ndk-gdb sẽ tìm kiếm một quy trình đăng ký đang chạy và hiển thị lỗi nếu không tìm thấy quy trình nào. Tuy nhiên, bạn có thể sử dụng tuỳ chọn --start hoặc --launch=<name> để tự động bắt đầu hoạt động trước phiên gỡ lỗi. Để biết thêm thông tin, hãy xem phần Tuỳ chọn.

Tuỳ chọn

Để xem danh sách đầy đủ các tuỳ chọn, hãy nhập ndk-gdb --help vào dòng lệnh. Bảng 1 cho thấy một số loại tuỳ chọn thường dùng hơn, cùng với nội dung mô tả ngắn.

Bảng 1. Các tuỳ chọn ndk-gdb phổ biến kèm nội dung mô tả.

Việc bắt đầu ndk-gdb khi đã chỉ định tuỳ chọn này sẽ khởi chạy hoạt động có thể khởi chạy đầu tiên được liệt kê trong tệp kê khai của ứng dụng. Sử dụng --launch=<name> để bắt đầu hoạt động có thể khởi chạy tiếp theo. Để huỷ danh sách các hoạt động có thể khởi chạy, hãy chạy --launch-list từ dòng lệnh.

Tuỳ chọn Mô tả>
--lldb

Nếu được đặt, tập lệnh sẽ sử dụng Trình gỡ lỗi LLDB cho phiên thay vì gdb.

--verbose

Tuỳ chọn này yêu cầu hệ thống xây dựng hiển thị (print) thông tin chi tiết về việc thiết lập phiên gỡ lỗi gốc. Điều này chỉ cần thiết đối với các sự cố gỡ lỗi khi trình gỡ lỗi không thể kết nối với ứng dụng và thông báo lỗi mà ndk-gdb hiển thị là không đủ.

--force Theo mặc định, ndk-gdb sẽ huỷ nếu phát hiện một phiên gỡ lỗi gốc khác đã chạy trên cùng một thiết bị. Tuỳ chọn này sẽ tắt phiên kia và thay thế bằng một phiên mới. Lưu ý: Tuỳ chọn này không tắt ứng dụng thực tế đang được gỡ lỗi mà bạn phải tắt riêng.
--start

Theo mặc định, khi bạn bắt đầu ndk-gdb, tuỳ chọn này sẽ cố đính kèm vào một thực thể đang chạy hiện có của ứng dụng trên thiết bị mục tiêu. Bạn có thể ghi đè hành vi mặc định này bằng cách sử dụng --start để khởi chạy ứng dụng rõ ràng trên thiết bị mục tiêu trước phiên gỡ lỗi.

--launch=<name>

Tuỳ chọn này tương tự như --start, ngoại trừ việc tuỳ chọn này cho phép bạn bắt đầu một hoạt động cụ thể từ ứng dụng. Tính năng này chỉ hữu ích nếu tệp kê khai xác định nhiều hoạt động có thể khởi chạy.

--launch-list

Tuỳ chọn tiện lợi này sẽ hiển thị (print) danh sách tên tất cả hoạt động có thể khởi chạy trong tệp kê khai ứng dụng. --start sử dụng tên hoạt động đầu tiên.

--project=<path> Tuỳ chọn này chỉ định thư mục dự án ứng dụng. Đây là tuỳ chọn hữu ích nếu bạn muốn khởi chạy tập lệnh mà không phải thay đổi sang thư mục dự án trước.
--port=<port>

Theo mặc định, ndk-gdb sử dụng cổng TCP 5039 cục bộ để giao tiếp với ứng dụng đang được gỡ lỗi trên thiết bị mục tiêu. Khi sử dụng một cổng khác, bạn có thể gỡ lỗi gốc cho các chương trình chạy trên nhiều thiết bị khác nhau hoặc trình mô phỏng được kết nối với cùng một máy chủ.

--adb=<file>

Tuỳ chọn này chỉ định tệp thực thi của công cụ adb. Tuỳ chọn này chỉ cần thiết nếu bạn chưa đặt đường dẫn để bao gồm tệp thực thi đó.

  • -d
  • -e
  • -s <serial>
  • Các cờ này tương tự như các lệnh adb cùng tên. Đặt các cờ này nếu bạn có một số thiết bị hoặc trình mô phỏng được kết nối với máy chủ. Ý nghĩa của từng cờ như sau:

    -d
    Kết nối với một thiết bị thực tế.
    -e
    Kết nối với một thiết bị trình mô phỏng.
    -s <serial>
    Kết nối với một thiết bị hoặc trình mô phỏng cụ thể. Ở đây, <serial> là tên của thiết bị theo thông tin do lệnh adb devices liệt kê.

    Ngoài ra, bạn có thể xác định biến môi trường ADB_SERIAL để liệt kê một thiết bị cụ thể mà không cần có tuỳ chọn cụ thể.

  • --exec=<file>
  • -x <file>
  • Tuỳ chọn này yêu cầu ndk-gdb chạy các lệnh khởi chạy GDB có trong <file> sau khi kết nối với quy trình đang được gỡ lỗi. Đây là một tính năng hữu ích nếu bạn muốn lặp đi lặp lại hành động nào đó, chẳng hạn như thiết lập danh sách các điểm ngắt, sau đó tự động tiếp tục thực thi.

    --nowait

    Tắt tính năng tạm dừng mã Java cho đến khi GDB kết nối. Việc truyền tuỳ chọn này có thể khiến trình gỡ lỗi bỏ lỡ các điểm ngắt sớm.

    --tui -t

    Bật Giao diện người dùng dạng văn bản (Text User Interface) nếu có.

    --gnumake-flag=<flag>

    Tuỳ chọn này là một (hoặc các) cờ bổ sung cần truyền tới hệ thống ndk-build khi truy vấn cờ để biết thông tin về dự án. Bạn có thể sử dụng nhiều thực thể của tuỳ chọn này trong cùng một lệnh.

    Lưu ý: Ba tuỳ chọn cuối cùng trong bảng này chỉ dành cho phiên bản Python của ndk-gdb.

    Hỗ trợ luồng

    Nếu ứng dụng chạy trên một nền tảng cũ hơn Android 2.3 (API cấp 9), thì ndk-gdb sẽ không thể gỡ lỗi các luồng gốc đúng cách. Trình gỡ lỗi chỉ có thể gỡ lỗi luồng chính, abd sẽ hoàn toàn bỏ qua việc thực thi các luồng khác.

    Nếu bạn đặt một điểm ngắt trên một hàm được thực thi trên luồng không phải là luồng chính, chương trình sẽ thoát và GDB sẽ hiển thị thông báo sau:

    Program terminated with signal SIGTRAP, Trace/breakpoint trap.
          The program no longer exists.