SlideShare a Scribd company logo
Android logging and debugging

          ●   By: Ashish Agrawal


                                   1
Android's boot up process
        Stage                 Steps                           Comments
Boot-loader          -                   Location: bootablebootloaderlegacyusbloader
                     init.S              Initializes stacks, zeros the BSS segment, call
                                         _main() in main.c
                     main.c              Initializes hardware (clocks, board, keypad,
                                         console), creates Linux tags
                                         Displays "USB FastBoot". Boot from flash, or loops
                                         while usb_poll() awaits host PC connection
Linux kernel         -                   Sets up the system, loads drivers, and starts
                                         running the first process init
The init process     Setup file system   Create and mount directories like /dev, /proc, /sys
                     Execute init.rc     This is the boot-up script, commands are using
                                         Android-specific syntax
                     Setup console
                     Display "A N D R    This is just a text msg written to /dev/tty0
                     O I D"
                     Zygote              Zygot process in init.rc brings up Dalvik Java VM
                                         and starts the system server
                     bootanimation       Shows the animation during boot-up                2
Framework            ….                  ….
Overview of Android Logging
          system




                              3
* Main - the main application log
This log contains output from android.util.Log class on Java side and
LOGE(LOGV, LOGI, LOGW.) macro on the native side.

* Events - for system event information
Events log reflects system diagnostic events which outputs using
android.util.EventLog class e.g:
System diagnostic events are used to record certain system-level events
(such as garbage collection, activity manager state, system watchdogs, and
other low level activity)

* Radio - for radio and phone-related information
The logging system automatically routes messages with specific tags (“RIL”,
“GSM” etc.) into the radio buffer.

* System - a log for low-level system messages
and debugging.
Many classes in the Android framework utilize the system log to keep their
messages separate from (possibly noisy) application log messages.             4
Slog.i(“Tag I want to see in the system log”, “Hello system log");
dumpsys/dumpstate
Dumps huge amounts of information about the system, including
status, counts and statistics


• Dumpstate reproduces lots of stuff from /proc
– Does a dumpsys as well
• Dumpsys show status information from Android services
– e.g. dumpsys alarm




                                                            5
Dumpsys Eg:
adb shell dumpsys battery
You will get output:
Current Battery Service state:
AC powered: false
AC capacity: 500000
USB powered: true
status: 5
health: 2
present: true
level: 100
scale: 100
voltage:4201
temperature: 271 <---------- Battery temperature! %)
technology: Li-poly <---------- Battery technology! %)

                                                         6
How to get kernel messages from
            Android?
●   To invoke the "dmesg" from the control PC, one can simply
    run
●   # adb shell dmesg
●   However, because "syslogd" is possibly not included in
    Android, there is no such logs, and one may find that the
    directory "/var" is not even created.One can just run the
    following command to continuously dump the kernel
    messages.
●   adb shell cat /proc/kmsg


                                                                7
Redirecting kernel messages
●   If the phone doesn't even boot up to a stable state where the
    ADB commands can be used, one might be interested in
    redirecting the kernel messages to some places where they
    can be seen. This is to leverage the "console=" command for
    the kernel.
●   For different devices, there may be different ports where the
    messages can be redirected to. USB SERIAL PORT, SERIAL
    PORT, UART port
●   Eg: console=ttyMSM2,115200n8, console=ttyUSB0,9600n8
    etc
●   In order to be used as a console, a device driver has to
    register itself as a console provider by calling register_console
    in kernel/printk.c, and it has to provide some callbacks for
    printk to write kernel messages.
Java Application Crash


When a Java application crashes, the Dalvik VM
will receive a SIGQUIT, it dumps stack traces for
      all threads and parse to plain text typo.
  Developer could use this dump together with
 AndroidRuntime error level log to locate error.



                                                    9
Example
----- pid 182 at 2009-03-06 06:15:22 -----
Cmd line: com.android.settings

DALVIK THREADS:
"main" prio=5 tid=3 NATIVE
 | group="main" sCount=1 dsCount=0 s=0 obj=0x40018dd8
 | sysTid=182 nice=0 sched=0/0 handle=-1096356708
 at android.os.BinderProxy.transact(Native Method)
 at
android.app.ActivityManagerProxy.handleApplicationError(ActivityMana
gerNative.java:2044)
 at com.android.internal.os.RuntimeInit.crash(RuntimeInit.java:302)
 at
com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtE
xception(RuntimeInit.java:75)
 at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:887)
 at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:884)
 at dalvik.system.NativeStart.main(Native Method)                   10
ANR
     In Android, the system guards against
applications that are insufficiently responsive for
  a period of time by displaying a dialog to the
 user, called the “Application Not Responding”
                  (ANR) dialog

  Note that system cannot show this dialog
sometimes due to internal problems e.g. if ANR
 occurred in the Activity or Window Manager.

                                                      11
What triggers ANR
In Android, application responsiveness is
monitored by the Activity Manager and Window
Manager system services. Android will display
the ANR dialog for a particular application when
it detects one of the following conditions:

  * No response to an input event (e.g. key
press, screen touch) within 5 seconds
  * A BroadcastReceiver hasn't finished
executing within 10 seconds

                                                   12
Click to11-28 12:30:56.258 489 505 W ActivityManager: Timeout executing
service: ServiceRecord{41f9c338
com.google.android.apps.maps/com.google.android.location.internal.server.G
oogleLocationService}
11-28 12:30:59.937 489 505 E ActivityManager: ANR in
com.google.android.apps.maps:GoogleLocationService
11-28 12:30:59.937 489 505 E ActivityManager: Reason: Executing service
com.google.android.apps.maps/com.google.android.location.internal.server.G
oogleLocationService
11-28 12:30:59.937 489 505 E ActivityManager: Load: 96.68 / 22.15 / 7.49
11-28 12:30:59.937 489 505 E ActivityManager: CPU usage from 6970ms
to 960ms ago:
11-28 12:30:59.937 489 505 E ActivityManager: 90% 9297/coredump:
82% user + 7.6% kernel
R
11-28 12:31:00.875 489 505 W ActivityManager: Killing
ProcessRecord{41b4af40
5361:com.google.android.apps.maps:GoogleLocationService/u0a35}:
background ANR
11-28 12:31:01.203 489 794 I ActivityManager: Process
com.google.android.apps.maps:GoogleLocationService (pid 5361) has died. 13
ANR hints
   * Look the “SIG: 9” line in the main thread and analyze nearby
messages. Sometimes system output information why it decided
that the thread is in ANR state.

  * In ANR log start your analysis from the “main” thread of the
process since this is a thread where UI works. The ANR concept
was specially invented with struggling “not responding” UI threads.

   * In ANR log check in which state is your main thread. If it is in
MONITOR state it can be in “dead lock” state. TIMED_WAIT state
can also point to the problems with locking of your thread by ‘sleep’
or ‘wait’ functions.

   * If the system itself (Activity or Window Managers) is in ANR
condition and cannot raise ANR so you cannot differentiate which
thread in which process is responsible for this analyze “Just Now”14
log.
Thread Status
* ZOMBIE – terminated thread
* RUNNABLE – runnable or running now
* TIMED_WAIT – timed waiting in Object.wait()
* MONITOR – blocked on a monitor
* WAIT – waiting in Object.wait()
* INITIALIZING - allocated, not yet running
* STARTING - started, not yet on thread list
* NATIVE - off in a JNI native method
* VMWAIT - waiting on a VM resource
* SUSPENDED - suspended, usually by GC or debugger
* UNKNOWN – thread is in the undefined state

                                                     15
How to read Android native crash
      log and stack trace
●   An Android crash in C/C++ code often
    generates some crash log which looks like the
    following.
●   The first is the build information in the system
    property "ro.build.fingerprint"

      I/DEBUG   (   730): *** *** *** *** *** *** *** *** *** *** *** *** ***
      *** *** ***
      I/DEBUG   (   730): Build fingerprint: 'generic/generic/generic/:1.5/...'




                                                                                  16



●
How to read Android crash log and
           stack trace
●   Then, it shows the process ID number (pid)
    and the thread id (tid). In this example, the PID
    and TID are the same. However, if the crash
    happens in a child thread, the thread ID tid will
    be different from pid.


      I/DEBUG   (   730): pid: 876, tid: 876   >>> /system/bin/mediaserver <<<




                                                                                 17


●
How to read Android crash log and
           stack trace
●   The following shows the signal which caused
    the process to abort, in this case, it's a
    segmentation fault. This is followed by the
    register values.

    I/DEBUG    (   730): signal 11 (SIGSEGV), fault   addr 00000010
    I/DEBUG    (   730): r0 00000000 r1 00016618      r2 80248f78 r3   00000000
    I/DEBUG    (   730): r4 80248f78 r5 0000d330      r6 80248f78 r7   beaf9974
    I/DEBUG    (   730): r8 00000000 r9 00000000      10 00000000 fp   00000000
    I/DEBUG    (   730): ip afd020c8 sp beaf98d8      lr 8021edcd pc   8021c630   cpsr
    a0000030




●                                                                                        18



●
How to read Android crash log and
           stack trace
●   This is the call stack trace. #00 is the depth of the stack
    pointer. The "pc <addr>" is the PC address in the stack.
    Sometimes, the "lr" link register containing the return address
    is shown instead of PC. It is followed by the file containing the
    code.


    I/DEBUG   ( 730):           #00 pc 0001c630   /system/lib/libhelixplayer.so
    I/DEBUG   ( 730):           #01 pc 0001edca   /system/lib/libhelixplayer.so
    I/DEBUG   ( 730):           #02 pc 0001ff0a   /system/lib/libhelixplayer.so
    I/DEBUG   ( 730):           #03 pc 000214e0   /system/lib/libutils.so
    I/DEBUG   ( 730):           #04 pc 0000e322
    /system/lib/libmediaplayerservice.so
    ...
    I/DEBUG   ( 730):           #15 pc b0001516   /system/bin/linker


●                                                                                 19


●
How to read Android crash log and
           stack trace
●   The following is actually the current stack with the stack
    pointer address and code dump. Each line contains 4 bytes
    (one machine word), and the address is in ascending order.
    The words in the stack are mapped onto the memory region it
    belongs to.

    I/DEBUG   (   730): stack:
    I/DEBUG   (   730):     beaf9898   00016618   [heap]
    I/DEBUG   (   730):     beaf989c   beaf98d0   [stack]
    I/DEBUG   (   730):     beaf98a0   0000db28   [heap]
    I/DEBUG   (   730):     beaf98a4   beaf98f8   [stack]
    I/DEBUG   (   730):     beaf98b8   8021cf4d   /system/lib/libhelixplayer.so
    I/DEBUG   (   730):     beaf98bc   80248f78
    I/DEBUG   (   730): #00 beaf98d8   0000d330   [heap]
    I/DEBUG   (   730):     beaf98dc   00000000
    I/DEBUG   (   730):     beaf98e0   0000d330   [heap]
    I/DEBUG   (   730):     beaf98e4   8021edcd   /system/lib/libhelixplayer.so
    I/DEBUG   (   730): #01 beaf98e8   80248f78
●                                                                                 20


●
Unix Signals
SIGHUP    1    Exit Hangup
SIGINT    2    Exit Interrupt
SIGQUIT   3    Core Quit
SIGILL    4    Core Illegal Instruction
SIGTRAP   5    Core Trace/Breakpoint Trap
SIGABRT   6    Core Abort
SIGEMT    7    Core Emulation Trap
SIGFPE    8    Core Arithmetic Exception
SIGKILL   9    Exit Killed
SIGBUS    10   Core Bus Error
SIGSEGV   11   Core Segmentation Fault
SIGSYS    12   Core Bad System Call
SIGPIPE   13   Exit Broken Pipe             21
Android Watchdog


Android framework's watchdog is meant to deal with
cases when any of the following locks is held for
more than a minute or when ServerThread is busy.

ActivityManagerService.this
PowerManagerService.mLocks
WindowManagerService.mWindowMap
WindowManagerService.mKeyguardTokenWatcher
WindowManagerService.mKeyWaiter
                                               22
Watchdog thread posts a message MONITOR to
android.server.ServerThread.
android.server.ServerThread's looper thread would read all
pending messages including watchdog's MONITOR message and
would invoke an appropriate handler.
The handler of MONITOR message would simply check for
availability of above mentioned locks.
If all, locks are available variable mCompleted (Watchdog.java)
would be set to true and watchdog would continue to post
MONITOR messages once every minute.
mCompleted stays false only when any of the above locks is held
by any thread of system_server for more than a minute or if the23
MONITOR message isn't handled by ServerThread.
In this case, MONITOR is handled but can't be serviced due
to unavailability of lock (ActivityManagerService)

"android.server.ServerThread" prio=5 tid=8 MONITOR
group="main" sCount=1 dsCount=0 s=N obj=0x4690be50
self=0x54e440
sysTid=206 nice=-2 sched=0/0 cgrp=unknown handle=5562400
at
com.android.server.am.ActivityManagerService.monitor(ActivityMana
gerService.java:~14726)
- waiting to lock (0x4691a9b8) (a
com.android.server.am.ActivityManagerService) held by threadid=41
(Binder Thread #7)
at
com.android.server.Watchdog$HeartbeatHandler.handleMessage(W
atchdog.java:306)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at com.android.server.ServerThread.run(SystemServer.java:517) 24
When you are no longer wanted..

Android open source project supports a
maximum of 15 hidden applications running at
any point and any attempt to launch new apps
kills the least recently used ones. This is done to
reduce the load on RAM and has been the case
since early version of Android.
       02-19 13:43:55.194 I/ActivityManager( 1096): No longer want
          com.lge.omadmclient:remote (pid 23052): hidden #16




                                                                     25
References:

http://bootloader.wikidot.com/linux:boot:android
http://softteco.blogspot.com/2011/04/android-playing-with-dumpsys.html
http://bootloader.wikidot.com/linux:android:crashlog
https://github.com/keesj/gomo/wiki
http://elinux.org/Android_Portal




                                                                         26

More Related Content

What's hot (20)

PPT
Learning AOSP - Android Booting Process
Nanik Tolaram
 
PPT
Android booting sequece and setup and debugging
Utkarsh Mankad
 
PDF
Embedded Android : System Development - Part II (HAL)
Emertxe Information Technologies Pvt Ltd
 
PDF
Android OTA updates
Gary Bisson
 
PPT
Learning AOSP - Android Linux Device Driver
Nanik Tolaram
 
PDF
Design and Concepts of Android Graphics
National Cheng Kung University
 
PDF
Android Boot Time Optimization
Kan-Ru Chen
 
PDF
Embedded Android : System Development - Part IV
Emertxe Information Technologies Pvt Ltd
 
PDF
Android's Multimedia Framework
Opersys inc.
 
PPTX
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Bin Chen
 
PDF
Embedded Android Workshop with Pie
Opersys inc.
 
PPTX
Binder: Android IPC
Shaul Rosenzwieg
 
PDF
Explore Android Internals
National Cheng Kung University
 
PDF
Low Level View of Android System Architecture
National Cheng Kung University
 
PPTX
Android Booting Sequence
Jayanta Ghoshal
 
PDF
Embedded Android : System Development - Part I
Emertxe Information Technologies Pvt Ltd
 
PDF
Embedded Android : System Development - Part III (Audio / Video HAL)
Emertxe Information Technologies Pvt Ltd
 
ODP
Embedded Android : System Development - Part III
Emertxe Information Technologies Pvt Ltd
 
PDF
Android Internals
Opersys inc.
 
PDF
Embedded Android : System Development - Part II (Linux device drivers)
Emertxe Information Technologies Pvt Ltd
 
Learning AOSP - Android Booting Process
Nanik Tolaram
 
Android booting sequece and setup and debugging
Utkarsh Mankad
 
Embedded Android : System Development - Part II (HAL)
Emertxe Information Technologies Pvt Ltd
 
Android OTA updates
Gary Bisson
 
Learning AOSP - Android Linux Device Driver
Nanik Tolaram
 
Design and Concepts of Android Graphics
National Cheng Kung University
 
Android Boot Time Optimization
Kan-Ru Chen
 
Embedded Android : System Development - Part IV
Emertxe Information Technologies Pvt Ltd
 
Android's Multimedia Framework
Opersys inc.
 
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Bin Chen
 
Embedded Android Workshop with Pie
Opersys inc.
 
Binder: Android IPC
Shaul Rosenzwieg
 
Explore Android Internals
National Cheng Kung University
 
Low Level View of Android System Architecture
National Cheng Kung University
 
Android Booting Sequence
Jayanta Ghoshal
 
Embedded Android : System Development - Part I
Emertxe Information Technologies Pvt Ltd
 
Embedded Android : System Development - Part III (Audio / Video HAL)
Emertxe Information Technologies Pvt Ltd
 
Embedded Android : System Development - Part III
Emertxe Information Technologies Pvt Ltd
 
Android Internals
Opersys inc.
 
Embedded Android : System Development - Part II (Linux device drivers)
Emertxe Information Technologies Pvt Ltd
 

Similar to Android crash debugging (20)

PDF
Android Logging System
William Lee
 
PDF
Android Internals at Linaro Connect Asia 2013
Opersys inc.
 
PDF
Logging system of Android
Tetsuyuki Kobayashi
 
PDF
Init of Android
Tetsuyuki Kobayashi
 
PDF
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Opersys inc.
 
PPTX
Zeelogic android-training-2013
Zeelogic Solu
 
PDF
Android Attacks
Michael Scovetta
 
PDF
Logging system of Android
Tetsuyuki Kobayashi
 
PDF
Hacking Android OS
Jimmy Software
 
PDF
Headless Android
Opersys inc.
 
PDF
Android internals
rabah3
 
PPTX
Curso de Desenvolvimento Mobile - Android - Stack
Jackson F. de A. Mafra
 
PDF
Android is NOT just 'Java on Linux'
Tetsuyuki Kobayashi
 
PPT
Android OS
Nitin Ramchandani
 
PDF
An Introduction To Android
natdefreitas
 
PDF
Inside Android's UI
Opersys inc.
 
PDF
Leveraging Android's Linux Heritage
Opersys inc.
 
PDF
Android for Embedded Linux Developers
Opersys inc.
 
Android Logging System
William Lee
 
Android Internals at Linaro Connect Asia 2013
Opersys inc.
 
Logging system of Android
Tetsuyuki Kobayashi
 
Init of Android
Tetsuyuki Kobayashi
 
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Opersys inc.
 
Zeelogic android-training-2013
Zeelogic Solu
 
Android Attacks
Michael Scovetta
 
Logging system of Android
Tetsuyuki Kobayashi
 
Hacking Android OS
Jimmy Software
 
Headless Android
Opersys inc.
 
Android internals
rabah3
 
Curso de Desenvolvimento Mobile - Android - Stack
Jackson F. de A. Mafra
 
Android is NOT just 'Java on Linux'
Tetsuyuki Kobayashi
 
Android OS
Nitin Ramchandani
 
An Introduction To Android
natdefreitas
 
Inside Android's UI
Opersys inc.
 
Leveraging Android's Linux Heritage
Opersys inc.
 
Android for Embedded Linux Developers
Opersys inc.
 
Ad

More from Ashish Agrawal (14)

PDF
Difference between product manager, program manager and project manager.
Ashish Agrawal
 
PDF
5 management &amp; leadership lessons from movie mission mangal
Ashish Agrawal
 
PDF
7 factors determining deeper impact of ar based mobile application on user ex...
Ashish Agrawal
 
PDF
E paper-IOT based-medical-emergency-detection-and-rescue
Ashish Agrawal
 
PPTX
Gcm and share point integration
Ashish Agrawal
 
PPTX
Mobile engagement platform
Ashish Agrawal
 
PPTX
Agile QA process
Ashish Agrawal
 
PPTX
Odata batch processing
Ashish Agrawal
 
PPTX
Side loading
Ashish Agrawal
 
PPTX
Client certificate validation in windows 8
Ashish Agrawal
 
PPTX
Open office doc inside windows metro app
Ashish Agrawal
 
PPTX
Lync integration with metro app
Ashish Agrawal
 
ODP
E learning-for-all-devices
Ashish Agrawal
 
PPT
Android overview
Ashish Agrawal
 
Difference between product manager, program manager and project manager.
Ashish Agrawal
 
5 management &amp; leadership lessons from movie mission mangal
Ashish Agrawal
 
7 factors determining deeper impact of ar based mobile application on user ex...
Ashish Agrawal
 
E paper-IOT based-medical-emergency-detection-and-rescue
Ashish Agrawal
 
Gcm and share point integration
Ashish Agrawal
 
Mobile engagement platform
Ashish Agrawal
 
Agile QA process
Ashish Agrawal
 
Odata batch processing
Ashish Agrawal
 
Side loading
Ashish Agrawal
 
Client certificate validation in windows 8
Ashish Agrawal
 
Open office doc inside windows metro app
Ashish Agrawal
 
Lync integration with metro app
Ashish Agrawal
 
E learning-for-all-devices
Ashish Agrawal
 
Android overview
Ashish Agrawal
 
Ad

Recently uploaded (20)

PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
July Patch Tuesday
Ivanti
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
July Patch Tuesday
Ivanti
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 

Android crash debugging

  • 1. Android logging and debugging ● By: Ashish Agrawal 1
  • 2. Android's boot up process Stage Steps Comments Boot-loader - Location: bootablebootloaderlegacyusbloader init.S Initializes stacks, zeros the BSS segment, call _main() in main.c main.c Initializes hardware (clocks, board, keypad, console), creates Linux tags Displays "USB FastBoot". Boot from flash, or loops while usb_poll() awaits host PC connection Linux kernel - Sets up the system, loads drivers, and starts running the first process init The init process Setup file system Create and mount directories like /dev, /proc, /sys Execute init.rc This is the boot-up script, commands are using Android-specific syntax Setup console Display "A N D R This is just a text msg written to /dev/tty0 O I D" Zygote Zygot process in init.rc brings up Dalvik Java VM and starts the system server bootanimation Shows the animation during boot-up 2 Framework …. ….
  • 3. Overview of Android Logging system 3
  • 4. * Main - the main application log This log contains output from android.util.Log class on Java side and LOGE(LOGV, LOGI, LOGW.) macro on the native side. * Events - for system event information Events log reflects system diagnostic events which outputs using android.util.EventLog class e.g: System diagnostic events are used to record certain system-level events (such as garbage collection, activity manager state, system watchdogs, and other low level activity) * Radio - for radio and phone-related information The logging system automatically routes messages with specific tags (“RIL”, “GSM” etc.) into the radio buffer. * System - a log for low-level system messages and debugging. Many classes in the Android framework utilize the system log to keep their messages separate from (possibly noisy) application log messages. 4 Slog.i(“Tag I want to see in the system log”, “Hello system log");
  • 5. dumpsys/dumpstate Dumps huge amounts of information about the system, including status, counts and statistics • Dumpstate reproduces lots of stuff from /proc – Does a dumpsys as well • Dumpsys show status information from Android services – e.g. dumpsys alarm 5
  • 6. Dumpsys Eg: adb shell dumpsys battery You will get output: Current Battery Service state: AC powered: false AC capacity: 500000 USB powered: true status: 5 health: 2 present: true level: 100 scale: 100 voltage:4201 temperature: 271 <---------- Battery temperature! %) technology: Li-poly <---------- Battery technology! %) 6
  • 7. How to get kernel messages from Android? ● To invoke the "dmesg" from the control PC, one can simply run ● # adb shell dmesg ● However, because "syslogd" is possibly not included in Android, there is no such logs, and one may find that the directory "/var" is not even created.One can just run the following command to continuously dump the kernel messages. ● adb shell cat /proc/kmsg 7
  • 8. Redirecting kernel messages ● If the phone doesn't even boot up to a stable state where the ADB commands can be used, one might be interested in redirecting the kernel messages to some places where they can be seen. This is to leverage the "console=" command for the kernel. ● For different devices, there may be different ports where the messages can be redirected to. USB SERIAL PORT, SERIAL PORT, UART port ● Eg: console=ttyMSM2,115200n8, console=ttyUSB0,9600n8 etc ● In order to be used as a console, a device driver has to register itself as a console provider by calling register_console in kernel/printk.c, and it has to provide some callbacks for printk to write kernel messages.
  • 9. Java Application Crash When a Java application crashes, the Dalvik VM will receive a SIGQUIT, it dumps stack traces for all threads and parse to plain text typo. Developer could use this dump together with AndroidRuntime error level log to locate error. 9
  • 10. Example ----- pid 182 at 2009-03-06 06:15:22 ----- Cmd line: com.android.settings DALVIK THREADS: "main" prio=5 tid=3 NATIVE | group="main" sCount=1 dsCount=0 s=0 obj=0x40018dd8 | sysTid=182 nice=0 sched=0/0 handle=-1096356708 at android.os.BinderProxy.transact(Native Method) at android.app.ActivityManagerProxy.handleApplicationError(ActivityMana gerNative.java:2044) at com.android.internal.os.RuntimeInit.crash(RuntimeInit.java:302) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtE xception(RuntimeInit.java:75) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:887) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:884) at dalvik.system.NativeStart.main(Native Method) 10
  • 11. ANR In Android, the system guards against applications that are insufficiently responsive for a period of time by displaying a dialog to the user, called the “Application Not Responding” (ANR) dialog Note that system cannot show this dialog sometimes due to internal problems e.g. if ANR occurred in the Activity or Window Manager. 11
  • 12. What triggers ANR In Android, application responsiveness is monitored by the Activity Manager and Window Manager system services. Android will display the ANR dialog for a particular application when it detects one of the following conditions: * No response to an input event (e.g. key press, screen touch) within 5 seconds * A BroadcastReceiver hasn't finished executing within 10 seconds 12
  • 13. Click to11-28 12:30:56.258 489 505 W ActivityManager: Timeout executing service: ServiceRecord{41f9c338 com.google.android.apps.maps/com.google.android.location.internal.server.G oogleLocationService} 11-28 12:30:59.937 489 505 E ActivityManager: ANR in com.google.android.apps.maps:GoogleLocationService 11-28 12:30:59.937 489 505 E ActivityManager: Reason: Executing service com.google.android.apps.maps/com.google.android.location.internal.server.G oogleLocationService 11-28 12:30:59.937 489 505 E ActivityManager: Load: 96.68 / 22.15 / 7.49 11-28 12:30:59.937 489 505 E ActivityManager: CPU usage from 6970ms to 960ms ago: 11-28 12:30:59.937 489 505 E ActivityManager: 90% 9297/coredump: 82% user + 7.6% kernel R 11-28 12:31:00.875 489 505 W ActivityManager: Killing ProcessRecord{41b4af40 5361:com.google.android.apps.maps:GoogleLocationService/u0a35}: background ANR 11-28 12:31:01.203 489 794 I ActivityManager: Process com.google.android.apps.maps:GoogleLocationService (pid 5361) has died. 13
  • 14. ANR hints * Look the “SIG: 9” line in the main thread and analyze nearby messages. Sometimes system output information why it decided that the thread is in ANR state. * In ANR log start your analysis from the “main” thread of the process since this is a thread where UI works. The ANR concept was specially invented with struggling “not responding” UI threads. * In ANR log check in which state is your main thread. If it is in MONITOR state it can be in “dead lock” state. TIMED_WAIT state can also point to the problems with locking of your thread by ‘sleep’ or ‘wait’ functions. * If the system itself (Activity or Window Managers) is in ANR condition and cannot raise ANR so you cannot differentiate which thread in which process is responsible for this analyze “Just Now”14 log.
  • 15. Thread Status * ZOMBIE – terminated thread * RUNNABLE – runnable or running now * TIMED_WAIT – timed waiting in Object.wait() * MONITOR – blocked on a monitor * WAIT – waiting in Object.wait() * INITIALIZING - allocated, not yet running * STARTING - started, not yet on thread list * NATIVE - off in a JNI native method * VMWAIT - waiting on a VM resource * SUSPENDED - suspended, usually by GC or debugger * UNKNOWN – thread is in the undefined state 15
  • 16. How to read Android native crash log and stack trace ● An Android crash in C/C++ code often generates some crash log which looks like the following. ● The first is the build information in the system property "ro.build.fingerprint" I/DEBUG ( 730): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** I/DEBUG ( 730): Build fingerprint: 'generic/generic/generic/:1.5/...' 16 ●
  • 17. How to read Android crash log and stack trace ● Then, it shows the process ID number (pid) and the thread id (tid). In this example, the PID and TID are the same. However, if the crash happens in a child thread, the thread ID tid will be different from pid. I/DEBUG ( 730): pid: 876, tid: 876 >>> /system/bin/mediaserver <<< 17 ●
  • 18. How to read Android crash log and stack trace ● The following shows the signal which caused the process to abort, in this case, it's a segmentation fault. This is followed by the register values. I/DEBUG ( 730): signal 11 (SIGSEGV), fault addr 00000010 I/DEBUG ( 730): r0 00000000 r1 00016618 r2 80248f78 r3 00000000 I/DEBUG ( 730): r4 80248f78 r5 0000d330 r6 80248f78 r7 beaf9974 I/DEBUG ( 730): r8 00000000 r9 00000000 10 00000000 fp 00000000 I/DEBUG ( 730): ip afd020c8 sp beaf98d8 lr 8021edcd pc 8021c630 cpsr a0000030 ● 18 ●
  • 19. How to read Android crash log and stack trace ● This is the call stack trace. #00 is the depth of the stack pointer. The "pc <addr>" is the PC address in the stack. Sometimes, the "lr" link register containing the return address is shown instead of PC. It is followed by the file containing the code. I/DEBUG ( 730): #00 pc 0001c630 /system/lib/libhelixplayer.so I/DEBUG ( 730): #01 pc 0001edca /system/lib/libhelixplayer.so I/DEBUG ( 730): #02 pc 0001ff0a /system/lib/libhelixplayer.so I/DEBUG ( 730): #03 pc 000214e0 /system/lib/libutils.so I/DEBUG ( 730): #04 pc 0000e322 /system/lib/libmediaplayerservice.so ... I/DEBUG ( 730): #15 pc b0001516 /system/bin/linker ● 19 ●
  • 20. How to read Android crash log and stack trace ● The following is actually the current stack with the stack pointer address and code dump. Each line contains 4 bytes (one machine word), and the address is in ascending order. The words in the stack are mapped onto the memory region it belongs to. I/DEBUG ( 730): stack: I/DEBUG ( 730): beaf9898 00016618 [heap] I/DEBUG ( 730): beaf989c beaf98d0 [stack] I/DEBUG ( 730): beaf98a0 0000db28 [heap] I/DEBUG ( 730): beaf98a4 beaf98f8 [stack] I/DEBUG ( 730): beaf98b8 8021cf4d /system/lib/libhelixplayer.so I/DEBUG ( 730): beaf98bc 80248f78 I/DEBUG ( 730): #00 beaf98d8 0000d330 [heap] I/DEBUG ( 730): beaf98dc 00000000 I/DEBUG ( 730): beaf98e0 0000d330 [heap] I/DEBUG ( 730): beaf98e4 8021edcd /system/lib/libhelixplayer.so I/DEBUG ( 730): #01 beaf98e8 80248f78 ● 20 ●
  • 21. Unix Signals SIGHUP 1 Exit Hangup SIGINT 2 Exit Interrupt SIGQUIT 3 Core Quit SIGILL 4 Core Illegal Instruction SIGTRAP 5 Core Trace/Breakpoint Trap SIGABRT 6 Core Abort SIGEMT 7 Core Emulation Trap SIGFPE 8 Core Arithmetic Exception SIGKILL 9 Exit Killed SIGBUS 10 Core Bus Error SIGSEGV 11 Core Segmentation Fault SIGSYS 12 Core Bad System Call SIGPIPE 13 Exit Broken Pipe 21
  • 22. Android Watchdog Android framework's watchdog is meant to deal with cases when any of the following locks is held for more than a minute or when ServerThread is busy. ActivityManagerService.this PowerManagerService.mLocks WindowManagerService.mWindowMap WindowManagerService.mKeyguardTokenWatcher WindowManagerService.mKeyWaiter 22
  • 23. Watchdog thread posts a message MONITOR to android.server.ServerThread. android.server.ServerThread's looper thread would read all pending messages including watchdog's MONITOR message and would invoke an appropriate handler. The handler of MONITOR message would simply check for availability of above mentioned locks. If all, locks are available variable mCompleted (Watchdog.java) would be set to true and watchdog would continue to post MONITOR messages once every minute. mCompleted stays false only when any of the above locks is held by any thread of system_server for more than a minute or if the23 MONITOR message isn't handled by ServerThread.
  • 24. In this case, MONITOR is handled but can't be serviced due to unavailability of lock (ActivityManagerService) "android.server.ServerThread" prio=5 tid=8 MONITOR group="main" sCount=1 dsCount=0 s=N obj=0x4690be50 self=0x54e440 sysTid=206 nice=-2 sched=0/0 cgrp=unknown handle=5562400 at com.android.server.am.ActivityManagerService.monitor(ActivityMana gerService.java:~14726) - waiting to lock (0x4691a9b8) (a com.android.server.am.ActivityManagerService) held by threadid=41 (Binder Thread #7) at com.android.server.Watchdog$HeartbeatHandler.handleMessage(W atchdog.java:306) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at com.android.server.ServerThread.run(SystemServer.java:517) 24
  • 25. When you are no longer wanted.. Android open source project supports a maximum of 15 hidden applications running at any point and any attempt to launch new apps kills the least recently used ones. This is done to reduce the load on RAM and has been the case since early version of Android. 02-19 13:43:55.194 I/ActivityManager( 1096): No longer want com.lge.omadmclient:remote (pid 23052): hidden #16 25