Gỡ lỗi dự án

Gỡ lỗi trục trặc mã gốc

Nếu đang cố gắng hiểu một tệp báo cáo trục trặc mã gốc hoặc một tệp tombstone, thì bạn nên tham khảo nội dung cơ bản có trong bài viết Gỡ lỗi mã gốc trong nền tảng Android.

Để xem một danh mục đầy đủ hơn về các loại sự cố thường gặp cũng như cách điều tra các sự cố này, hãy xem nội dung Chẩn đoán trục trặc mã gốc.

Công cụ ndk-stack có thể giúp biểu tượng hoá sự cố của bạn. Bạn có thể khắc phục sự cố trong Android Studio theo mô tả trong tài liệu chung về Gỡ lỗi ứng dụng. Nếu muốn sử dụng dòng lệnh, thì bạn có thể dùng ndk-gdb để có thể đính kèm gdb hoặc lldb qua shell.

Cho phép ứng dụng truy cập trực tiếp vào dấu vết tombstone

Kể từ Android 12 (API cấp độ 31), bạn có thể truy cập vào tombstone về trục trặc mã gốc của ứng dụng dưới dạng một bộ đệm giao thức thông qua phương thức ApplicationExitInfo.getTraceInputStream(). Vùng đệm giao thức này được tuần tự hoá bằng cách sử dụng lược đồ này. Trước đây, cách duy nhất để truy cập vào thông tin này là thông qua Cầu gỡ lỗi Android (Android Debug Bridge – adb).

Sau đây là ví dụ về cách triển khai phương thức này trong ứng dụng của bạn:

ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);
for (ApplicationExitInfo aei: exitReasons) {
    if (aei.getReason() == REASON_CRASH_NATIVE) {
        // Get the tombstone input stream.
        InputStream trace = aei.getTraceInputStream();
        // The tombstone parser built with protoc uses the tombstone schema, then parses the trace.
        Tombstone tombstone = Tombstone.parseFrom(trace);
    }
}

Gỡ lỗi các vấn đề về bộ nhớ gốc

Address Sanitizer (HWASan/ASan)

HWAddress Sanitizer (HWASan) và Address Sanitizer (ASan) cũng tương tự như Valgrind nhưng nhanh hơn và hỗ trợ tốt hơn rất nhiều trên Android.

Đây là cách tốt nhất để gỡ lỗi bộ nhớ trên Android.

Gỡ lỗi Malloc

Xem các phần Gỡ lỗi MallocTheo dõi bộ nhớ gốc bằng lệnh gọi lại libc để nắm được nội dung mô tả toàn diện về các tuỳ chọn tích hợp sẵn của thư viện C để gỡ lỗi các vấn đề về bộ nhớ gốc.

Hook Malloc

Nếu bạn muốn xây dựng các công cụ của riêng mình, libc của Android cũng hỗ trợ chặn tất cả lệnh phân bổ/lệnh gọi tự do xảy ra trong quá trình thực thi chương trình. Xem tài liệu về malloc_hooks để nắm được hướng dẫn sử dụng.

Số liệu thống kê về Malloc

Android hỗ trợ các tiện ích mallinfo(3)malloc_info(3) cho <malloc.h>.

Chức năng malloc_info có trong Android 6.0 (Marshmallow) trở lên và lược đồ XML của chức năng này được ghi chép trong tiêu đề malloc.h của Bionic.

Phân tích tài nguyên

Để phân tích tài nguyên CPU cho mã gốc, bạn có thể sử dụng Simpleperf.