안드로이드 dumpstate 분석

dumpstate는 안드로이드 시스템의 정보를 로그로 만들어준다.

>adb shell dumpstate

>adb shell bugreport

로 확인할 수 있는데, 발생한 문제를 확인하는데 큰 도움이 될 수 있다. 그럼 어떤 정보가 있는지 한번 확인해보자.

요약정보

빌드 번호와 커널 정보 등으로 시작되는 부분을 요약정보라고 부르겠다.  하드웨어 레벨의 메모리와 CPU 정보도 보인다. 여기서 물리적 메모리 사이즈와 CPU 코어의 갯수나 속도 등을 확인할 수 있다.

------ MEMORY INFO (/proc/meminfo) ------
...
------ CPU CORE INFO ------
...

PROCESSES

대부분은 하드웨어나 커널 정보이므로 어플리케이션 개발자에게는 큰 도움이 되지 않는다. 하지만, 프로세스 목록은 유용하다.

------ PROCESSES (ps -P --abi) ------
USER      PID   PPID  VSIZE   RSS   PCY WCHAN      PC         ABI NAME
...
u0_a147   18350 3170  1627032 44260 bg  SyS_epoll_ 0000000000 S com.android.calendar
...

여기서 package name을 기준으로 프로세스 아이디(PID)를 찾을 수 있다. 위 예제에서 구글 캘린더(com.android.calendar)의 프로세스 아이디(PID)는 18350이다. PID는 한 번 앱이 실행되어 프로세스가 될 때마다 부여되는 고유번호이다. 로그를 확인할 때 PID를 기준으로 탐색하면 유용하다. 프로세스가 종료 후 재실행 되었다면, PID가 2개 이상일 수도 있다.

로그

시간 순으로 남는 로그는 커널 로그, 시스템 로그, 이벤트 로그, 라디오 로그로 크게 4종류다.

------ KERNEL LOG (dmesg) ------
...
------ SYSTEM LOG (logcat -v threadtime -d *:v) ------
...
------ EVENT LOG (logcat -b events -v threadtime -d *:v) ------
...

이 중 커널로그는 uptime을 기준으로 상대적인 시간 정보와 함께 로그가 남고, 시스템 로그와 이벤트 로그는 사용자 시간 기준으로 로그가 남는다.

일반적인 어플리케이션 개발자라면 시스템 로그를 통해 대부분의 문제를 해결할 것이다.

SYSTEM LOG

어플리케이션에서 android.util.Log 클래스를 통해 남긴 로그는 여기에 남는다. 실행되는 모든 어플리케이션이 여기에 로그를 남길 수 있기 때문에 로그의 양이 상당이 많다.

------ SYSTEM LOG (logcat -v threadtime -d *:v) ------
--------- beginning of main
...
12-28 15:31:16.251 17746 17746 D InjectionManager: InjectionManager
12-28 15:31:16.251 17746 17746 D InjectionManager: fillFeatureStoreMap com.samsung.faceservice
12-28 15:31:16.251 17746 17746 I InjectionManager: Constructor com.samsung.faceservice, Feature store :{}
12-28 15:31:16.251 17746 17746 I InjectionManager: featureStore :{}
...

로그는 각 줄마다 로그 발생 시간과 PID, TID, 로그 레벨, TAG, 사용자 메시지가 표시된다.

로그 레벨은 Log 클래스에 표시되어 있다.

...
/**
 * Priority constant for the println method; use Log.v.
 */
public static final int VERBOSE = 2;

/**
 * Priority constant for the println method; use Log.d.
 */
public static final int DEBUG = 3;

/**
 * Priority constant for the println method; use Log.i.
 */
public static final int INFO = 4;

/**
 * Priority constant for the println method; use Log.w.
 */
public static final int WARN = 5;

/**
 * Priority constant for the println method; use Log.e.
 */
public static final int ERROR = 6;

/**
 * Priority constant for the println method.
 */
public static final int ASSERT = 7;
...

또한 어플리케이션이 죽을 때 발생하는 Exceptiion이나 Error 정보도 볼 수 있다. 시중에 logcat을 보는 프로그램이나 앱이 많이 나와있는데, 모두 이부분을 파싱하여 각 정보별로 나누어 보기좋게 해준다.  또한, PID나 TID, TAG나 내용 별로 필터링하여 보여주는 기능도 대부분 제공한다.

사용자가 앱을 사용하는 히스토리는 여기에만 남기 때문에 debugging을 위해서는 로그를 잘 남기는 것이 중요하다.

EVENT LOG

다음과 같은 메시지로 시작하는 로그다. android.util.EventLog 쓰면 여기에 남는다. 시스템 레벨의 이벤트(가비지 콜렉션, 액티비티 매니저 상태, 시스템 와치독 등)가 남는다.

------ EVENT LOG (logcat -b events -v threadtime -d *:v) ------

이벤트 로그의 태그는 단말 내에 저장된 /system/etc/event-log-tags 파일을 참조하면 된다.

어플리케이션 개발자 보다는 시스템 담당자를 위한 정보라고 하지만, 어플리케이션 개발자도 유용한 정보를 얻을 수 있다. 대표적으로는, ANR이나 F/C(Force Close) 정보다.

ANR은 “am_anr”, F/C는 “am_crash”라는 태그로 검색하면 쉽게 로그에 당시의 기록이 남아있는지, 있다면 문제가 발생한 위치가 어디인지 확인할 수 있다. 참고로, 여기서 “am”이라는 prefix는 Activity Manager를 가리킨다.

VM TRACES JUST NOW

dumpstate 로그가 만들어질 시간의 PID 기준의 VM 정보를 보여준다.

------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2015-12-31 10:59:13) ------
...

스레드 정보 뿐 아니라 어플리케이션에 관한 상당히 상세한 정보(가 함께 남는다.

----- pid 12715 at 2015-12-31 10:59:03 -----
Cmd line: system_server
...
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=4083 post zygote classes=5361
Intern table: 84649 strong; 16061 weak
...

VM TRACES AT LAST ANR

ANR 데이터가 표시된다. ANR 문제가 아니라면 다음처럼 비어있을 것이다.

*** NO ANR VM TRACES FILE (/data/anr/traces.txt): No such file or directory

만약 ANR이라면, 다음과 같이 ANR이 발생한 어플리케이션의 정보와 콜스택이 나온다.

------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2015-10-29 16:10:09) ------
...

많은 정보가 나오지만 ANR은 메인 스레드(일명, UI 스레드)가 오랫동안 잡혀있을 때 발생하는 것이기 때문에, “main” 스레드의 콜스택부터 확인하면 된다.

ANR에 대한 다른 내용은 지난 글을 참조하자.

TOMBSTONES

묘비(tombstone)라는 뜻으로, VM 안에서 문제가 발생한 경우에는 다음처럼 비어있다.

*** NO TOMBSTONES to dump in /data/tombstones

네이티브(native) 쪽에서 에러가 발생한 경우에는 문제가 발생한 어플리케이션의 정보와 메모리 정보, 스택, 함께 문제가 발행한 네이티브 코드 정보가 표시된다. 하지만, 어플리케이션 개발자는 단말의 바이너리를 직접 빌드하지 않기 때문에 소스를 볼 수 없어 문제 원인을 직접 확인할 수는 없는 경우가 많다. Tombstones 분석에 대해서는 이 글을 참조하자.

NETWORK DEV INFO

단말에 설치된 어플리케이션은 네트워크를 대부분 쓴다. 이 네트워크에 문제가 생기는 경우에 대한 문제 분석이 쉽지 않은데, 패킷 교환이 원활했는지 이부분으로 확인할 수 있다.

다음은 WiFi 상태가 원활한 경우다.

------ NETWORK DEV INFO (/proc/net/dev) ------
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
...
 wlan0: 23192305   17498    0    0    0     0          0       465  1113708   12689    0    0    0     0       0          0
...

원활하지 못한 경우는 error나 drop이 발생할 수 있다. 다음처럼 말이다.

------ NETWORK DEV INFO (/proc/net/dev) ------
Inter-|   Receive                                                |  Transmit
 face       |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
...
 wlan0:      8253341    6519    0    0    0     0          0         0   355420    4585    0    2    0     0       0          0
...

drop은 패킷은 단말에 도착하였으나, driver에서 버린 경우로 보통 버퍼가 없을 때 발생한다.

POWER ON INFO

단말이 켜지고 나서 중요한 시스템 서비스나 이벤트가 발생한 시간도 알 수 있다.

------ POWER ON INFO (/proc/boot_stat) ------
boot event                      time (ms)        delta
-----------------------------------------------------
!@Boot: start init process                         :  2654        0
!@Boot: Begin of preload()                         :  5985     3331
!@Boot: End of preload()                           :  7165     1180
!@Boot: Entered the Android system server!         :  7306      141
!@Boot: Start PackageManagerService                :  7876      570
!@Boot: End PackageManagerService                  : 10827     2951
!@Boot: Loop forever                               : 14127     3300
!@Boot: performEnableScreen                        : 16245     2118
!@Boot: Enabling Screen!                           : 17214      969
!@Boot: bootcomplete                               : 17307       93
!@Boot: Voice SVC is acquired                      : 26974     9667
!@Boot: Data SVC is acquired                       : 53278    26304
!@Boot_SVC : PhoneApp OnCrate                      :     0    -53278
!@Boot_SVC : RIL_UNSOL_RIL_CONNECTED               : 16850    16850
!@Boot_SVC : setRadioPower on                      : 17516      666
!@Boot_SVC : setUiccSubscription                   : 17976      460
!@Boot_SVC : SIM onAllRecordsLoaded                : 18596      620
!@Boot_SVC : RUIM onAllRecordsLoaded               :     0    -18596
!@Boot_SVC : setupDataCall                         : 53039    53039

단말이 켜진 직 후 어떤 작업을 하고자 할 때,  ACTION_BOOT_COMPLETED를 브로드캐스트를 통해 처리하므로 참고할만 하다.

NETWORK DIAGNOSTICS

네트워크 진단 정보도 남는다.

------ NETWORK DIAGNOSTICS (dumpsys connectivity --diag) ------

NetworkDiagnostics:ifaces{wlan0} index{14} network{502} nethandle{2156090018526}
  ICMPv4 dst{8.8.8.8} src{192.168.2.51:2}: FAILED: 0/16 (4824ms)
  ICMPv4 dst{192.168.2.1} src{192.168.2.51:1}: SUCCEEDED: 1/2 (515ms)
  DNS UDP dst{8.8.8.8} src{192.168.2.51:43184} qtype{1} qname{431806-android-ds.metric.gstatic.com}: FAILED: 0/8 (3998ms)

NetworkDiagnostics:ifaces{} index{null} network{501} nethandle{2151795051230}
[dumpsys: 4.929s elapsed]

로그에서는 구글의 공개된 DNS 서버(8.8.8.8)를 찾는데 16번이나 시도했지만 실패했다. 그리고, 192.168.2.1에 연결하는데도 2번 시도 중 두번 째만에 성공했으며 내부 네트워크 IP 주소인데 515ms나 걸렸다.

깔끔하게 연결된다면 아래와 같은 로그가 남을 것이다.

------ NETWORK DIAGNOSTICS (dumpsys connectivity --diag) ------

NetworkDiagnostics:ifaces{wlan0} index{10} network{502} nethandle{2156090018526}
  ICMPv4 dst{192.168.42.1} src{192.168.42.140:1}: SUCCEEDED: 1/1 (8ms)
  ICMPv4 dst{8.8.8.8} src{192.168.42.140:2}: SUCCEEDED: 1/1 (73ms)
  DNS UDP dst{192.168.42.1} src{192.168.42.140:42325} qtype{1} qname{198703-android-ds.metric.gstatic.com}: SUCCEEDED: 1/1 NOERROR (215ms)
  DNS UDP dst{8.8.8.8}: FAILED: android.system.ErrnoException: connect failed: EAFNOSUPPORT (Address family not supported by protocol) (0ms)

모든 연결 시도가 1번 시도에 연결되었고, 걸린 시간도 각각 8ms와 73ms로 속도가 빠르다.

SYSTEM PROPERTIES

단말 내에서 전역(global)으로 접근이 가능한 속성값들을 보여준다.  상수 뿐 아니라, 메모리 크기나 ip 주소, usim 정보 등도 가지고 있다.

여기에 대해서는 이전에 작성한 글을 살펴보자.

FILESYSTEMS & FREE SPACE (df)

파일 시스템 정보와 공간을 보여준다. PackageManager를 통해 앱을 설치할 때, 용량이 부족하여 실패하는 경우가 있다. 이 때 PackageManager는  이 때 INSTALL_FAILED_INSUFFICIENT_STORAGE(-4)를 반환한다. 정말 단말에 여유 공간이 없는지 여기도 확인해보자.

------ FILESYSTEMS & FREE SPACE (df) ------
Filesystem                  Size     Used     Free   Blksize
/dev                      918.8M   120.0K   918.7M      4.0K
/sys/fs/cgroup            918.8M    12.0K   918.8M      4.0K
/mnt                      918.8M     0.0K   918.8M      4.0K
/mnt/secure               918.8M     0.0K   918.8M      4.0K
/system                     2.9G     2.8G    26.4M      4.0K
/efs                       15.7M     2.2M    13.4M      4.0K
/cache                    192.8M   684.0K   192.2M      4.0K
/data                      11.1G     1.7G     9.3G      4.0K
...
*** df: Exit code 1
[df: 0.027s elapsed]

“DUMPSYS : Android Framework Services”

dumpsys는 안드로이드 시스템 서비스들의 상태를 알 수 있는 명령어이다. dumpsys를 통해 CPU, RAM, 배터리, 저장공간 정보 등을 쉽게 확인할 수 있다.  adb 커맨드를 이용하는 경우 다음의 명령어로 실행할 수 있다.

>adb shell dumpsys

출력되는 dumpsys 상단에 시스템 서비스의 목록이 나오고, 그 다음에 목록 순서대로 서비스별 정보가 나온다.

Currently running services:
accessibility
account
activity
alarm
appwidget
audio
backup
battery
batteryinfo
clipboard
connectivity
content
cpuinfo
device_policy
devicestoragemonitor
diskstats
dropbox
entropy
hardware
input_method
iphonesubinfo
isms
location
media.audio_flinger
media.audio_policy
media.player
meminfo
mount
netstat
network_management
notification
package
permission
phone
power
reboot
screenshot
search
sensor
simphonebook
statusbar
telephony.registry
throttle
usagestats
vibrator
wallpaper
wifi
window

여기를 잘 확인하면 문제가 발생했을 때 당시의 상태를 알 수 있다. 로그가 26만줄인 로그에서 13만줄 정도가 dumpsys 정보일 정도로 엄청난 양을 자랑하며 그 내용도 많다. 서비스에 따라 최근 몇 건의 기록을 로그성으로 남기는 경우도 있고, dumpstate 로그가 저장될 당시의 정보만 저장하는 경우도 있다.

참고로, 안드로이드 시스템 뿐 아니라, (당연하지만) 제조사에서도 정보를 남길 수 있다.

DUMP OF SERVICE activity

자주보게 되는 부분 중 하나로, 컴포넌트 들의 등록 상태와 현재 화면에 표시되거나 표시되었던 히스토리 등을 확인할 수 있다.  아래와 같은 기준으로 나누어서 보이고 양이 상당히 많다.

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
...
ACTIVITY MANAGER SERVICES (dumpsys activity services)
...
ACTIVITY MANAGER CONTENT PROVIDERS (dumpsys activity providers)
...
ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)
...
ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)
...
ACTIVITY MANAGER RECENT TASKS (dumpsys activity recents)
...
ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)
...

예를 들어 브로드캐스트 리시버가 잘 등록되어 있는지, 최근 앱 목록에서 이동하다 이슈가 생겼다고 할 때 최근 테스크 목록의 어디에 우리가 있었는지 등 이슈가 발생했을 당시의 우리 앱의 상태를 확인하는데 유용하다.

다른이야기지만, 전체를 기리키는 이름도 액티비티고 컴포넌트에도 액티비티가 있어 이름이 처음에는 이름이 헷갈린다. 아마도 화면을 담당하는 액티비티의 처음에는 다른 무엇이지 않았을까..

DUMP OF SERVICE meminfo

단말에 설치된 앱들의 메모리 사용 정보를 총망라하여 보여준다. 아래는 안드로이드 시스템 프로세스의 메모리 사용량이다.

...
** MEMINFO in pid 10464 [com.android.system] **
                   Pss      Pss   Shared  Private   Shared  Private  Swapped     Heap     Heap     Heap
                 Total    Clean    Dirty    Dirty    Clean    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------   ------   ------
  Native Heap     6697        0      944     6676       68        0     3732    14848    13013     1834
  Dalvik Heap     2178        0      808     2168       68        0     1484     7240     3450     3790
 Dalvik Other      362        0      136      360        0        0        0                           
        Stack      412        0        4      412        0        0        4                           
       Ashmem        2        0        4        0        0        0        0                           
      Gfx dev     2264        0     3392      568        0        0        0                           
    Other dev        4        0      100        0        0        4        0                           
     .so mmap      933      136      968      124    27144      136     5440                           
    .apk mmap      157        0        0        0     3156        0        0                           
    .ttf mmap       29        0        0        0      292        0        0                           
    .dex mmap      584      316        0        8      544      316        0                           
    .oat mmap     1426        0        0        0    45992        0        0                           
    .art mmap     1055        0     2192      852    13240        0      248                           
   Other mmap       86        0       12        8     1500        0        0                           
   EGL mtrack    57972        0        0    57972        0        0        0                           
    GL mtrack     8664        0        0     8664        0        0        0                           
      Unknown     1024        0      184     1024        8        0      180                           
        TOTAL    83849      452     8744    78836    92012      456    11088    22088    16463     5624
 
 Dalvik Details
        .Heap     1452        0        0     1452        0        0        8                           
         .LOS      576        0       68      576        0        0     1468                           
 .LinearAlloc      146        0      132      144        0        0        0                           
          .GC      172        0        0      172        0        0        0                           
      .Zygote      138        0      740      128       68        0        8                           
   .NonMoving       12        0        0       12        0        0        0                           
 .IndirectRef       44        0        4       44        0        0        0                           
...

이런 목록이 단말 내에서 동작한 모든 프로세스 별로 정리되어 표시된다.

  • Private Clean : 앱의 전용 공간으로 영속적인 파일에 할당된다. 오랜시간 사용되지 않으면 정리될 수 있다.
  • Private Dirty : 변하는 데이터로 RAM 메모리 속에 공간을 차지한다. 프로세스가 종료되면 시스템에 반환된다.
  • Pss Total : Private Clean + Private Dirty + Shared pages 를 합친 공간이다.
  • Native Heap : libc를 이용한 네이티브(native) 할당에 사용되는 힙 메모리다.
  • Dalvik Heap : 자바 어플리케이션 할당에 사용된다. 큰 오브젝트, zygote 등이 차지한다. GC에 의해 자동으로 회수된다.
  • GL mtrack : 2D/3D 그래픽을 그리는데 사용되는 공간이다. 뷰가 포함된 액티비티가 없는 프로세스더라도, 토스트나 다이얼로그 등을 그릴 때 사용한다. 한 번 할당되면 프로세스가 죽을 때까지 회수되지 않는다.
  • EGL mtrack : 프레임버퍼가 할당되는 공간으로, openGL 라이브러리를 이용해 2D/3D 그래픽을 그릴때 사용될 수 있다. 그래픽이 포함된 액티비티가 background로 이동하면, 바로 회수한다.

DUMP OF SERVICE package

 

이 글을 참고하자.

DUMP OF SERVICE dbinfo

pid와 package 이름을 기준으로 connection 갯수와 상태, database 파일 위치와 가장 최근 수행된 query 정보 등을 볼 수 있다.

DUMP OF SERVICE dbinfo:
...
** Database info for pid 4841 [com.google.process.gapps] **

DUMP OF SERVICE connectivity

지원하는 네트워크 종류와 접속 상태를 알 수 있다.

DUMP OF SERVICE connectivity: 
NetworkFactories for: Telephony WIFI_P2P WIFI_UT WIFI WIFI
...
Current Networks:
 NetworkAgentInfo{ ni{[type: WIFI[] - WIFI, state: CONNECTED/CONNECTED, 
...

DUMP OF SERVICE jobscheduler

등록된 잡 서비스 정보와 상태, 실행 기록 등을 확인할 수 있다.

DUMP OF SERVICE jobscheduler:
  Settings:
  ...
  Started users: [0, 150]
  Registered 99 jobs:
  ...
  Job history at 2018-04-07 10:15:44.096:
  ...
  Active jobs:
  ...

“Registered 99 jobs:” 부분에 등록된 잡의 정보가 보인다.  예를 들면,

  JOB #1000/1145656139: 6d6fc51 android/com.android.server.storage.DiskStatsLoggingService
    1000 tag=*job*/android/com.android.server.storage.DiskStatsLoggingService
    Source: uid=1000 user=0 pkg=android
    JobInfo:
      Service: android/com.android.server.storage.DiskStatsLoggingService
      PERIODIC: interval=+1d0h0m0s0ms flex=+1d0h0m0s0ms
      Requires: charging=true batteryNotLow=false deviceIdle=true
      Backoff: policy=1 initial=+30s0ms
      Has early constraint
      Has late constraint
    Required constraints: CHARGING TIMING_DELAY DEADLINE IDLE
    Satisfied constraints: BATTERY_NOT_LOW APP_NOT_IDLE DEVICE_NOT_DOZING
    Unsatisfied constraints: CHARGING TIMING_DELAY DEADLINE IDLE
    Tracking: BATTERY IDLE TIME
    Enqueue time: -9h37m37s809ms
    Run time: earliest=+3h7m30s599ms, latest=+1d3h7m30s599ms
    Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

안드로이드 시스템이 등록한 잡을 볼 수 있다.  여기에는 실행할 예정이거나 현재 실행 중인 잡이 등록된다.

“Job history at …” 부분에서는 실행된 잡의 정보를 볼 수 있다. 잡이 실행/종료된 timestamp와 종료 시 사유를 간단히 볼 수 있다.

Job history at 2018-04-07 10:15:44.096:
...
-2m33s279ms START: u0a151 com.google.android.apps.photos/com.google.android.libraries.social.mediamonitor.MediaMonitorJobSchedulerService
-2m33s182ms  STOP: u0a151 com.google.android.apps.photos/com.google.android.libraries.social.mediamonitor.MediaMonitorJobSchedulerService : app called jobFinished

위의 로그를 보면, 구글 포토 앱의 잡 서비스가 작업을 완료 한 후 수행할 작업이 없다고 메시지(“app called jobFinished”)를 보냈다. 그 밖에,  앱이 강제종료되거나 초기화 된 경우 “unexpectedly disconnected”를, 수행할 작업 자체가 없는 경우 onStartJob()에서 false를 반환(“onStartJob returned false”)하여 바로 종료한 기록이 남기도 한다.

1회성 잡의 경우, 실행 후 “Registered Jobs” 목록에서는 제거되므로 “Job history” 부분을 통해서만 디버깅할 수 있다.  O OS 기준, 재부팅하면 히스토리가 모두 사라지니 참고하자.

마지막으로, “Active jobs:” 부분에서는 현재 실행 중인 잡을 확인할 수 있다.

CPU

일정 시간 동안의 각 프로세스 별 cpu 점유율을 알 수 있다. 간혹, 본인의 앱은 문제가 없는데 브로드캐스트가 올바르게 동작하지 않거나 ANR이 발생했다면 혹시 CPU 점유율을 과도하게 사용한 다른 앱이 있지는 않았는지 확인해볼 필요가 있다.

DUMP OF SERVICE cpuinfo:
Load: 6.33 / 5.37 / 3.46
CPU usage from 199030ms to 138956ms ago with 99% awake:
  59% 3589/system_server: 34% user + 24% kernel / faults: 189642 minor 210 major
  29% 3119/surfaceflinger: 17% user + 12% kernel / faults: 3208 minor 73 major
...
28% TOTAL: 16% user + 10% kernel + 1% iowait + 0.4% softirq
그 밖에

안드로이드 개발자 사이트에서 dumpsys에 대해 소개하고 있으니, 이 부분도 참조하자.

ANR이 Activity Manager나 Window Manager 같은 곳에서 발생한 경우는 “어플리케이션이 응답이 없습니다. 기다리시겠습니까?”와 같은 메시지가 표시되지 않을 수 있다.

최 하단에는 dumpstate가 만들어지기 까지 걸린 시간이 남아있다.

dump done: 29.0s elapsed

디버깅을 위한 로그 남기기에 대해서는 안드로이드 사이트에 정리가 잘 되어 있다.

참고

 

인텔리 제이에서 시스템 정보 확인하기(adb shell dumpsys)

안드로이드는 리눅스를 기반으로 한 운영체제 이기때문에 쉘(shell)을 사용할 수 있고 다른 글에서 쓴바 있다. 그리고 그 쉘에서 dumpsys라는 툴을 이용하면 안드로이드의 관심있는 서비스(?) 정보를 매우 자세하게 뽑아낼 수 있다. 이에 대한 자세한 설명은 안드로이드 개발자 사이트에 잘 정리되어 있기도 하다.

하지만, 번거롭다. 명령창을 통해  실행해야 하는데, 대부분의 개발자가 있는 줄 알면서도 안쓰게 만드는 가장 큰 이유다.

인텔리 제이 IDE에서 adb shell dumpsys 를 통해 확인하던 시스템 정보(System Information)을 추출할 수 있는 방법을 제공한다. Android DDMS 패널의 좌측 메뉴 중에 돋보기 모양의 “System Information” 버튼을 이용하면 된다.

android_ddms

제공하는 기능은 Community version 기준으로 다음과 같다.

  • Activity Manager State
  • Package Information
  • Memory Usage
  • Memory Use Over Time
  • Graphics State

단말이 연결된 상태에서 프로세스를 하나 선택해 메뉴가 활성화된다. 각 명령은

adb shell dumpsys [서비스 이름] [프로세스 번호 | 패키지 이름]

과 매치된다.  예를 들면, Memory Usage를 adb shell dumpsys를 통해 보려면

adb shell dumpsys meminfo android.my.app

라고 치는 식이다.

adb shell dumpsys를 이용하면 더많은 정보를 볼 수 있지만, adb 실행이나 매번 바뀌는 프로세스 번호 같은 것을 기억하지 않아도 된다는 점을 생각하면 역시 편리하다. dumpsys 툴 이이야기가 나온 김에 어떤 서비스 정보를 추출할 수 있는지 잘 정리된 링크도 걸어둔다.

그리고, 가장 많이 쓰는 기능은 모두 모여 있으니 애용해보자.