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ệnhndk-gdb
không hỗ trợ xây dựng bằng phương thứcmake 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ínhandroid:debuggable
thànhtrue
. - 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.
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à |
--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 |
--launch=<name> |
Tuỳ chọn này tương tự như |
--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. |
--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, |
--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:
Ngoài ra, bạn có thể xác định biến môi trường |
--exec=<file> -x <file> |
Tuỳ chọn này yêu cầu |
--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 |
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.