Cách đọc Android logcat: mức log, tag và bộ lọc
Đọc logcat Android, lọc theo mức log, tag và PID, rồi lần theo stack trace để tìm nguyên nhân crash bằng adb hoặc bảng Logcat của ADBKit.
Logcat là nhật ký hệ thống của Android: một bộ đệm vòng nơi hệ điều hành, các dịch vụ hệ thống và ứng dụng ghi thông điệp vào. Để đọc nó, hãy chạy adb logcat trên máy tính đã bật USB debugging, hoặc mở trình xem logcat trong một công cụ như ADBKit. Điều quan trọng không phải đọc hết mọi thứ, mà là lọc ra vài dòng giải thích được vấn đề.
Logcat ghi lại những gì
Mỗi dòng log có một mức, một tag và một thông điệp. Tag thường là tên thành phần ghi log (ActivityManager, OkHttp hoặc tên class của bạn). Log nằm trong nhiều bộ đệm khác nhau như main (log của ứng dụng), system, crash và events. Các bộ đệm này là vòng tròn, nên dòng cũ sẽ bị đẩy mất khi có dòng mới.
Các mức log, từ nhẹ đến nghiêm trọng:
| Ký hiệu | Mức | Thường dùng cho |
|---|---|---|
| V | Verbose | Theo dõi rất chi tiết |
| D | Debug | Chẩn đoán khi phát triển |
| I | Info | Sự kiện vòng đời bình thường |
| W | Warning | Bất thường nhưng vẫn phục hồi được |
| E | Error | Một thao tác đã thất bại |
| F | Fatal | Tình huống tiến trình không thể tiếp tục |
Đọc một dòng log
Với định dạng -v time, một dòng trông như sau:
10-06 14:03:21.456 E/AndroidRuntime( 1234): FATAL EXCEPTION: mainTừ trái sang phải: ngày giờ, mức log (E), tag (AndroidRuntime), ID tiến trình trong ngoặc (1234), rồi đến thông điệp. Định dạng threadtime mặc định trên Android hiện đại còn hiển thị thêm ID luồng cạnh PID:
10-06 14:03:21.456 1234 1250 E AndroidRuntime: FATAL EXCEPTION: mainPID là trường hữu ích nhất khi nhiều ứng dụng cùng ghi log ồn ào, vì một PID tương ứng với đúng một lần chạy của ứng dụng bạn.
Các lệnh adb logcat cần nhớ
adb logcat # stream live output
adb logcat -v time # use the time format shown above
adb logcat *:W # warnings and above, all tags
adb logcat -s MyTag # only the tag MyTag
adb logcat --pid=1234 # only one process
adb logcat -d # dump the buffer and exit
adb logcat -c # clear the buffer
adb logcat -b crash # read the crash bufferTìm PID của ứng dụng bằng adb shell pidof com.example.app. Bạn có thể kết hợp các tùy chọn, ví dụ adb logcat -v time --pid=1234 *:W. Khi cần gửi log cho người khác, ghi ra tệp bằng adb logcat -d > log.txt.
Note: Xóa bộ đệm bằng
-ctrước khi tái hiện lỗi sẽ cho bạn một bản log ngắn, sạch và dễ đọc.
Đọc stack trace
Khi ứng dụng crash, logcat in một stack trace Java hoặc Kotlin dưới dòng E/AndroidRuntime:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 1234
java.lang.RuntimeException: Unable to start activity
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ...
at com.example.app.MainActivity.onCreate(MainActivity.java:42)Hãy đọc theo thứ tự:
- Dòng đầu sau
FATAL EXCEPTIONcho biết exception xuất hiện bên ngoài. - Kéo xuống
Caused by:cuối cùng. Đó thường là nguyên nhân gốc. - Tìm dòng
atđầu tiên thuộc package của bạn (ở đây làMainActivity.java:42). Đó là chỗ để bắt đầu xem mã nguồn.
Các frame android.* hoặc java.* cho thấy framework đã đi đến đó thế nào; lỗi hiếm khi nằm ở đó.
Đọc logcat trong ADBKit
Không gian làm việc ADBKit có bảng Logcat chạy trên trình duyệt nền Chromium như Chrome hoặc Edge, không cần cài đặt và không cần tài khoản. Bảng này lấy log theo từng đợt, mặc định mỗi 2 giây, và bạn có thể đổi thành 1, 2, 5 hoặc 10 giây. Đây không phải luồng liên tục.
Bảng Logcat cung cấp:
- Lọc theo mức log từ verbose đến fatal.
- Tìm kiếm với tùy chọn phân biệt hoa thường và regex.
- Bao gồm/loại trừ tag, ví dụ
Foo, -NoisyhiệnFoovà ẩnNoisy. - Lọc theo PID và lọc theo ứng dụng đã cài, nên bạn xem được một ứng dụng mà không cần tra PID.
- Stack trace được gập lại: các dòng trace nằm dưới dòng lỗi và mở ra khi bạn cần.
- Menu chuột phải để ẩn hoặc hiện theo tag, tiến trình hoặc mẫu thông điệp.
- Tạm dừng, xóa, sao chép và xuất ra tệp văn bản.
Dữ liệu log chỉ đi giữa trình duyệt và điện thoại; ADBKit không có máy chủ nào nhận chúng. Nếu thiết bị không kết nối được, xem cách sửa lỗi ADB busy, unauthorized và no devices.
Quy trình debug thực tế
- Xóa log (
adb logcat -c, hoặc nút Clear trong bảng). - Đặt mức Warning hoặc Error, chọn ứng dụng của bạn trong bộ lọc ứng dụng hoặc theo PID.
- Tái hiện lỗi một lần.
- Tạm dừng khung xem. Tìm lỗi đầu tiên gần thời điểm sự cố; các lỗi sau thường chỉ là hệ quả.
- Mở stack trace, đi đến
Caused by:cuối cùng, rồi đến dòng mã của bạn. - Nếu chưa rõ nguyên nhân, hạ mức xuống Info hoặc Debug và mở rộng khoảng thời gian quanh dòng đó.
- Xuất hoặc sao chép các dòng liên quan để đính kèm báo cáo lỗi.
Những vụ crash làm chết tiến trình đôi khi để lại chi tiết trong bộ đệm crash, nên adb logcat -b crash -d đáng thử sau sự cố. Danh sách các lệnh khác có trong bảng tóm tắt lệnh adb.
Warning: Log có thể chứa tên tài khoản, token và dữ liệu cá nhân khác. Hãy xem lại tệp đã xuất trước khi đính kèm vào một issue công khai.