diff options
Diffstat (limited to 'en/setup/contribute/read-bug-reports.html')
-rw-r--r-- | en/setup/contribute/read-bug-reports.html | 1018 |
1 files changed, 1018 insertions, 0 deletions
diff --git a/en/setup/contribute/read-bug-reports.html b/en/setup/contribute/read-bug-reports.html new file mode 100644 index 00000000..63ff5cc0 --- /dev/null +++ b/en/setup/contribute/read-bug-reports.html @@ -0,0 +1,1018 @@ +<html devsite> + <head> + <title>Reading Bug Reports</title> + <meta name="project_path" value="/_project.yaml" /> + <meta name="book_path" value="/_book.yaml" /> + </head> + <body> + <!-- + Copyright 2017 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + + + +<p>Bugs are a reality in any type of development—and bug reports are +critical to identifying and solving problems. All versions of Android support +capturing bug reports with <a href="http://developer.android.com/tools/help/adb.html">Android +Debug Bridge (adb)</a>; Android versions 4.2 and higher support a +<a href="http://developer.android.com/tools/device.html#developer-device-options">Developer +Option</a> for taking bug reports and sharing via email, Drive, etc.</p> + +<p>Android bug reports contain <code>dumpsys</code>, <code>dumpstate</code>, and +<code>logcat</code> data in text (.txt) format, enabling you to easily search +for specific content. The following sections detail bug report components, +describe common problems, and give helpful tips and <code>grep</code> commands +for finding logs associated with those bugs. Most sections also include examples +for <code>grep</code> command and output and/or <code>dumpsys</code> output.</p> + +<h2 id="logcat">Logcat</h2> +<p>The <code>logcat</code> log is a string-based dump of all <code>logcat</code> +information. The <strong>system</strong> part is reserved for the framework and +has a longer history than <strong>main</strong> which contains everything else. +Each line starts with <code>timestamp PID TID log-level</code>.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>------ SYSTEM LOG (logcat -v threadtime -d *:v) ------ +--------- beginning of system +<i>Blah</i> +<i>Blah</i> +<i>Blah</i> + +--------- beginning of main +<i>Blah </i> +<i>Blah</i> +<i>Blah</i></pre></p> + </section> + +<h3 id="event-log">Viewing the event log</h3> +<p>This log contains string representations of binary-formatted log messages. It +is less noisy than the <code>logcat</code> log but also a little harder to read. +When viewing event logs, you can search this section for specific process ID +(PID) to see what a process has been doing. The basic format is: +<code>timestamp PID TID log-level log-tag tag-values</code>.</p> + +<p>Log levels include the following:</p> +<ul> +<li>V: verbose</li> +<li>D: debug</li> +<li>I: information</li> +<li>W: warning</li> +<li>E: error</li> +</ul> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>------ EVENT LOG (logcat -b events -v threadtime -d *:v) ------ +09-28 13:47:34.179 785 5113 I am_proc_bound: [0,23054,com.google.android.gms.unstable] +09-28 13:47:34.777 785 1975 I am_proc_start: [0,23134,10032,com.android.chrome,broadcast,com.android.chrome/org.chromium.chrome.browser.precache.PrecacheServiceLauncher] +09-28 13:47:34.806 785 2764 I am_proc_bound: [0,23134,com.android.chrome] +...</pre></p> + </section> +<p> </p> +<p>For other useful event log tags, refer to +<a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/EventLogTags.logtags">/services/core/java/com/android/server/EventLogTags.logtags</a>.</p> + +<h2 id="anrs-deadlocks">ANRs and deadlocks</h2> +<p>Bugreports can help you identify what's causing +<a href="http://developer.android.com/training/articles/perf-anr.html">Application +Not Responding (ANR)</a> errors and deadlock events.</p> + +<h3 id="determine-anr-app">Identifying unresponsive apps</h3> +<p>When an application does not respond within a certain time, usually due to a +blocked or busy main thread, the system kills the process and dumps the stack to +<code>/data/anr</code>. To discover the culprit behind an ANR, grep for +<code>am_anr</code> in the binary event log.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>grep "am_anr" bugreport-2015-10-01-18-13-48.txt +10-01 18:12:49.599 4600 4614 I am_anr : [0,29761,com.google.android.youtube,953695941,executing service com.google.android.youtube/com.google.android.apps.youtube.app.offline.transfer.OfflineTransferService] +10-01 18:14:10.211 4600 4614 I am_anr : [0,30363,com.google.android.apps.plus,953728580,executing service com.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService]</pre></p> + </section> + +<p></p> +<p>You can also grep for <code>ANR in</code> in the <code>logcat</code> log, +which contains more information about what was using CPU at the time of the ANR. +</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>grep "ANR in" bugreport-2015-10-01-18-13-48.txt +10-01 18:13:11.984 4600 4614 E ActivityManager: ANR in com.google.android.youtube +10-01 18:14:31.720 4600 4614 E ActivityManager: ANR in com.google.android.apps.plus +10-01 18:14:31.720 4600 4614 E ActivityManager: PID: 30363 +10-01 18:14:31.720 4600 4614 E ActivityManager: Reason: executing service com.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService +10-01 18:14:31.720 4600 4614 E ActivityManager: Load: 35.27 / 23.9 / 16.18 +10-01 18:14:31.720 4600 4614 E ActivityManager: CPU usage from 16ms to 21868ms later: +10-01 18:14:31.720 4600 4614 E ActivityManager: 74% 3361/mm-qcamera-daemon: 62% user + 12% kernel / faults: 15276 minor 10 major +10-01 18:14:31.720 4600 4614 E ActivityManager: 41% 4600/system_server: 18% user + 23% kernel / faults: 18597 minor 309 major +10-01 18:14:31.720 4600 4614 E ActivityManager: 32% 27420/com.google.android.GoogleCamera: 24% user + 7.8% kernel / faults: 48374 minor 338 major +10-01 18:14:31.720 4600 4614 E ActivityManager: 16% 130/kswapd0: 0% user + 16% kernel +10-01 18:14:31.720 4600 4614 E ActivityManager: 15% 283/mmcqd/0: 0% user + 15% kernel +... +10-01 18:14:31.720 4600 4614 E ActivityManager: 0.1% 27248/irq/503-synapti: 0% +10-01 18:14:31.721 4600 4614 I ActivityManager: Killing 30363:com.google.android.apps.plus/u0a206 (adj 0): bg anr</pre></p> + </section> + +<h3 id="find-stack-traces">Finding stack traces</h3> +<p>You can often find stack traces that correspond to an ANR. Make sure the +timestamp and PID on the VM traces match the ANR you are investigating, then +check the main thread of the process. Keep in mind:</p> +<ul> +<li>The main thread tells you only what the thread was doing at the time of the +ANR, which may or may not correspond to the true cause of the ANR. (The stack in +the bug report may be innocent; something else may have been stuck for a long +time—but not quite long enough to ANR—before becoming unstuck.) +</li> +<li>More than one set of stack traces (<code>VM TRACES JUST NOW</code> and +<code>VM TRACES AT LAST ANR</code>) might exist. Make sure you are viewing the +correct section.</li> +</ul> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2015-10-01 18:14:41) ------ + +----- pid 30363 at 2015-10-01 18:14:11 ----- +Cmd line: com.google.android.apps.plus +Build fingerprint: 'google/angler/angler:6.0/MDA89D/2294819:userdebug/dev-keys' +ABI: 'arm' +Build type: optimized +Zygote loaded classes=3978 post zygote classes=27 +Intern table: 45068 strong; 21 weak +JNI: CheckJNI is off; globals=283 (plus 360 weak) +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.so libjavacore.so (7) +Heap: 29% free, 21MB/30MB; 32251 objects +Dumping cumulative Gc timings +Total number of allocations 32251 +Total bytes allocated 21MB +Total bytes freed 0B +Free memory 9MB +Free memory until GC 9MB +Free memory until OOME 490MB +Total memory 30MB +Max memory 512MB +Zygote space size 1260KB +Total mutator paused time: 0 +Total time waiting for GC to complete: 0 +Total GC count: 0 +Total GC time: 0 +Total blocking GC count: 0 +Total blocking GC time: 0 + +suspend all histogram: Sum: 119.728ms 99% C.I. 0.010ms-107.765ms Avg: 5.442ms Max: 119.562ms +DALVIK THREADS (12): +"Signal Catcher" daemon prio=5 tid=2 Runnable + | group="system" sCount=0 dsCount=0 obj=0x12c400a0 self=0xef460000 + | sysTid=30368 nice=0 cgrp=default sched=0/0 handle=0xf4a69930 + | state=R schedstat=( 9021773 5500523 26 ) utm=0 stm=0 core=1 HZ=100 + | stack=0xf496d000-0xf496f000 stackSize=1014KB + | held mutexes= "mutator lock"(shared held) + native: #00 pc 0035a217 /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::ArtMethod*, void*)+126) + native: #01 pc 0033b03b /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+138) + native: #02 pc 00344701 /system/lib/libart.so (art::DumpCheckpoint::Run(art::Thread*)+424) + native: #03 pc 00345265 /system/lib/libart.so (art::ThreadList::RunCheckpoint(art::Closure*)+200) + native: #04 pc 00345769 /system/lib/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+124) + native: #05 pc 00345e51 /system/lib/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+312) + native: #06 pc 0031f829 /system/lib/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+68) + native: #07 pc 00326831 /system/lib/libart.so (art::SignalCatcher::HandleSigQuit()+896) + native: #08 pc 003270a1 /system/lib/libart.so (art::SignalCatcher::Run(void*)+324) + native: #09 pc 0003f813 /system/lib/libc.so (__pthread_start(void*)+30) + native: #10 pc 00019f75 /system/lib/libc.so (__start_thread+6) + (no managed stack frames) + +"main" prio=5 tid=1 Suspended + | group="main" sCount=1 dsCount=0 obj=0x747552a0 self=0xf5376500 + | sysTid=30363 nice=0 cgrp=default sched=0/0 handle=0xf74feb34 + | state=S schedstat=( 331107086 164153349 851 ) utm=6 stm=27 core=3 HZ=100 + | stack=0xff00f000-0xff011000 stackSize=8MB + | held mutexes= + kernel: __switch_to+0x7c/0x88 + kernel: futex_wait_queue_me+0xd4/0x130 + kernel: futex_wait+0xf0/0x1f4 + kernel: do_futex+0xcc/0x8f4 + kernel: compat_SyS_futex+0xd0/0x14c + kernel: cpu_switch_to+0x48/0x4c + native: #00 pc 000175e8 /system/lib/libc.so (syscall+28) + native: #01 pc 000f5ced /system/lib/libart.so (art::ConditionVariable::Wait(art::Thread*)+80) + native: #02 pc 00335353 /system/lib/libart.so (art::Thread::FullSuspendCheck()+838) + native: #03 pc 0011d3a7 /system/lib/libart.so (art::ClassLinker::LoadClassMembers(art::Thread*, art::DexFile const&, unsigned char const*, art::Handle<art::mirror::Class>, art::OatFile::OatClass const*)+746) + native: #04 pc 0011d81d /system/lib/libart.so (art::ClassLinker::LoadClass(art::Thread*, art::DexFile const&, art::DexFile::ClassDef const&, art::Handle<art::mirror::Class>)+88) + native: #05 pc 00132059 /system/lib/libart.so (art::ClassLinker::DefineClass(art::Thread*, char const*, unsigned int, art::Handle<art::mirror::ClassLoader>, art::DexFile const&, art::DexFile::ClassDef const&)+320) + native: #06 pc 001326c1 /system/lib/libart.so (art::ClassLinker::FindClassInPathClassLoader(art::ScopedObjectAccessAlreadyRunnable&, art::Thread*, char const*, unsigned int, art::Handle<art::mirror::ClassLoader>, art::mirror::Class**)+688) + native: #07 pc 002cb1a1 /system/lib/libart.so (art::VMClassLoader_findLoadedClass(_JNIEnv*, _jclass*, _jobject*, _jstring*)+264) + native: #08 pc 002847fd /data/dalvik-cache/arm/system@framework@boot.oat (Java_java_lang_VMClassLoader_findLoadedClass__Ljava_lang_ClassLoader_2Ljava_lang_String_2+112) + at java.lang.VMClassLoader.findLoadedClass!(Native method) + at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:362) + at java.lang.ClassLoader.loadClass(ClassLoader.java:499) + at java.lang.ClassLoader.loadClass(ClassLoader.java:469) + at android.app.ActivityThread.installProvider(ActivityThread.java:5141) + at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748) + at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688) + at android.app.ActivityThread.-wrap1(ActivityThread.java:-1) + at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) + at android.os.Handler.dispatchMessage(Handler.java:102) + at android.os.Looper.loop(Looper.java:148) + at android.app.ActivityThread.main(ActivityThread.java:5417) + at java.lang.reflect.Method.invoke!(Native method) + at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) + + ... +<i> Stacks for other threads in this process follow</i> + ...</pre></p> + </section> + +<h3 id="deadlocks">Finding deadlocks</h3> +<p>Deadlocks often first appear as ANRs because threads are getting stuck. If +the deadlock hits the system server, the watchdog will eventually kill it, +leading to an entry in the log similar to: +<code>WATCHDOG KILLING SYSTEM PROCESS</code>. From the user perspective, the +device reboots, although technically this is a runtime restart rather than a +true reboot.</p> + +<ul> +<li>In a <strong>runtime</strong> restart, the system server dies and is +restarted; the user sees the device return to the boot animation.</li> +<li>In a <strong>reboot</strong>, the kernel has crashed; the user sees the +device return to the Google boot logo.</li> +</ul> + +<p>To find deadlocks, check the VM traces sections for a pattern of thread A +waiting on something held by thread B, which in turn is waiting on something +held by thread A.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>"Binder_B" prio=5 tid=73 Blocked + | group="main" sCount=1 dsCount=0 obj=0x13faa0a0 self=0x95e24800 + | sysTid=2016 nice=0 cgrp=default sched=0/0 handle=0x8b68d930 + | state=S schedstat=( 9351576559 4141431119 16920 ) utm=819 stm=116 core=1 HZ=100 + | stack=0x8b591000-0x8b593000 stackSize=1014KB + | held mutexes= + at com.android.server.pm.UserManagerService.exists(UserManagerService.java:387) + - waiting to lock <0x025f9b02> (a android.util.ArrayMap) held by thread 20 + at com.android.server.pm.PackageManagerService.getApplicationInfo(PackageManagerService.java:2848) + at com.android.server.AppOpsService.getOpsRawLocked(AppOpsService.java:881) + at com.android.server.AppOpsService.getOpsLocked(AppOpsService.java:856) + at com.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:719) + - locked <0x0231885a> (a com.android.server.AppOpsService) + at com.android.server.AppOpsService.noteOperation(AppOpsService.java:713) + at com.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260) + at com.android.server.MountService$MountServiceInternalImpl.getExternalStorageMountMode(MountService.java:3416) + at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3228) + at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3170) + at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3059) + at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1070) + - locked <0x044d166f> (a com.android.server.am.ActivityManagerService) + at com.android.server.am.ActivityManagerService.finishReceiver(ActivityManagerService.java:16950) + at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:494) + at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2432) + at android.os.Binder.execTransact(Binder.java:453) +... + "PackageManager" prio=5 tid=20 Blocked + | group="main" sCount=1 dsCount=0 obj=0x1304f4a0 self=0xa7f43900 + | sysTid=1300 nice=10 cgrp=bg_non_interactive sched=0/0 handle=0x9fcf9930 + | state=S schedstat=( 26190141996 13612154802 44357 ) utm=2410 stm=209 core=2 HZ=100 + | stack=0x9fbf7000-0x9fbf9000 stackSize=1038KB + | held mutexes= + at com.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:718) + - waiting to lock <0x0231885a> (a com.android.server.AppOpsService) held by thread 73 + at com.android.server.AppOpsService.noteOperation(AppOpsService.java:713) + at com.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260) + at com.android.server.AppOpsService$2.hasExternalStorage(AppOpsService.java:273) + at com.android.server.MountService$MountServiceInternalImpl.hasExternalStorage(MountService.java:3431) + at com.android.server.MountService.getVolumeList(MountService.java:2609) + at android.os.storage.StorageManager.getVolumeList(StorageManager.java:880) + at android.os.Environment$UserEnvironment.getExternalDirs(Environment.java:83) + at android.os.Environment.isExternalStorageEmulated(Environment.java:708) + at com.android.server.pm.PackageManagerService.isExternalMediaAvailable(PackageManagerService.java:9327) + at com.android.server.pm.PackageManagerService.startCleaningPackages(PackageManagerService.java:9367) + - locked <0x025f9b02> (a android.util.ArrayMap) + at com.android.server.pm.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:1320) + at com.android.server.pm.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:1122) + at android.os.Handler.dispatchMessage(Handler.java:102) + at android.os.Looper.loop(Looper.java:148) + at android.os.HandlerThread.run(HandlerThread.java:61) + at com.android.server.ServiceThread.run(ServiceThread.java:46)</pre></p> + </section> + + +<h2 id="activities">Activities</h2> +<p>An <a href="http://developer.android.com/guide/components/activities.html">Activity</a> +is an application component that provides a screen users interact with to do +something such as dial a number, take a photo, send an email, etc. From a bug +report perspective, an +<a href="http://developer.android.com/reference/android/app/Activity.html">activity</a> +is a single, focused thing a user can do, which makes locating the activity that +was in focus during a crash very important. Activities (via ActivityManager) +run processes, so locating all process stops and starts for a given activity can +also aid troubleshooting.</p> + +<h3 id="history-focused-activities">Viewing focused activities</h3> +<p>To view a history of focused activities, search for +<code>am_focused_activity</code>.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>grep "am_focused_activity" bugreport-2015-10-01-18-13-48.txt +10-01 18:10:41.409 4600 14112 I am_focused_activity: [0,com.google.android.GoogleCamera/com.android.camera.CameraActivity] +10-01 18:11:17.313 4600 5687 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL] +10-01 18:11:52.747 4600 14113 I am_focused_activity: [0,com.google.android.GoogleCamera/com.android.camera.CameraActivity] +10-01 18:14:07.762 4600 5687 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]</pre></p> + </section> + +<h3 id="history-process-starts">Viewing process starts</h3> +<p>To view a history of process starts, search for <code>Start proc</code>.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>grep "Start proc" bugreport-2015-10-01-18-13-48.txt +10-01 18:09:15.309 4600 4612 I ActivityManager: Start proc 24533:com.metago.astro/u0a240 for broadcast com.metago.astro/com.inmobi.commons.analytics.androidsdk.IMAdTrackerReceiver +10-01 18:09:15.687 4600 14112 I ActivityManager: Start proc 24548:com.google.android.apps.fitness/u0a173 for service com.google.android.apps.fitness/.api.services.ActivityUpsamplingService +10-01 18:09:15.777 4600 6604 I ActivityManager: Start proc 24563:cloudtv.hdwidgets/u0a145 for broadcast cloudtv.hdwidgets/cloudtv.switches.SwitchSystemUpdateReceiver +10-01 18:09:20.574 4600 6604 I ActivityManager: Start proc 24617:com.wageworks.ezreceipts/u0a111 for broadcast com.wageworks.ezreceipts/.ui.managers.IntentReceiver +...</pre></p> + </section> + +<h3 id="device-thrashing">Is the device thrashing?</h3> +<p>To determine if the device is +<a href="https://en.wikipedia.org/wiki/Thrashing_(computer_science)">thrashing</a>, +check for an abnormal increase in activity around <code>am_proc_died</code> and +<code>am_proc_start</code> in a short amount of time.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>grep -e "am_proc_died" -e "am_proc_start" bugreport-2015-10-01-18-13-48.txt +10-01 18:07:06.494 4600 9696 I am_proc_died: [0,20074,com.android.musicfx] +10-01 18:07:06.555 4600 6606 I am_proc_died: [0,31166,com.concur.breeze] +10-01 18:07:06.566 4600 14112 I am_proc_died: [0,18812,com.google.android.apps.fitness] +10-01 18:07:07.018 4600 7513 I am_proc_start: [0,20361,10113,com.sony.playmemories.mobile,broadcast,com.sony.playmemories.mobile/.service.StartupReceiver] +10-01 18:07:07.357 4600 4614 I am_proc_start: [0,20381,10056,com.google.android.talk,service,com.google.android.talk/com.google.android.libraries.hangouts.video.CallService] +10-01 18:07:07.784 4600 4612 I am_proc_start: [0,20402,10190,com.andcreate.app.trafficmonitor:loopback_measure_serivce,service,com.andcreate.app.trafficmonitor/.loopback.LoopbackMeasureService] +10-01 18:07:10.753 4600 5997 I am_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-01 18:07:15.267 4600 6605 I am_proc_start: [0,20539,10173,com.google.android.apps.fitness,service,com.google.android.apps.fitness/.api.services.ActivityUpsamplingService] +10-01 18:07:15.985 4600 4612 I am_proc_start: [0,20568,10022,com.android.musicfx,broadcast,com.android.musicfx/.ControlPanelReceiver] +10-01 18:07:16.315 4600 7512 I am_proc_died: [0,20096,com.google.android.GoogleCamera]</pre></p> + </section> + +<h2 id="memory">Memory</h2> +<p>Because Android devices often have constrained physical memory, managing +random-access memory (RAM) is critical. Bug reports contain several indicators +of low memory as well as a dumpstate that provides a memory snapshot.</p> + +<h3 id="low-memory">Identifying low memory</h3> +<p>Low memory can cause the system to thrash as it kills some processes to free +memory but continues to start other processes. To view corroborating evidence of +low memory, check for concentrations of <code>am_proc_died</code> and +<code>am_proc_start</code> entries in the binary event log.</p> + +<p>Low memory can also slow task switching and thwart return attempts (because +the task the user was trying to return to was killed). If the launcher was +killed, it restarts when the user touches the home button and logs show the +launcher reload its content.</p> + +<h4 id="historical-low-memory">Viewing historical indicators</h4> +<p>The <code>am_low_memory</code> entry in the binary event log indicates the +last cached process has died. After this, the system starts killing services. + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>grep "am_low_memory" bugreport-2015-10-01-18-13-48.txt +10-01 18:11:02.219 4600 7513 I am_low_memory: 41 +10-01 18:12:18.526 4600 14112 I am_low_memory: 39 +10-01 18:12:18.874 4600 7514 I am_low_memory: 38 +10-01 18:12:22.570 4600 14112 I am_low_memory: 40 +10-01 18:12:34.811 4600 20319 I am_low_memory: 43 +10-01 18:12:37.945 4600 6521 I am_low_memory: 43 +10-01 18:12:47.804 4600 14110 I am_low_memory: 43</pre></p> + </section> + +<h4 id="thrashing-indicators">Viewing thrashing indicators</h4> +<p>Other indicators of system thrashing (paging, direct reclaim, etc.) include +<code>kswapd</code>, <code>kworker</code>, and <code>mmcqd</code> consuming +cycles. (Keep in mind the bugreport being gathered can influence thrashing +indicators.)</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------ + +User 15%, System 54%, IOW 28%, IRQ 0% +User 82 + Nice 2 + Sys 287 + Idle 1 + IOW 152 + IRQ 0 + SIRQ 5 = 529 + + PID TID PR CPU% S VSS RSS PCY UID Thread Proc +15229 15229 0 19% R 0K 0K fg root kworker/0:2 +29512 29517 1 7% D 1173524K 101188K bg u0_a27 Signal Catcher com.google.android.talk +24565 24570 3 6% D 2090920K 145168K fg u0_a22 Signal Catcher com.google.android.googlequicksearchbox:search +19525 19525 2 6% R 3476K 1644K fg shell top top +24957 24962 2 5% R 1706928K 125716K bg u0_a47 Signal Catcher com.google.android.GoogleCamera +19519 19519 3 4% S 0K 0K fg root kworker/3:1 + 120 120 0 3% S 0K 0K fg root mmcqd/1 +18233 18233 1 3% S 0K 0K fg root kworker/1:1 +25589 25594 1 2% D 1270476K 75776K fg u0_a8 Signal Catcher com.google.android.gms +19399 19399 2 1% S 0K 0K fg root kworker/2:2 + 1963 1978 1 0% S 1819100K 125136K fg system android.fg system_server + 1963 1981 3 0% S 1819100K 125136K fg system android.display system_server</pre></p> + </section> +<p></p> + +<p>ANR logs can provide a similar memory snapshot.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>10-03 17:19:59.959 1963 1976 E ActivityManager: ANR in com.google.android.apps.magazines +10-03 17:19:59.959 1963 1976 E ActivityManager: PID: 18819 +10-03 17:19:59.959 1963 1976 E ActivityManager: Reason: Broadcast of Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 cmp=com.google.android.apps.magazines/com.google.apps.dots.android.newsstand.appwidget.NewsWidgetProvider (has extras) } +10-03 17:19:59.959 1963 1976 E ActivityManager: Load: 19.19 / 14.76 / 12.03 +10-03 17:19:59.959 1963 1976 E ActivityManager: CPU usage from 0ms to 11463ms later: +10-03 17:19:59.959 1963 1976 E ActivityManager: 54% 15229/kworker/0:2: 0% user + 54% kernel +10-03 17:19:59.959 1963 1976 E ActivityManager: 38% 1963/system_server: 14% user + 23% kernel / faults: 17152 minor 1073 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 11% 120/mmcqd/1: 0% user + 11% kernel +10-03 17:19:59.959 1963 1976 E ActivityManager: 10% 2737/com.android.systemui: 4.7% user + 5.6% kernel / faults: 7211 minor 149 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 0.2% 1451/debuggerd: 0% user + 0.2% kernel / faults: 15211 minor 147 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 8.7% 6162/com.twofortyfouram.locale: 4% user + 4.7% kernel / faults: 4924 minor 260 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 6.1% 24565/com.google.android.googlequicksearchbox:search: 2.4% user + 3.7% kernel / faults: 2902 minor 129 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 6% 55/kswapd0: 0% user + 6% kernel +10-03 17:19:59.959 1963 1976 E ActivityManager: 4.9% 18819/com.google.android.apps.magazines: 1.5% user + 3.3% kernel / faults: 10129 minor 986 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 2.8% 18233/kworker/1:1: 0% user + 2.8% kernel +10-03 17:19:59.959 1963 1976 E ActivityManager: 4.2% 3145/com.android.phone: 2% user + 2.2% kernel / faults: 3005 minor 43 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 4.2% 8084/com.android.chrome: 2% user + 2.1% kernel / faults: 4798 minor 380 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 3.4% 182/surfaceflinger: 1.1% user + 2.3% kernel / faults: 842 minor 13 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 3% 18236/kworker/1:2: 0% user + 3% kernel +10-03 17:19:59.959 1963 1976 E ActivityManager: 2.9% 19231/com.android.systemui:screenshot: 0.8% user + 2.1% kernel / faults: 6119 minor 348 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 2.3% 15350/kworker/0:4: 0% user + 2.3% kernel +10-03 17:19:59.959 1963 1976 E ActivityManager: 2.2% 1454/mediaserver: 0% user + 2.2% kernel / faults: 479 minor 6 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 2% 16496/com.android.chrome:sandboxed_process10: 0.1% user + 1.8% kernel / faults: 3610 minor 234 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 1% 3119/com.android.nfc: 0.4% user + 0.5% kernel / faults: 1789 minor 17 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 1.7% 19337/com.jarettmillard.localeconnectiontype:background: 0.1% user + 1.5% kernel / faults: 7854 minor 439 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 0.7% 3066/com.google.android.inputmethod.latin: 0.3% user + 0.3% kernel / faults: 1336 minor 7 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 1% 25589/com.google.android.gms: 0.3% user + 0.6% kernel / faults: 2867 minor 237 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 0.9% 1460/sensors.qcom: 0.5% user + 0.4% kernel / faults: 262 minor 5 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 0.8% 3650/mpdecision: 0% user + 0.8% kernel / faults: 160 minor 1 major +10-03 17:19:59.959 1963 1976 E ActivityManager: 0.1% 3132/com.redbend.vdmc: 0% user + 0% kernel / faults: 1746 minor 5 major</pre></p> + </section> + +<h3 id="memory-snapshot">Getting a memory snapshot</h3> +<p>The memory snapshot is a dumpstate that lists running Java and native +processes (for details, refer to +<a href="https://developer.android.com/tools/debugging/debugging-memory.html#ViewingAllocations">Viewing +Overall Memory Allocations</a>). Keep in mind the snapshot gives only the state +at a specific moment in time; the system might have been in better (or worse) +shape before the snapshot.</p> +<ul> +<li>To understand how long a process runs, see +<a href="#process-runtime">Process runtime</a>.</li> +<li>To understand why something is currently running, see +<a href="#why-is-process-running">Why is a process running?</a></li> +</ul> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>Total PSS by OOM adjustment: + 86752 kB: Native + 22645 kB: surfaceflinger (pid 197) + 18597 kB: mediaserver (pid 204) + ... + 136959 kB: System + 136959 kB: system (pid 785) + 220218 kB: Persistent + 138859 kB: com.android.systemui (pid 947 / activities) + 39178 kB: com.android.nfc (pid 1636) + 28313 kB: com.android.phone (pid 1659) + 13868 kB: com.redbend.vdmc (pid 1646) + 9534 kB: Persistent Service + 9534 kB: com.android.bluetooth (pid 23807) + 178604 kB: Foreground + 168620 kB: com.google.android.googlequicksearchbox (pid 1675 / activities) + 9984 kB: com.google.android.apps.maps (pid 13952) + 188286 kB: Visible + 85326 kB: com.google.android.wearable.app (pid 1535) + 38978 kB: com.google.process.gapps (pid 1510) + 31936 kB: com.google.android.gms.persistent (pid 2072) + 27950 kB: com.google.android.gms.wearable (pid 1601) + 4096 kB: com.google.android.googlequicksearchbox:interactor (pid 1550) + 52948 kB: Perceptible + 52948 kB: com.google.android.inputmethod.latin (pid 1566) + 150851 kB: A Services + 81121 kB: com.google.android.gms (pid 1814) + 37586 kB: com.google.android.talk (pid 9584) + 10949 kB: com.google.android.music:main (pid 4019) + 10727 kB: com.motorola.targetnotif (pid 31071) + 10468 kB: com.google.android.GoogleCamera (pid 9984) + 33298 kB: Previous + 33298 kB: com.android.settings (pid 9673 / activities) + 165188 kB: B Services + 49490 kB: com.facebook.katana (pid 15035) + 22483 kB: com.whatsapp (pid 28694) + 21308 kB: com.iPass.OpenMobile (pid 5325) + 19788 kB: com.google.android.apps.googlevoice (pid 23934) + 17399 kB: com.google.android.googlequicksearchbox:search (pid 30359) + 9073 kB: com.google.android.apps.youtube.unplugged (pid 21194) + 7660 kB: com.iPass.OpenMobile:remote (pid 23754) + 7291 kB: com.pujie.wristwear.pujieblack (pid 24240) + 7157 kB: com.instagram.android:mqtt (pid 9530) + 3539 kB: com.qualcomm.qcrilmsgtunnel (pid 16186) + 204324 kB: Cached + 43424 kB: com.amazon.mShop.android (pid 13558) + 22563 kB: com.google.android.apps.magazines (pid 13844) + ... + 4298 kB: com.google.android.apps.enterprise.dmagent (pid 13826)</pre></p> + </section> + +<h2 id="broadcasts">Broadcasts</h2> +<p>Applications generate broadcasts to send events within the current +application or to another application. Broadcast receivers subscribe to specific +messages (via filters), enabling them to both listen and respond to a broadcast. +Bug reports contain information about sent broadcasts and unsent broadcasts, as +well as a dumpsys of all receivers listening to a specific broadcast.</p> + +<h3 id="historical-broadcasts">Viewing historical broadcasts</h3> +<p>Historical broadcasts are those that have already been sent, listed in +reverse chronological order.</p> + +<p>The <strong>summary</strong> section is an overview of the last 300 +foreground broadcasts and the last 300 background broadcasts.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre> Historical broadcasts summary [foreground]: + #0: act=android.intent.action.SCREEN_ON flg=0x50000010 + +1ms dispatch +90ms finish + enq=2015-10-29 17:10:51 disp=2015-10-29 17:10:51 fin=2015-10-29 17:10:51 + #1: act=android.intent.action.SCREEN_OFF flg=0x50000010 + 0 dispatch +60ms finish + enq=2015-10-29 17:10:05 disp=2015-10-29 17:10:05 fin=2015-10-29 17:10:05 + ... + Historical broadcasts summary [background]: + ...</pre></p> + </section> +<p></p> + +<p>The <strong>detail</strong> section contains complete information for the +last 50 foreground broadcasts and the last 50 background broadcasts, as well as +the receivers for each broadcast. Receivers that have a:</p> +<ul> +<li><code>BroadcastRecord</code> entry are registered at runtime and are sent +only to already running processes.</li> +<li><code>ResolveInfo</code> entry are registered through manifest entries. The +ActivityManager starts the process for each <code>ResolveInfo</code> if it is +not already running.</li> +</ul> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>Historical broadcasts [foreground]: + ... + Historical broadcasts [background]: + Historical Broadcast background #0: + ... + Historical Broadcast background #5: + BroadcastRecord{18dbb16 u0 android.intent.action.USER_PRESENT} to user 0 + Intent { act=android.intent.action.USER_PRESENT flg=0x24000010 } + caller=com.android.systemui 2925:com.android.systemui/u0a27 pid=2925 uid=10027 + enqueueClockTime=2015-10-29 17:10:55 dispatchClockTime=2015-10-29 17:10:55 + dispatchTime=-2s321ms (0 since enq) finishTime=-2s320ms (+1ms since disp) + Receiver #0: BroadcastFilter{8181cc1 u-1 ReceiverList{5d929a8 902 system/1000/u-1 local:eca4dcb}} + Receiver #1: BroadcastFilter{6371c97 u-1 ReceiverList{2938b16 902 system/1000/u-1 local:840b831}} + ... + Receiver #19: BroadcastFilter{93f16b u0 ReceiverList{5c61eba 17016 com.google.android.gm/10079/u0 remote:24083e5}} + ... + Historical Broadcast background #37: + BroadcastRecord{7f6dd6 u0 android.hardware.action.NEW_PICTURE} to user 0 + Intent { act=android.hardware.action.NEW_PICTURE dat=content://media/external/images/media/6345 flg=0x10 } + caller=com.google.android.GoogleCamera 32734:com.google.android.GoogleCamera/u0a53 pid=32734 uid=10053 + enqueueClockTime=2015-10-29 17:09:48 dispatchClockTime=2015-10-29 17:09:49 + dispatchTime=-45s720ms (+399ms since enq) finishTime=-45s701ms (+19ms since disp) + resultTo=null resultCode=0 resultData=null + nextReceiver=4 receiver=null + Receiver #0: ResolveInfo{33d2857 com.google.android.gms/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000} + priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false + ActivityInfo: + name=com.google.android.libraries.social.mediamonitor.MediaMonitor + packageName=com.google.android.gms + enabled=true exported=true processName=com.google.android.gms + ... + Receiver #1: ResolveInfo{d9edf44 com.google.android.apps.maps/com.google.android.apps.gmm.ugc.clientnotification.StartPhotoTakenNotifierServiceReceiver m=0x608000} + priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false + ActivityInfo: + name=com.google.android.apps.gmm.ugc.clientnotification.StartPhotoTakenNotifierServiceReceiver + packageName=com.google.android.apps.maps + enabled=true exported=true processName=com.google.android.apps.maps + ... + Receiver #2: ResolveInfo{743f82d com.google.android.apps.photos/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000} + priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false + ActivityInfo: + name=com.google.android.libraries.social.mediamonitor.MediaMonitor + packageName=com.google.android.apps.photos + enabled=true exported=true processName=com.google.android.apps.photos + ... + Receiver #3: ResolveInfo{d5c9162 com.google.android.apps.plus/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000} + priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false + ActivityInfo: + name=com.google.android.libraries.social.mediamonitor.MediaMonitor + packageName=com.google.android.apps.plus + enabled=true exported=true processName=com.google.android.apps.plus + ...</pre></p> + </section> + +<h3 id="active-broadcasts">Viewing active broadcasts</h3> +<p>Active broadcasts are those that have yet to be sent. A large number in the +queue means the system can't dispatch the broadcasts fast enough to keep up.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre> Active ordered broadcasts [background]: + Active Ordered Broadcast background #133: <i>// size of queue</i> + ...</pre></p> + </section> + +<h3 id="broadcast-listeners">Viewing broadcast listeners</h3> +<p>To view a list of receivers listening for a broadcast, check the Receiver +Resolver Table in the <code>dumpsys activity broadcasts</code>. The following +example displays all receivers listening for <code>USER_PRESENT</code>.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>------------------------------------------------------------------------------- +ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts) +.. + Receiver Resolver Table: + Full MIME Types: + .. + Wild MIME Types: + .. + Schemes: + .. + Non-Data Actions: + .. + android.intent.action.USER_PRESENT: + BroadcastFilter{8181cc1 u-1 ReceiverList{5d929a8 902 system/1000/u-1 local:eca4dcb}} + BroadcastFilter{6371c97 u-1 ReceiverList{2938b16 902 system/1000/u-1 local:840b831}} + BroadcastFilter{320c00 u0 ReceiverList{d3a6283 902 system/1000/u0 local:799c532}} + BroadcastFilter{e486048 u0 ReceiverList{36fbaeb 902 system/1000/u0 local:5f51e3a}} + BroadcastFilter{22b02 u-1 ReceiverList{b3f744d 902 system/1000/u-1 local:de837e4}} + BroadcastFilter{3e989ab u0 ReceiverList{f8deffa 2981 com.google.process.gapps/10012/u0 remote:26bd225}} + BroadcastFilter{fb56150 u0 ReceiverList{22b7b13 2925 com.android.systemui/10027/u0 remote:c54a602}} + BroadcastFilter{63bbb6 u-1 ReceiverList{ba6c751 3484 com.android.nfc/1027/u-1 remote:5c4a478}} + BroadcastFilter{95ad20d u0 ReceiverList{d8374a4 3586 com.google.android.googlequicksearchbox/10029/u0 remote:feb3737}} + BroadcastFilter{fdef551 u0 ReceiverList{28ca78 3745 com.google.android.gms.persistent/10012/u0 remote:f23afdb}} + BroadcastFilter{9830707 u0 ReceiverList{aabd946 3745 com.google.android.gms.persistent/10012/u0 remote:a4da121}} + BroadcastFilter{83c43d2 u0 ReceiverList{d422e5d 3745 com.google.android.gms.persistent/10012/u0 remote:f585034}} + BroadcastFilter{8890378 u0 ReceiverList{26d2cdb 3745 com.google.android.gms.persistent/10012/u0 remote:dfa61ea}} + BroadcastFilter{7bbb7 u0 ReceiverList{214b2b6 3745 com.google.android.gms.persistent/10012/u0 remote:8353a51}} + BroadcastFilter{38d3566 u0 ReceiverList{de859c1 3745 com.google.android.gms.persistent/10012/u0 remote:e003aa8}} + BroadcastFilter{3435d9f u0 ReceiverList{6e38b3e 3745 com.google.android.gms.persistent/10012/u0 remote:8dd7ff9}} + BroadcastFilter{d0a34bb u0 ReceiverList{5091d4a 3745 com.google.android.gms.persistent/10012/u0 remote:d6d22b5}} + BroadcastFilter{d43c416 u0 ReceiverList{51a3531 3745 com.google.android.gms.persistent/10012/u0 remote:d0b9dd8}} + BroadcastFilter{aabf36d u0 ReceiverList{a88bf84 3745 com.google.android.gms.persistent/10012/u0 remote:a9d6197}} + BroadcastFilter{93f16b u0 ReceiverList{5c61eba 17016 com.google.android.gm/10079/u0 remote:24083e5}} + BroadcastFilter{68f794e u0 ReceiverList{4cb1c49 947 com.google.android.googlequicksearchbox:search/10029/u0 remote:251d250}} + .. + MIME Typed Actions:</pre></p> + </section> + +<h2 id="monitor contention">Monitor contention</h2> +<p>Monitor contention logging can sometimes indicate actual monitor contention, +but most often indicates the system is so loaded that everything has slowed down. +You might see long monitor events logged by ART in system or event log.</p> + +<p>In the system log:</p> +<p><pre>10-01 18:12:44.343 29761 29914 W art : Long monitor contention event with owner method=void android.database.sqlite.SQLiteClosable.acquireReference() from SQLiteClosable.java:52 waiters=0 for 3.914s</pre></p> + +<p>In the event log:</p> +<p><pre>10-01 18:12:44.364 29761 29914 I dvm_lock_sample: [com.google.android.youtube,0,pool-3-thread-9,3914,ScheduledTaskMaster.java,138,SQLiteClosable.java,52,100]</pre></p> + +<h2 id="background-compilation">Background compilation</h2> +<p>Compilation can be expensive and load the device.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>09-14 06:27:05.670 2508 2587 E ActivityManager: CPU usage from 0ms to 5857ms later: +09-14 06:27:05.670 2508 2587 E ActivityManager: 84% 5708/dex2oat: 81% user + 2.3% kernel / faults: 3731 minor 1 major +09-14 06:27:05.670 2508 2587 E ActivityManager: 73% 2508/system_server: 21% user + 51% kernel / faults: 10019 minor 28 major +09-14 06:27:05.670 2508 2587 E ActivityManager: 1% 3935/com.android.phone: 0.3% user + 0.6% kernel / faults: 2684 minor 2 major</pre></p> + </section> +<p></p> + +<p>Compilation might occur in the background when Google Play store updates are +downloading. In this case, messages from the Google Play store app +(<code>finsky</code>) and <code>installd</code> appear prior to +<code>dex2oat</code> messages.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>10-07 08:42:33.725 11051 11051 D Finsky : [1] InstallerTask.advanceState: Prepare to patch com.garmin.android.apps.virb (com.garmin.android.apps.virb) from content://downloads/my_downloads/3602 format 2 +10-07 08:42:33.752 495 495 I installd: free_cache(48637657) avail 15111192576 +… +10-07 08:42:39.998 2497 2567 I PackageManager.DexOptimizer: Running dexopt (dex2oat) on: /data/app/vmdl436577137.tmp/base.apk pkg=com.garmin.android.apps.virb isa=arm vmSafeMode=false debuggable=false oatDir = /data/app/vmdl436577137.tmp/oat bootComplete=true +…</pre></p> + </section> +<p></p> + +<p>Compilation might also occur in the background when an application is loading +a dex file that has not yet been compiled. In this case, you won't see +<code>finsky</code> or <code>installd</code> logging.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>09-14 07:29:20.433 15736 15736 I dex2oat : /system/bin/dex2oat -j4 --dex-file=/data/user/0/com.facebook.katana/app_secondary_program_dex/program-72cef82b591768306676e10161c886b58b34315a308602be.dex.jar --oat-file=/data/user/0/com.facebook.katana/app_secondary_program_dex_opt/program-72cef82b591768306676e10161c886b58b34315a308602be.dex.dex +... +09-14 07:29:25.102 15736 15736 I dex2oat : dex2oat took 4.669s (threads: 4) arena alloc=7MB java alloc=3MB native alloc=29MB free=4MB</pre></p> + </section> + +<h2 id="narrative">Narrative</h2> +<p>Establishing the narrative of a problem (how it started, what happened, how +the system reacted) requires a solid timeline of events. You can use the +information in the bug report to sync timelines across multiple logs and +determine the exact timestamp of the bug report.</p> + +<h3 id="timelines">Syncing timelines</h3> +<p>A bugreport reflects multiple parallel timelines: system log, event log, +kernel log, and multiple specialized timelines for broadcasts, battery stats, +etc. Unfortunately, timelines are often reported using different time bases.</p> + +<p>The system and event log timestamps are in the same timezone as the user (as +are most other timestamps). For example, when user taps the home button, the +system log reports:</p> +<p><pre>10-03 17:19:52.939 1963 2071 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.google.android.googlequicksearchbox/com.google.android.launcher.GEL (has extras)} from uid 1000 on display 0</pre></p> + +<p>For the same action, the event log reports:</p> +<p><pre>10-03 17:19:54.279 1963 2071 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]</pre></p> + +<p>Kernel (<code>dmesg</code>) logs use a different time base, tagging log items +with seconds since bootloader completes. To register this timescale to other +timescales, search for <em>suspend exit</em> and <em>suspend entry</em> messages:</p> +<p><pre><6>[201640.779997] PM: suspend exit 2015-10-03 19:11:06.646094058 UTC +… +<6>[201644.854315] PM: suspend entry 2015-10-03 19:11:10.720416452 UTC</pre></p> + +<p>Because kernel logs might not include time while in suspend, you should +piecewise register the log between the suspend entry and exit messages. +Additionally, kernel logs use UTC timezone and must be adjusted to the user +timezone.</p> + +<h3 id="time-of-bugreport">Identifying bugreport time</h3> +<p>To determine when a bugreport was taken, first check the system log (Logcat) +for the <code>dumpstate: begin</code>:</p> +<p><pre>10-03 17:19:54.322 19398 19398 I dumpstate: begin</pre></p> + +<p>Next, check the kernel log (<code>dmesg</code>) timestamps for the <code>Starting service +'bugreport'</code> message:</p> +<p><pre><5>[207064.285315] init: Starting service 'bugreport'...</pre></p> + +<p>Work backwards to correlate the two events, keeping in mind the caveats +mentioned in <a href="#timelines">Syncing timelines</a>. While there's a lot +happening after the bugreport is initiated, most activity isn't very useful as +the act of taking the bugreport loads the system substantially.</p> + +<h2 id="power">Power</h2> + +<p>The event log contains screen power status, where 0 is screen off, 1 is +screen on, and 2 is for keyguard done.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>grep screen_toggled bugreport-2015-10-18-16-52-22.txt +10-18 15:05:04.383 992 992 I screen_toggled: 1 +10-18 15:05:07.010 992 992 I screen_toggled: 0 +10-18 15:23:15.063 992 992 I screen_toggled: 1 +10-18 15:23:25.684 992 992 I screen_toggled: 0 +10-18 15:36:31.623 992 992 I screen_toggled: 1 +10-18 15:36:37.660 3283 3283 I screen_toggled: 2</pre></p> + </section> + +<p></p> +<p>Bug reports also contain statistics about wake locks, a mechanism used by +application developers to indicate their application needs to have the device +stay on. (For details on wake locks, refer to +<a href="https://developer.android.com/reference/android/os/PowerManager.WakeLock.html">PowerManager.WakeLock</a> +and <a href="https://developer.android.com/training/scheduling/wakelock.html#cpu">Keep +the CPU on</a>.) + +<p>The aggregated wake lock duration statistics track <strong>only</strong> the +time a wake lock is actually responsible for keeping the device awake and +<strong>do not</strong> include time with the screen on. In addition, if +multiple wake locks are held simultaneously, the wake lock duration time is +distributed across those wake locks.</p> + +<p>For more help visualizing power status, use +<a href="https://github.com/google/battery-historian">Battery Historian</a>, a +Google open source tool to analyze battery consumers using Android bugreport +files.</p> + +<h2 id="packages">Packages</h2> +<p>The DUMP OF SERVICE package contains application versions (and other useful +info).</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>... +Packages: +... + Package [com.google.android.gms] (3cf534b): + userId=10013 + sharedUser=SharedUserSetting{98f3d28 com.google.uid.shared/10013} + pkg=Package{b8f6a41 com.google.android.gms} + codePath=/system/priv-app/PrebuiltGmsCore + resourcePath=/system/priv-app/PrebuiltGmsCore + legacyNativeLibraryDir=/system/priv-app/PrebuiltGmsCore/lib + primaryCpuAbi=arm64-v8a + secondaryCpuAbi=armeabi-v7a + versionCode=8186448 targetSdk=23 + versionName=8.1.86 (2287566-448) + splits=[base] + applicationInfo=ApplicationInfo{5158507 com.google.android.gms} + flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ] + privateFlags=[ PRIVILEGED ] + dataDir=/data/user/0/com.google.android.gms + supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] + libraries: + com.google.android.gms + usesOptionalLibraries: + com.android.location.provider + com.google.android.ble + com.android.media.remotedisplay + usesLibraryFiles: + /system/framework/com.android.media.remotedisplay.jar + /system/framework/com.android.location.provider.jar + timeStamp=2015-10-14 15:17:56 + firstInstallTime=2015-09-22 14:08:35 + lastUpdateTime=2015-10-14 15:17:56 + signatures=PackageSignatures{db63be6 [1af63d8]} + installPermissionsFixed=true installStatus=1 + pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ] + declared permissions: + com.google.android.gms.permission.INTERNAL_BROADCAST: prot=signature, INSTALLED + ... + com.google.android.gms.permission.CAR_VENDOR_EXTENSION: prot=dangerous, INSTALLED + User 0: installed=true hidden=false stopped=false notLaunched=false enabled=0 + disabledComponents: + com.google.android.gms.icing.service.PowerConnectedReceiver + ... + com.google.android.gms.icing.proxy.AppsMonitor + enabledComponents: + com.google.android.gms.mdm.receivers.GmsRegisteredReceiver + ... + com.google.android.gms.subscribedfeeds.SyncService</pre></p> + </section> + +<h2 id="processes">Processes</h2> +<p>Bug reports contain a huge amount of data for processes, including start and +stop time, runtime length, associated services, <code>oom_adj</code> score, etc. +For details on how Android manages processes, refer to +<a href="http://developer.android.com/guide/components/processes-and-threads.html">Processes +and Threads</a>.</p> + +<h3 id="process-runtime">Determining process runtime</h3> +<p>The <code>procstats</code> section contains complete statistics on how long +processes and associated services have been running. For a quick, human-readable +summary, search for <code>AGGREGATED OVER</code> to view data from either the +last three or 24 hours, then search for <code>Summary:</code> to view the list +of processes, how long those processes have run at various priorities, and their +RAM usage formatted as min-average-max PSS/min-average-max USS.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>------------------------------------------------------------------------------- +DUMP OF SERVICE processinfo: +------------------------------------------------------------------------------- +DUMP OF SERVICE procstats: +COMMITTED STATS FROM 2015-10-19-23-54-56 (checked in): +... +COMMITTED STATS FROM 2015-10-20-03-00-00 (checked in): +... +CURRENT STATS: +... +AGGREGATED OVER LAST 24 HOURS: +System memory usage: +... +Per-Package Stats: +... +Summary: +... + * com.google.android.gms.persistent / u0a13 / v8186448: + TOTAL: 100% (21MB-27MB-40MB/20MB-24MB-38MB over 597) + Top: 51% (22MB-26MB-38MB/21MB-24MB-36MB over 383) + Imp Fg: 49% (21MB-27MB-40MB/20MB-25MB-38MB over 214) +… + Start time: 2015-10-19 09:14:37 + Total elapsed time: +1d0h22m7s390ms (partial) libart.so + +AGGREGATED OVER LAST 3 HOURS: +System memory usage: +... +Per-Package Stats: +... +Summary: + * com.google.android.gms.persistent / u0a13 / v8186448: + TOTAL: 100% (23MB-27MB-32MB/21MB-25MB-29MB over 111) + Top: 61% (23MB-26MB-31MB/21MB-24MB-28MB over 67) + Imp Fg: 39% (23MB-28MB-32MB/21MB-26MB-29MB over 44) +... + Start time: 2015-10-20 06:49:24 + Total elapsed time: +2h46m59s736ms (partial) libart.so</pre></p> + </section> + +<h3 id="why-is-process-running">Why is a process running?</h3> +<p>The <code>dumpsys activity processes</code> section lists all currently +running processes ordered by <code>oom_adj</code> score (Android indicates +process importance by assigning the process an <code>oom_adj</code> value, which +can be dynamically updated by ActivityManager). The output is similar to that of +a <a href="#memory-snapshot">memory snapshot</a> but includes additional +information about what is causing the process to run. In the example below, +the bolded entries indicate the <code>gms.persistent</code> process is running +at <code>vis</code> (visible) priority because the system process is bound to +its <code>NetworkLocationService</code>.</p> + + <section class="expandable"> + <h4 class="showalways">Show example</h4> + <p><pre>------------------------------------------------------------------------------- +ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes) +... +Process LRU list (sorted by oom_adj, 34 total, non-act at 14, non-svc at 14): + PERS #33: sys F/ /P trm: 0 902:system/1000 (fixed) + PERS #32: pers F/ /P trm: 0 2925:com.android.systemui/u0a27 (fixed) + PERS #31: pers F/ /P trm: 0 3477:com.quicinc.cne.CNEService/1000 (fixed) + PERS #30: pers F/ /P trm: 0 3484:com.android.nfc/1027 (fixed) + PERS #29: pers F/ /P trm: 0 3502:com.qualcomm.qti.rcsbootstraputil/1001 (fixed) + PERS #28: pers F/ /P trm: 0 3534:com.qualcomm.qti.rcsimsbootstraputil/1001 (fixed) + PERS #27: pers F/ /P trm: 0 3553:com.android.phone/1001 (fixed) + Proc #25: psvc F/ /IF trm: 0 4951:com.android.bluetooth/1002 (service) + com.android.bluetooth/.hfp.HeadsetService<=Proc{902:system/1000} + Proc # 0: fore F/A/T trm: 0 3586:com.google.android.googlequicksearchbox/u0a29 (top-activity) + Proc #26: vis F/ /SB trm: 0 3374:com.google.android.googlequicksearchbox:interactor/u0a29 (service) + com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService<=Proc{902:system/1000} +<b> Proc # 5: vis F/ /T trm: 0 3745:com.google.android.gms.persistent/u0a12 (service)</b> +<b> com.google.android.gms/com.google.android.location.network.NetworkLocationService<=Proc{902:system/1000}</b> + Proc # 3: vis F/ /SB trm: 0 3279:com.google.android.gms/u0a12 (service) + com.google.android.gms/.icing.service.IndexService<=Proc{947:com.google.android.googlequicksearchbox:search/u0a29} + Proc # 2: vis F/ /T trm: 0 947:com.google.android.googlequicksearchbox:search/u0a29 (service) + com.google.android.googlequicksearchbox/com.google.android.sidekick.main.remoteservice.GoogleNowRemoteService<=Proc{3586:com.google.android.googlequicksearchbox/u0a29} + Proc # 1: vis F/ /T trm: 0 2981:com.google.process.gapps/u0a12 (service) + com.google.android.gms/.tapandpay.hce.service.TpHceService<=Proc{3484:com.android.nfc/1027} + Proc #11: prcp B/ /IB trm: 0 3392:com.google.android.inputmethod.latin/u0a64 (service) + com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME<=Proc{902:system/1000} + Proc #24: svc B/ /S trm: 0 27071:com.google.android.music:main/u0a67 (started-services) + Proc #22: svc B/ /S trm: 0 853:com.qualcomm.qcrilmsgtunnel/1001 (started-services) + Proc # 4: prev B/ /LA trm: 0 32734:com.google.android.GoogleCamera/u0a53 (previous) + Proc #23: svcb B/ /S trm: 0 671:com.qualcomm.telephony/1000 (started-services) + Proc #20: cch B/ /CE trm: 0 27659:com.android.providers.calendar/u0a2 (provider) + com.android.providers.calendar/.CalendarProvider2<=Proc{27697:com.google.android.calendar/u0a40} + Proc #13: cch B/ /CE trm: 0 653:com.google.android.gms.wearable/u0a12 (cch-empty) + Proc #10: cch B/ /S trm: 0 4067:com.google.android.talk/u0a62 (cch-started-ui-services) + Proc # 7: cch B/ /S trm: 0 18868:com.google.corp.huddle.android/u0a95 (cch-started-ui-services) + Proc # 6: cch B/ /CA trm: 0 27697:com.google.android.calendar/u0a40 (cch-act) + Proc # 8: cch+1 B/ /CA trm: 0 25675:com.google.android.apps.genie.geniewidget/u0a81 (cch-act) + Proc #16: cch+2 B/ /CE trm: 0 1272:com.google.android.keep/u0a106 (cch-empty) + Proc #15: cch+2 B/ /CE trm: 0 885:android.process.media/u0a9 (cch-empty) + Proc #14: cch+2 B/ /CE trm: 0 15146:android.process.acore/u0a3 (cch-empty) + Proc # 9: cch+3 B/ /CA trm: 0 17016:com.google.android.gm/u0a79 (cch-act) + Proc #19: cch+4 B/ /CE trm: 0 973:com.google.android.apps.maps/u0a66 (cch-empty) + Proc #18: cch+4 B/ /CE trm: 0 1091:com.google.android.apps.photos/u0a71 (cch-empty) + Proc #17: cch+4 B/ /CE trm: 0 1141:com.google.android.apps.plus/u0a74 (cch-empty) + Proc #12: cch+5 B/ /CA trm: 0 22299:com.google.android.apps.dogfood/u0a105 (cch-act) + Proc #21: cch+6 B/ /CE trm: 0 995:com.google.android.partnersetup/u0a18 (cch-empty)></pre></p> + </section> + +<h2 id=scans>Scans</h2> +<p>Use the following steps to identify applications performing excessive +Bluetooth Low Energy (BLE) scans:</p> +<ul> +<li>Find log messages for <code>BluetoothLeScanner</code>: +<pre> +$ grep 'BluetoothLeScanner' ~/downloads/bugreport.txt +07-28 15:55:19.090 24840 24851 D BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 +</pre></li> +<li>Locate the PID in the log messages. In this example, "24840" and +"24851" are PID (process ID) and TID (thread ID).</li> +<li>Locate the application associated with the PID: +<pre> +PID #24840: ProcessRecord{4fe996a 24840:com.badapp/u0a105} +</pre> +<p>In this example, the package name is <code>com.badapp</code>.</li> +<li>Look up the package name on Google Play to identify the responsible +application: +<strong>https://play.google.com/store/apps/details?id=com.badapp</strong>.</li> +</ul> +<p class=note><strong>Note</strong>: For devices running Android 7.0, the +system collects data for BLE scans and associates these activities +with the initiating application. For details, see +<a href="/devices/tech/power/values.html#le-bt-scans">Low Energy (LE) +and Bluetooth scans</a>.</p> + + </body> +</html> |