ADB Logcat 排查真机崩溃与日志分析
一、基础命令
1. 基本使用
# 查看实时日志adb logcat# 清空日志缓冲区adb logcat-c# 保存日志到文件adb logcat>crash.log# 显示时间戳adb logcat-vtime# 显示线程信息(推荐)adb logcat-vthreadtime2. 多设备情况
# 查看连接的设备adb devices# 指定设备adb-s<设备序列号>logcat二、日志级别过滤
Android 日志级别(由低到高):
| 级别 | 缩写 | 说明 |
|---|---|---|
| Verbose | V | 详细信息 |
| Debug | D | 调试信息 |
| Info | I | 一般信息 |
| Warn | W | 警告 |
| Error | E | 错误 |
| Fatal | F | 致命错误 |
# 只看 Error 及以上级别adb logcat *:E# 只看指定 TAG 的 Debug 级别adb logcat MyApp:D *:S# *:S 表示屏蔽其他所有日志三、崩溃排查核心方法
1. 抓取崩溃堆栈(关键)
# 过滤崩溃相关关键字adb logcat|grep-i"FATAL\|AndroidRuntime\|Exception"# Windows 下使用 findstradb logcat|findstr"FATAL AndroidRuntime"2. Java 崩溃(Crash)
崩溃时会打印FATAL EXCEPTION,重点关注:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.app, PID: 12345 java.lang.NullPointerException: ... at com.example.app.MainActivity.onCreate(MainActivity.java:45)排查要点:
FATAL EXCEPTION后的异常类型Caused by追踪根本原因at定位到具体的类和行号
3. Native 崩溃(NDK/C++)
# 过滤 native 崩溃adb logcat|grep-i"DEBUG\|backtrace\|signal"典型输出:
F/libc: Fatal signal 11 (SIGSEGV), code 1 ... F/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) F/DEBUG: backtrace: #00 pc 0000... /data/app/.../libnative.so常见 signal 含义:
| Signal | 含义 |
|---|---|
| SIGSEGV (11) | 内存访问违规(空指针、野指针) |
| SIGABRT (6) | 主动 abort(assert 失败) |
| SIGBUS (7) | 内存对齐错误 |
| SIGILL (4) | 非法指令 |
4. ANR(应用无响应)
# 拉取 ANR 日志文件adb pull /data/anr/traces.txt# 新版本 Androidadb shell"ls /data/anr/"adb pull /data/anr/anr_xxx四、高级过滤技巧
1. 按 PID 过滤(推荐)
# 先获取进程 PIDadb shell pidof com.example.app# 按 PID 过滤adb logcat--pid=<PID># 一行命令adb logcat--pid=$(adb shell pidof com.example.app)2. 按 TAG 和级别组合
# 查看 ActivityManager 的 Info 级别,屏蔽其他adb logcat ActivityManager:I *:S3. 正则过滤(Android 7.0+)
# 使用正则表达式adb logcat-e"Exception|Error"# 反向过滤(排除)adb logcat|grep-v"chatty"4. 缓冲区选择
# 查看所有缓冲区adb logcat-ball# 系统日志adb logcat-bsystem# 崩溃缓冲区adb logcat-bcrash# 事件日志adb logcat-bevents五、日志输出格式
# 常用格式说明adb logcat-v<格式>| 格式 | 说明 |
|---|---|
brief | 默认格式 |
time | 显示日期时间 |
threadtime | 显示时间+PID+TID(推荐) |
long | 显示所有字段 |
color | 彩色输出 |
# 推荐组合adb logcat-vthreadtime-vcolor六、实战流程
完整崩溃排查步骤
# 1. 清空旧日志adb logcat-c# 2. 开始记录并保存adb logcat-vthreadtime>crash_log.txt# 3. 复现崩溃操作...# 4. Ctrl+C 停止后分析文件一键抓取崩溃日志脚本
#!/bin/bashPACKAGE="com.example.app"adb logcat-cecho"开始监控崩溃,请复现问题..."adb logcat-vthreadtime|grep-E"FATAL|AndroidRuntime|$PACKAGE"|teecrash_$(date+%Y%m%d_%H%M%S).log七、Native 崩溃符号解析
对于 Native 崩溃,需要使用符号表解析地址:
# 使用 ndk-stack 工具adb logcat|ndk-stack-sym<项目>/obj/local/arm64-v8a# 或使用 addr2lineaddr2line-elibnative.so-f0x00001234八、常见问题速查
1. 日志被截断/丢失
# 增大缓冲区adb logcat-G16M# 查看缓冲区大小adb logcat-g2. chatty 日志聚合导致丢失
--------- beginning of ... ... chatty ... expire ... lines解决:增大缓冲区或关闭 chatty
3. 获取系统属性辅助分析
# 查看系统信息adb shell getprop ro.build.version.release# 查看内存状态adb shell dumpsys meminfo com.example.app九、辅助工具推荐
| 工具 | 用途 |
|---|---|
| Android Studio Logcat | 图形化过滤、搜索 |
| pidcat | 彩色化、按包名过滤 |
| ndk-stack | Native 崩溃符号解析 |
| Firebase Crashlytics | 线上崩溃收集 |
| bugreport | 完整系统报告 |
# 生成完整 bug 报告adb bugreport bug_report.zip