使用Android Studio 分析错误报告 - 慕课网
文章推薦指數: 80 %
1. 获取错误报告 · 1.1 从真机设备上获取 · 1.2 从Android 模拟器上获取 · 1.3 使用adb 命令获取.
章节索引:
AndroidStudio如何分析错误报告
前面的小节我们介绍了调试布局方面的知识,可以有效的帮助我们解决布局显示异常,本小结我们学习如何获取和分析错误报告。
1.获取错误报告
错误报告包含设备日志、堆栈轨迹和其他诊断信息,可以帮助我们查找和修复应用中的错误。
我们可以通过以下几种方式从设备上获取错误报告。
1.1从真机设备上获取
如需直接从我们的设备上获取错误报告,请执行以下操作:
确保已启用开发者选项;
在开发者选项中,点按错误报告;
选择所需的错误报告类型,然后点按报告;
稍后,我们便会收到错误报告已准备就绪的通知。
要分享错误报告,请点按该通知。
1.2从Android模拟器上获取
在Android模拟器中,我们可以使用Extendedcontrols窗口中的Bugreport功能:
点击模拟器面板中的More图标;
在Extendedcontrols窗口中,选择左侧的Bugreport;
此时系统会打开一个屏幕,我们可以在其中查看错误报告详细信息,例如屏幕截图、AVD配置信息和错误报告日志。
我们还可以输入一条包含复制步骤的消息,以便与报告一起保存。
等待错误报告完成收集,然后点击SaveReport。
1.3使用adb命令获取
如果我们只连接了一台设备,则可以使用adb获取错误报告,如下所示:
$adbbugreportD:\Reports
Tips:如果没有指定错误报告的路径,则系统会将其保存到本地目录。
如果我们连接了多台设备,则必须使用-s选项指定设备。
运行以下adb命令可获取设备序列号并生成错误报告:
$adbdevices
Listofdevicesattached
emulator-5554device
8XV7N15C31003476device
$adb-s8XV7N15C31003476bugreport
2.错误报告文件内容
默认情况下,错误报告是ZIP文件。
ZIP文件名类似bugreport-BUILD_ID-DATE.zip,它可能会包含多个文件,但最重要的文件是bugreport-BUILD_ID-DATE.txt。
此文件就是错误报告,它包含系统服务(dumpsys)、错误日志(dumpstate)和系统消息日志(logcat)的诊断输出。
系统消息包括设备抛出错误时的堆栈轨迹,以及从所有应用中使用Log类写入的消息。
ZIP文件中有一个version.txt元数据文件,其中包含Android版本号,而且启用systrace后,ZIP文件中还会包含systrace.txt文件。
Systrace工具可以获取并显示应用进程和其他Android系统进程的执行时间,从而帮助分析应用的性能。
dumpstate工具会将文件从设备的文件系统复制到ZIP文件的FS文件夹下,以便我们引用它们。
例如,设备中的/dirA/dirB/fileC文件会在ZIP文件中生成FS/dirA/dirB/fileC条目
错误报告文件结构如下:
3.常见日志分析
3.1ANR和死锁
错误报告有助于我们找出导致应用无响应(ANR)错误和死锁事件的原因。
找出无响应的应用
当某个应用在一定时间内没有响应(通常是由于主线程被阻塞或繁忙)时,系统会终止该进程并将堆栈转储到/data/anr。
要找出ANR背后的罪魁祸首,请为二进制事件日志中的am_anr执行grep命令。
日志范例如下:
grep"am_anr"bugreport-2015-10-01-18-13-48.txt
10-0118:12:49.59946004614Iam_anr:[0,29761,com.google.android.youtube,953695941,executingservicecom.google.android.youtube/com.google.android.apps.youtube.app.offline.transfer.OfflineTransferService]
10-0118:14:10.21146004614Iam_anr:[0,30363,com.google.android.apps.plus,953728580,executingservicecom.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService]
我们也可以为logcat日志(其中包含关于发生ANR时是什么在占用CPU的更多信息)中的ANRin执行grep命令。
日志范例如下:
grep"ANRin"bugreport-2015-10-01-18-13-48.txt
10-0118:13:11.98446004614EActivityManager:ANRincom.google.android.youtube
10-0118:14:31.72046004614EActivityManager:ANRincom.google.android.apps.plus
10-0118:14:31.72046004614EActivityManager:PID:30363
10-0118:14:31.72046004614EActivityManager:Reason:executingservicecom.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService
10-0118:14:31.72046004614EActivityManager:Load:35.27/23.9/16.18
10-0118:14:31.72046004614EActivityManager:CPUusagefrom16msto21868mslater:
10-0118:14:31.72046004614EActivityManager:74%3361/mm-qcamera-daemon:62%user+12%kernel/faults:15276minor10major
10-0118:14:31.72046004614EActivityManager:41%4600/system_server:18%user+23%kernel/faults:18597minor309major
10-0118:14:31.72046004614EActivityManager:32%27420/com.google.android.GoogleCamera:24%user+7.8%kernel/faults:48374minor338major
10-0118:14:31.72046004614EActivityManager:16%130/kswapd0:0%user+16%kernel
10-0118:14:31.72046004614EActivityManager:15%283/mmcqd/0:0%user+15%kernel
...
10-0118:14:31.72046004614EActivityManager:0.1%27248/irq/503-synapti:0%
10-0118:14:31.72146004614IActivityManager:Killing30363:com.google.android.apps.plus/u0a206(adj0):bganr
查找堆栈跟踪
通常我们可以找到与ANR对应的堆栈跟踪。
请确保VM跟踪上的时间戳和PID与我们正在调查的ANR相符,然后再检查进程的主线程。
日志范例如下:
VMTRACESATLASTANR(/data/anr/traces.txt:2015-10-0118:14:41)
pid30363at2015-10-0118:14:11
Cmdline:com.google.android.apps.plus
Buildfingerprint:'google/angler/angler:6.0/MDA89D/2294819:userdebug/dev-keys'
ABI:'arm'
Buildtype:optimized
Zygoteloadedclasses=3978postzygoteclasses=27
Interntable:45068strong;21weak
JNI:CheckJNIisoff;globals=283(plus360weak)
Libraries:/system/lib/libandroid.so/system/lib/libcompiler_rt.so/system/lib/libjavacrypto.so/system/lib/libjnigraphics.so/system/lib/libmedia_jni.so/system/lib/libwebviewchromium_loader.solibjavacore.so(7)
Heap:29%free,21MB/30MB;32251objects
DumpingcumulativeGctimings
Totalnumberofallocations32251
Totalbytesallocated21MB
Totalbytesfreed0B
Freememory9MB
FreememoryuntilGC9MB
FreememoryuntilOOME490MB
Totalmemory30MB
Maxmemory512MB
Zygotespacesize1260KB
Totalmutatorpausedtime:0
TotaltimewaitingforGCtocomplete:0
TotalGCcount:0
TotalGCtime:0
TotalblockingGCcount:0
TotalblockingGCtime:0
suspendallhistogram:Sum:119.728ms99%C.I.0.010ms-107.765msAvg:5.442msMax:119.562ms
DALVIKTHREADS(12):
"SignalCatcher"daemonprio=5tid=2Runnable
|group="system"sCount=0dsCount=0obj=0x12c400a0self=0xef460000
|sysTid=30368nice=0cgrp=defaultsched=0/0handle=0xf4a69930
|state=Rschedstat=(9021773550052326)utm=0stm=0core=1HZ=100
|stack=0xf496d000-0xf496f000stackSize=1014KB
|heldmutexes="mutatorlock"(sharedheld)
native:#00pc0035a217/system/lib/libart.so(art::DumpNativeStack(std::__1::basic_ostream
如果系统服务器发生死锁,监控程序最终会将其终止,从而导致日志中出现类似以下的条目:WATCHDOGKILLINGSYSTEMPROCESS。
对于用户来说,看到的是设备重新启动,但从技术上来讲这是运行时重启,而不是真正的设备重新启动。
要查找死锁,请检查VM跟踪部分中是否存在以下模式:线程A在等待线程B占用的某些资源,而线程B也在等待线程A占用的某些资源。
日志范例如下:
"Binder_B"prio=5tid=73Blocked
|group="main"sCount=1dsCount=0obj=0x13faa0a0self=0x95e24800
|sysTid=2016nice=0cgrp=defaultsched=0/0handle=0x8b68d930
|state=Sschedstat=(9351576559414143111916920)utm=819stm=116core=1HZ=100
|stack=0x8b591000-0x8b593000stackSize=1014KB
|heldmutexes=
atcom.android.server.pm.UserManagerService.exists(UserManagerService.java:387)
-waitingtolock<0x025f9b02>(aandroid.util.ArrayMap)heldbythread20
atcom.android.server.pm.PackageManagerService.getApplicationInfo(PackageManagerService.java:2848)
atcom.android.server.AppOpsService.getOpsRawLocked(AppOpsService.java:881)
atcom.android.server.AppOpsService.getOpsLocked(AppOpsService.java:856)
atcom.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:719)
-locked<0x0231885a>(acom.android.server.AppOpsService)
atcom.android.server.AppOpsService.noteOperation(AppOpsService.java:713)
atcom.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260)
atcom.android.server.MountService$MountServiceInternalImpl.getExternalStorageMountMode(MountService.java:3416)
atcom.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3228)
atcom.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3170)
atcom.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3059)
atcom.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1070)
-locked<0x044d166f>(acom.android.server.am.ActivityManagerService)
atcom.android.server.am.ActivityManagerService.finishReceiver(ActivityManagerService.java:16950)
atandroid.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:494)
atcom.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2432)
atandroid.os.Binder.execTransact(Binder.java:453)
"PackageManager"prio=5tid=20Blocked
|group="main"sCount=1dsCount=0obj=0x1304f4a0self=0xa7f43900
|sysTid=1300nice=10cgrp=bg_non_interactivesched=0/0handle=0x9fcf9930
|state=Sschedstat=(261901419961361215480244357)utm=2410stm=209core=2HZ=100
|stack=0x9fbf7000-0x9fbf9000stackSize=1038KB
|heldmutexes=
atcom.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:718)
-waitingtolock<0x0231885a>(acom.android.server.AppOpsService)heldbythread73
atcom.android.server.AppOpsService.noteOperation(AppOpsService.java:713)
atcom.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260)
atcom.android.server.AppOpsService$2.hasExternalStorage(AppOpsService.java:273)
atcom.android.server.MountService$MountServiceInternalImpl.hasExternalStorage(MountService.java:3431)
atcom.android.server.MountService.getVolumeList(MountService.java:2609)
atandroid.os.storage.StorageManager.getVolumeList(StorageManager.java:880)
atandroid.os.Environment$UserEnvironment.getExternalDirs(Environment.java:83)
atandroid.os.Environment.isExternalStorageEmulated(Environment.java:708)
atcom.android.server.pm.PackageManagerService.isExternalMediaAvailable(PackageManagerService.java:9327)
atcom.android.server.pm.PackageManagerService.startCleaningPackages(PackageManagerService.java:9367)
-locked<0x025f9b02>(aandroid.util.ArrayMap)
atcom.android.server.pm.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:1320)
atcom.android.server.pm.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:1122)
atandroid.os.Handler.dispatchMessage(Handler.java:102)
atandroid.os.Looper.loop(Looper.java:148)
atandroid.os.HandlerThread.run(HandlerThread.java:61)
atcom.android.server.ServiceThread.run(ServiceThread.java:46)
3.2Activity活动
查看处于聚焦状态的Activity
要查看记录的处于聚焦状态的Activity,请搜索am_focused_activity。
日志范例如下:
grep"am_focused_activity"bugreport-2015-10-01-18-13-48.txt
10-0118:10:41.409460014112Iam_focused_activity:[0,com.google.android.GoogleCamera/com.android.camera.CameraActivity]
10-0118:11:17.31346005687Iam_focused_activity:[0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]
10-0118:11:52.747460014113Iam_focused_activity:[0,com.google.android.GoogleCamera/com.android.camera.CameraActivity]
10-0118:14:07.76246005687Iam_focused_activity:[0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]
查看进程启动事件
要查看记录的进程启动事件,请搜索Startproc。
日志范例如下:
grep"Startproc"bugreport-2015-10-01-18-13-48.txt
10-0118:09:15.30946004612IActivityManager:Startproc24533:com.metago.astro/u0a240forbroadcastcom.metago.astro/com.inmobi.commons.analytics.androidsdk.IMAdTrackerReceiver
10-0118:09:15.687460014112IActivityManager:Startproc24548:com.google.android.apps.fitness/u0a173forservicecom.google.android.apps.fitness/.api.services.ActivityUpsamplingService
10-0118:09:15.77746006604IActivityManager:Startproc24563:cloudtv.hdwidgets/u0a145forbroadcastcloudtv.hdwidgets/cloudtv.switches.SwitchSystemUpdateReceiver
10-0118:09:20.57446006604IActivityManager:Startproc24617:com.wageworks.ezreceipts/u0a111forbroadcastcom.wageworks.ezreceipts/.ui.managers.IntentReceiver
设备是否发生系统颠簸
要确定设备是否发生系统颠簸,请检查am_proc_died和am_proc_start前后在短时间内是否出现活动异常增加。
日志范例如下:
grep-e"am_proc_died"-e"am_proc_start"bugreport-2015-10-01-18-13-48.txt
10-0118:07:06.49446009696Iam_proc_died:[0,20074,com.android.musicfx]
10-0118:07:06.55546006606Iam_proc_died:[0,31166,com.concur.breeze]
10-0118:07:06.566460014112Iam_proc_died:[0,18812,com.google.android.apps.fitness]
10-0118:07:07.01846007513Iam_proc_start:[0,20361,10113,com.sony.playmemories.mobile,broadcast,com.sony.playmemories.mobile/.service.StartupReceiver]
10-0118:07:07.35746004614Iam_proc_start:[0,20381,10056,com.google.android.talk,service,com.google.android.talk/com.google.android.libraries.hangouts.video.CallService]
10-0118:07:07.78446004612Iam_proc_start:[0,20402,10190,com.andcreate.app.trafficmonitor:loopback_measure_serivce,service,com.andcreate.app.trafficmonitor/.loopback.LoopbackMeasureService]
10-0118:07:10.75346005997Iam_proc_start:[0,20450,10097,com.amazon.mShop.android.shopping,broadcast,com.amazon.mShop.android.shopping/com.amazon.identity.auth.device.storage.LambortishClock$ChangeTimestampsBroadcastReceiver]
10-0118:07:15.26746006605Iam_proc_start:[0,20539,10173,com.google.android.apps.fitness,service,com.google.android.apps.fitness/.api.services.ActivityUpsamplingService]
10-0118:07:15.98546004612Iam_proc_start:[0,20568,10022,com.android.musicfx,broadcast,com.android.musicfx/.ControlPanelReceiver]
10-0118:07:16.31546007512Iam_proc_died:[0,20096,com.google.android.GoogleCamera]
3.3内存异常
内存不足可能会导致系统发生颠簸,这是因为虽然内存不足时系统会终止某些进程来释放内存,但又会继续启动其他进程。
要查看内存不足的确凿证据,请检查二进制事件日志中am_proc_died和am_proc_start条目的密集程度。
内存不足还可能会减慢任务切换速度,并且可能会阻止进行返回尝试(因为用户尝试返回到的任务已被终止)。
如果启动器被终止,它会在用户触摸主屏幕按钮时重启,并且日志中会显示启动器重新加载其内容。
查看历史指标
二进制事件日志中的am_low_memory条目表示最后一个缓存的进程已终止。
在此之后,系统开始终止各项服务。
日志范例如下:
grep"am_low_memory"bugreport-2015-10-01-18-13-48.txt
10-0118:11:02.21946007513Iam_low_memory:41
10-0118:12:18.526460014112Iam_low_memory:39
10-0118:12:18.87446007514Iam_low_memory:38
10-0118:12:22.570460014112Iam_low_memory:40
10-0118:12:34.811460020319Iam_low_memory:43
10-0118:12:37.94546006521Iam_low_memory:43
10-0118:12:47.804460014110Iam_low_memory:43
查看系统颠簸指标
关于系统颠簸(分页、直接回收等)的其他指标包括kswapd、kworker和mmcqd消耗的CPU周期。
日志范例如下:
CPUINFO(top-n1-d1-m30-t)
User15%,System54%,IOW28%,IRQ0%
User82+Nice2+Sys287+Idle1+IOW152+IRQ0+SIRQ5=529
PIDTIDPRCPU%SVSSRSSPCYUIDThreadProc
1522915229019%R0K0Kfgrootkworker/0:2
295122951717%D1173524K101188Kbgu0_a27SignalCatchercom.google.android.talk
245652457036%D2090920K145168Kfgu0_a22SignalCatchercom.google.android.googlequicksearchbox:search
195251952526%R3476K1644Kfgshelltoptop
249572496225%R1706928K125716Kbgu0_a47SignalCatchercom.google.android.GoogleCamera
195191951934%S0K0Kfgrootkworker/3:1
12012003%S0K0Kfgrootmmcqd/1
182331823313%S0K0Kfgrootkworker/1:1
255892559412%D1270476K75776Kfgu0_a8SignalCatchercom.google.android.gms
193991939921%S0K0Kfgrootkworker/2:2
1963197810%S1819100K125136Kfgsystemandroid.fgsystem_server
1963198130%S1819100K125136Kfgsystemandroid.displaysystem_server
获取内存快照
内存快照是一种dumpstate,其中会列出正在运行的Java进程和本机进程.
日志范例如下:
TotalPSSbyOOMadjustment:
86752kB:Native
22645kB:surfaceflinger(pid197)
18597kB:mediaserver(pid204)
136959kB:System
136959kB:system(pid785)
220218kB:Persistent
138859kB:com.android.systemui(pid947/activities)
39178kB:com.android.nfc(pid1636)
28313kB:com.android.phone(pid1659)
13868kB:com.redbend.vdmc(pid1646)
9534kB:PersistentService
9534kB:com.android.bluetooth(pid23807)
178604kB:Foreground
168620kB:com.google.android.googlequicksearchbox(pid1675/activities)
9984kB:com.google.android.apps.maps(pid13952)
188286kB:Visible
85326kB:com.google.android.wearable.app(pid1535)
38978kB:com.google.process.gapps(pid1510)
31936kB:com.google.android.gms.persistent(pid2072)
27950kB:com.google.android.gms.wearable(pid1601)
4096kB:com.google.android.googlequicksearchbox:interactor(pid1550)
52948kB:Perceptible
52948kB:com.google.android.inputmethod.latin(pid1566)
150851kB:AServices
81121kB:com.google.android.gms(pid1814)
37586kB:com.google.android.talk(pid9584)
10949kB:com.google.android.music:main(pid4019)
10727kB:com.motorola.targetnotif(pid31071)
10468kB:com.google.android.GoogleCamera(pid9984)
33298kB:Previous
33298kB:com.android.settings(pid9673/activities)
165188kB:BServices
49490kB:com.facebook.katana(pid15035)
22483kB:com.whatsapp(pid28694)
21308kB:com.iPass.OpenMobile(pid5325)
19788kB:com.google.android.apps.googlevoice(pid23934)
17399kB:com.google.android.googlequicksearchbox:search(pid30359)
9073kB:com.google.android.apps.youtube.unplugged(pid21194)
7660kB:com.iPass.OpenMobile:remote(pid23754)
7291kB:com.pujie.wristwear.pujieblack(pid24240)
7157kB:com.instagram.android:mqtt(pid9530)
3539kB:com.qualcomm.qcrilmsgtunnel(pid16186)
204324kB:Cached
43424kB:com.amazon.mShop.android(pid13558)
22563kB:com.google.android.apps.magazines(pid13844)
4298kB:com.google.android.apps.enterprise.dmagent(pid13826)
3.4电源
事件日志中包含屏幕电源状态,其中0表示屏幕关闭,1表示屏幕打开,2表示已锁屏。
日志范例如下:
grepscreen_toggledbugreport-2015-10-18-16-52-22.txt
10-1815:05:04.383992992Iscreen_toggled:1
10-1815:05:07.010992992Iscreen_toggled:0
10-1815:23:15.063992992Iscreen_toggled:1
10-1815:23:25.684992992Iscreen_toggled:0
10-1815:36:31.623992992Iscreen_toggled:1
10-1815:36:37.66032833283Iscreen_toggled:2
错误报告中还包含关于唤醒锁的统计信息,唤醒锁是应用开发者采用的一种机制,用于表明其应用需要设备保持开启状态。
唤醒锁总时长统计信息仅跟踪唤醒锁实际负责使设备保持唤醒状态的时间,不包括屏幕处于开启状态的时间。
此外,如果同时持有多个唤醒锁,系统会在它们之间分配唤醒锁时长。
4.小结
本节课程我们主要学习了如何获取和分析错误报告。
本节课程的重点如下:
掌握如何获取错误报告;
掌握如何分析常见日志。
上一节
下一节
AndroidStudio的简介、安装和配置
AndroidStudio简介
如何安装AndroidStudio
AndroidStudio常用配置
更新AndroidStudio及SDK
AndroidStudio键盘快捷键
AndroidStudio开发应用
第一个AndroidStudio应用
Android模拟器的安装及管理
Android模拟器的控制台命令
Android模拟器的常用操作
Android真机的使用
AndroidStudio项目
AndroidStudio编写应用代码
AndroidStudio查找示例代码
AndroidStudio检查改进代码
AndroidStudio的布局编辑器
AndroidStudio添加应用资源
ResourceManager工具
TranslationsEditor工具
AndroidStudio的运行配置
AndroidStudio如何编译运行应用
AndroidStudio中使用命令行构建应用
Android开发者选项
AndroidStudio如何添加和查看日志
使用AndroidStudio分析堆栈轨迹
AndroidStudio如何调试布局
使用AndroidStudio分析错误报告
AndroidStudio如何发布应用
AndroidStudio剖析应用性能
AndroidStudio如何分析CPU活动
AndroidStudio如何分析内存活动
AndroidStudio如何分析网络活动
AndroidStudio如何分析能耗活动
AndroidStudioC/C++支持
AndroidStudio安装NDK和CMake
AndroidStudio如何配置CMake
AndroidStudio如何关联Gradle
AndroidStudio开发C/C++例子
常用命令行工具
AndroidSDK工具介绍
AndroidSDK构建工具介绍
AndroidSDK平台工具介绍
Android模拟器工具介绍
Android分析工具介绍
使用AndroidStudio分析错误报告
26/40
字体
A
A
目录
书签
收藏
A
大小
代码预览
退出
延伸文章資訊
- 1錯誤報告哪邊看?
重開後,問我要不要傳送錯誤報告...就選擇傳送了...請問還能看到那份錯誤報... ,HTC論壇. ... 錯誤報告是記錄手機機型與錯誤行為或APP版本等相關訊息
- 2客戶端錯誤報告| F-Droid - Free and Open Source Android App ...
錯誤報告中應包括哪些內容 · F-Droid version (e.g. “0.88” or “0.89-test”) · Android version (e.g. “Lollipop” or...
- 3您如何收集已釋出的Android應用程式的錯誤報告
【android】您如何收集已釋出的Android應用程式的錯誤報告. 阿新• • 發佈:2020-12-08. 作為開發人員,要收集崩潰報告,需要使用logcat。釋出的android應用程式...
- 4使用Android Studio 分析错误报告 - 慕课网
1. 获取错误报告 · 1.1 从真机设备上获取 · 1.2 从Android 模拟器上获取 · 1.3 使用adb 命令获取.
- 5啟用或停用錯誤和當機情形的自動回報功能- Android
您可以讓Chrome 自動傳送報告給Google,協助我們為Chrome 規劃要優先修正及改善的項目。這類報告可能包含Chrome 當機時間、記憶體使用量等資料,以及部分個人資訊。