抓取ANR log的方法

ANR简介

APP出现进程无响应之后,系统通常会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”,但是无法定位导致出现anr的原因。我们可以通过抓取anr log,帮助我们定位导致APP出现anr的原因。APP运行出现anr的同时,会在data目录下生成一个 anr 的文件,anr log存储在此文件夹下,将其导出即可。

查看APP ANR文件的方法

手机连接USB ,进入CMD命令窗口,输入以下命令:
 >adb shell  
$ su 
# cd data  
# ls 
在列出的文件列表有一个 anr 文件; 

导出anr log的方法

进入CMD命令窗口,输入以下命令: 
> adb pull /data/anr/traces.txt D:\  
即可将APP生成的anr log文件导出到PC D盘根目录下。
PS:APP生成的anr log存储在手机/data/anr目录下的traces.txt文件里。

定位ANR异常

log日志如下:
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 obj=0x74a50f90 self=0x7fa197ba00
| sysTid=2588 nice=-1 cgrp=top_visible sched=0/0 handle=0x7fa5ebb000
| state=S schedstat=( 1613773720 221538200 2428 ) utm=133 stm=28 core=3 HZ=100
| stack=0x7fcc7c8000-0x7fcc7ca000 stackSize=8MB
| held mutexes=
kernel: __switch_to+0x74/0x8c
kernel: futex_wait_queue_me+0xd8/0x168
kernel: futex_wait+0xe4/0x234
kernel: do_futex+0x184/0xa54
kernel: SyS_futex+0x88/0x19c
kernel: cpu_switch_to+0x48/0x4c
native: #00 pc 000000000001cef0 /system/lib64/libc.so (syscall+28)
native: #01 pc 00000000000679c4 /system/lib64/libc.so (_ZL33__pthread_mutex_lock_with_timeoutP24pthread_mutex_internal_tPK8timespeci.constprop.0+260)
native: #02 pc 0000000000067d4c /system/lib64/libc.so (pthread_mutex_lock+36)
native: #03 pc 00000000000da578 /data/app/com.yzxdemo-1/lib/arm64/libUGo.so (_ZN9Conductor26VideoSetSendReciveRotationEjj+44)
native: #04 pc 00000000000b4208 /data/app/com.yzxdemo-1/lib/arm64/libUGo.so (_Z33me_video_set_send_recive_rotationjj+40)
native: #05 pc 000000000006cbbc /data/app/com.yzxdemo-1/oat/arm64/base.odex (int com.gl.softphone.UGoManager.UGoVideoSetSendReciveRotation(int, int)+144)
native: #06 pc 000000000006f3a0 /data/app/com.yzxdemo-1/oat/arm64/base.odex (int com.gl.softphone.UGoManager.pub_UGoVideoSetSendReciveRotation(int, int)+84)
native: #07 pc 000000000008cd88 /data/app/com.yzxdemo-1/oat/arm64/base.odex (void com.yzx.api.UCSCall.videoSetSendReciveRotation(int, int)+124)
native: #08 pc 0000000000136d3c /data/app/com.yzxdemo-1/oat/arm64/base.odex (void com.yzxdemo.activity.VideoConverseActivity$4.onSensorChanged(android.hardware.SensorEvent)+528)
native: #09 pc 0000000000ee5e68 /data/dalvik-cache/arm64/system@framework@boot.oat (???)
at com.gl.softphone.UGoManager.UGoVideoSetSendReciveRotation(Native method)
at com.gl.softphone.UGoManager.pub_UGoVideoSetSendReciveRotation(UGoManager.java:280)
- locked <0x0b2f89b7> (a com.gl.softphone.UGoManager)
at com.yzx.api.UCSCall.videoSetSendReciveRotation(UCSCall.java:1050)
at com.yzxdemo.activity.VideoConverseActivity$4.onSensorChanged(VideoConverseActivity.java:434)
at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:496)
at android.os.MessageQueue.nativePollOnce(Native method)
at android.os.MessageQueue.next(MessageQueue.java:330)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5665)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:822)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:712)
我们从traces.txt异常日志文件中导出了关键日志,其中红色的这两行可以定位出问题的所在。

<think>我们正在回答用户关于如何使用ADB抓取Android设备日志(logcat)的问题。根据引用内容,我们可以总结出几种方法,并提供示例。用户要求一个示例教程,因此我们需要提供详细的步骤。参考引用:[^1]:提到可以通过adb命令运行logcat,并说明需要进入platform-tools目录执行命令。[^2]:提到使用adb和bat命令组合快速抓取崩溃日志。[^3]:提到在出现Crash、ANR等情况时使用adb抓取日志。[^4]:提到使用ADB命令控制logcat日志本地存储功能,特别是在无法进入图形界面的情况下。我们将提供以下内容:1.基本命令:如何通过adblogcat命令抓取日志。2.将日志输出到文件方法。3.过滤日志方法(例如,按优先级、标签等)。4.抓取崩溃日志(特别是Crash和ANR)的常用方法。5.在设备无法启动图形界面时如何抓取日志(参考引用[4])。注意:由于用户要求示例教程,我们将给出具体的命令示例。步骤:第一步:准备工作-安装AndroidSDK,并配置环境变量(确保adb命令可用)。-打开命令行(Windows下为CMD或PowerShell,Mac/Linux下为终端)。-连接Android设备(通过USB或Wi-Fi),并确保设备已开启USB调试模式。第二步:基本命令-查看设备连接:`adbdevices`-抓取实时日志:`adblogcat`第三步:将日志保存到文件-`adblogcat>logcat.txt`(将日志输出到当前目录的logcat.txt文件中,按Ctrl+C停止)第四步:过滤日志-按优先级过滤:`adblogcat*:E`(只显示错误级别的日志)优先级:V(Verbose),D(Debug),I(Info),W(Warning),E(Error),F(Fatal),S(Silent)-按标签和优先级:`adblogcatMyApp:D*:S`(只显示标签为MyApp的Debug及以上级别的日志,其他标签静默)第五步:抓取崩溃日志(Crash和ANR)-崩溃日志通常会在日志中打印堆栈信息,我们可以通过过滤特定标签来获取:`adblogcat*:E`(因为崩溃通常是Error级别)-也可以专门抓取ANR日志(ApplicationNotResponding):ANR日志通常保存在设备的`/data/anr/traces.txt`文件中,可以通过以下命令拉取:`adbpull/data/anr/traces.txt`注意:在Android8.0及以上,ANR日志可能不在这个位置,可以使用以下命令:`adbshell"cat/data/anr/traces.txt">anr_log.txt`第六步:在设备无法启动图形界面时抓取日志(例如开机日志)-引用[4]提到,可以通过ADB命令启用日志存储,但这里我们更关心如何抓取开机日志。-方法:在设备启动时就开始抓取日志,因为adb在设备启动过程中可能无法立即连接,所以需要等待设备连接。我们可以使用循环来等待设备并抓取日志(适用于Linux/Mac,Windows下可以使用类似思路的批处理):```adbwait-for-deviceadblogcat>boot_log.txt```或者,为了确保抓取到完整的开机日志,可以先清空日志缓存,然后重启设备并立即开始抓取:```adblogcat-c#清空日志缓存(需要设备已连接并可用)adbreboot#重启设备(可选,如果设备已经重启则不需要)adbwait-for-deviceadblogcat>boot_log.txt```第七步:使用批处理文件(Windows)或Shell脚本(Mac/Linux)自动化-引用[2]提到使用bat命令组合快速抓取崩溃日志,我们可以创建一个bat文件(Windows):例如,创建一个`grab_log.bat`文件,内容如下:```adblogcat-vtime>%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%_logcat.log```这个命令会将日志按时间输出到以当前日期时间命名的文件中。注意:以上命令可能需要根据实际情况调整。由于用户要求示例教程,我们将按照步骤详细说明。下面开始组织回答:</think>### 如何使用 ADB 抓取 Android 设备日志 (logcat) 教程 #### 一、基础环境配置 1. **安装 ADB 工具** - 下载 [Android SDK Platform-Tools](https://developer.android.com/studio/releases/platform-tools) - 解压后配置系统环境变量(将 `platform-tools` 路径添加到 `PATH`) - 验证安装:终端执行 `adb version` 显示版本号即成功[^1] 2. **设备端准备** - 开启手机 **开发者模式**(设置 → 关于手机 → 连点 7 次"版本号") - 启用 **USB 调试**(开发者选项 → USB 调试) - 通过 USB 连接电脑,手机弹窗选择"允许调试" --- #### 二、核心抓取命令 ```bash # 实时查看日志(Ctrl+C 停止) adb logcat # 保存日志到本地文件 adb logcat > logcat.txt # 抓取崩溃日志(Crash/ANR) adb logcat *:E > crash_log.txt # 仅抓取错误级别日志[^3] # 按标签过滤日志(如只抓取系统错误) adb logcat -s "AndroidRuntime" "System.err" ``` --- #### 三、高级场景操作 1. **抓取完整开机日志** ```bash adb logcat -c # 清空旧日志缓存[^4] adb reboot # 重启设备 adb wait-for-device adb logcat -v time > boot_log.txt ``` 2. **自动化抓取脚本**(Windows Batch 示例) ```batch @echo off set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2% adb logcat -v time > log_%timestamp%.txt echo 日志已保存至 log_%timestamp%.txt ``` 双击运行即可生成带时间戳的日志文件[^2] 3. **WiFi 调试抓取**(无需 USB) ```bash adb tcpip 5555 # USB 模式下启用 TCP adb connect 设备IP:5555 adb logcat -d > wifi_log.txt ``` --- #### 四、日志分析技巧 | 过滤命令 | 作用 | 示例 | |-------------------|-------------------------------|--------------------------| | `*:V` | 显示所有详细日志 | `adb logcat *:V` | | `*:E` | 仅显示错误日志 | `adb logcat *:E` | | `-s TAG1:TAG2` | 按标签过滤 | `adb logcat -s ActivityManager` | | `--pid=<PID>` | 按进程 ID 过滤 | `adb logcat --pid=1234` | | `-b events` | 抓取系统事件日志 | `adb logcat -b events` | --- #### 五、常见问题解决 - **设备未识别**: ```bash adb kill-server && adb start-server # 重启 ADB 服务 adb devices # 检查设备列表 ``` - **权限不足**: - 手机确认"允许 USB 调试"弹窗 - 执行 `adb root` 获取 root 权限(需已 ROOT 设备) - **日志过大**: ```bash adb logcat -G 2M # 设置缓冲区大小为 2MB adb logcat -c # 清空缓冲区后重新抓取 ``` > **关键提示**: > - 抓取崩溃日志时优先使用 `*:E` 过滤错误信息[^3] > - 系统级问题(如开机故障)需结合内核日志 `adb shell dmesg > dmesg.log` > - 使用 `-v time` 参数添加时间戳便于问题追踪[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值