레이블이 debugging인 게시물을 표시합니다. 모든 게시물 표시
레이블이 debugging인 게시물을 표시합니다. 모든 게시물 표시

2024년 2월 11일 일요일

addr2line 구하는 곳 window용

addr2line 이란

addr2line은 디버깅 목적으로 사용되는 편리한 명령 줄 도구입니다. 메모리 주소를 파일 이름과 라인 번호로 변환합니다. 

일반적으로 kernel의 오류를 디버깅 할때가 아니라 so 파일들을 디버깅 할때 사용합니다. 


주의할 점

디버깅 대상이 되는 파일은 디버깅 정보가 포함되도록 컴파일이 되어야 합니다.


실행 예제

-e 옵션을 파일을 지정합니다.

addr2line -e a.out 0x800001(주소)


구하는 방법

android sudio를 설치하면 Android SDK 를 다운로드 가능합니다.

https://developer.android.com/studio

SDK Manager에서 NDK를 선택해서 설치합니다.



경로는 버전에 따라 조금씩 다를 수 있지만 아래 폴더에 존재하게 됩니다.

ndk\26.1.10909125\toolchains\llvm\prebuilt\windows-x86_64\bin


















2022년 11월 13일 일요일

누가 나의 알람을 껐을까? (안드로이드 실전 디버깅) 삼성 휴대폰, android debugging

당신은 가끔 당신 휴대폰의 알람 소리를 못들을 때가 있지 않은가?

내가 잠결에 껐겠지 생각하거나 귀신이 끈건 아닐까라고 생각했던건 아닌지? 

실제로 그런 일이 나에게 일어났습니다.

여기에서는 휴대폰 오류로 알람이 안울린 것인지 누군가에 의해서 꺼진것인지 로그를 바탕으로 분석하는 방법을 다룰 것입니다. (삼성 휴대폰 기준, 가지고 있는 단말이 삼성 휴대폰 밖에 없어서...)


1. 안드로이드 단말 로그 획득 방법

일반적인 안드로이드 단말은 adb 연결된 상태에서 dumpstate 로 로그를 생성 시킵니다. 

하지만 이것은 PC를 연결해야지만 로그 생성이 가능하기 때문에 굉장히 불편합니다.

삼성 단말에서는 다이얼에서 *#9900# 을 누르면 이러한 dumpstate를 파일을 단말에 저장하는 기능을 제공합니다.

sysdump라는 위 메뉴에 진입 하게 되는데 Run dumpstate/logcat 메뉴를 이용하면 됩니다.
그리고 Copy to sdcard 라는 메뉴는 생성된 로그를 log 폴더로 복사하는 역할을 합니다. (로그 생성시 수분 정도 대기해야 합니다.)

해야 할 일은 이 부분을 숙지하고 있다가 문제가 발생하면 해당 메뉴를 실행시켜 주면 됩니다.


2. 디버깅의 기본

안드로이드 뿐만 아니라 모든 SW의 디버깅을 할때 해당 Domain의 지식이 없는 경우 맨땅에 헤딩(?) 하게 됩니다.

이 글을 읽는 분도 입력 또는 알람이나 소리 관련해서는 전혀 아는게 없다고 판단하고 정상적인 상황에서 로그가 어떻게 나오는지 미리 확인해야 합니다.

이때 단말을 PC에 연결해서 정상적인 상황에서 로그가 어떤 Text로 나오는지 익혀 둡니다.

기본적으로 실시간 디버깅을 위해서는 adb tool을 단말에 설치해야 하는데 이것은 android sdk(Android Studio)를 설치하거나 adb 실행 파일만 따로 구해야 합니다.

Android Studio > Tools > SDK Manager 에서 platform-tools 다운로드 가능합니다.

Sdk 경로는 기본 경로가 아래 경로입니다.

C:\Users\사용자 이름\AppData\Local\Android\Sdk\platform-tools


SDK를 설치하지 않고 사용할 수 있는 adb link를 공유합니다. 

Android Debug Bridge version 1.0.41

Version 33.0.3-8952118

https://drive.google.com/file/d/1ezVHiS0Cd-c2y8bPgxRobhk7T-FmXGmr/view?usp=sharing


2.1 로그 파일 쉽게 보기

adb logcat으로 실시간 로그를 볼 수 있긴 하지만 많은 로그들이 한꺼번에 지나가므로 좀 더 편한 툴이 필요합니다.

가장 많이 사용하는 툴이 logfilter라는 어플이 있는데 LogFilter_1.8.jar / LogFilterCmd.ini 파일을 구했습니다.

cmd line에서 java -jar LogFilter_1.8.jar 와 같이 실행 시킵니다.

Java가 설치 안되어 있다면 java 설치해야 합니다.

저의 경우 Android Studio 설치시 jre 가 같이 설치되어 C:\Program Files\Android\Android Studio\jre 여기 경로에서 java를 이용 가능합니다. (java 또는 jre를 직접 설치하면 됩니다.)

아래와 같이 실행 하였습니다.

C:\Users\계정이름\AppData\Local\Android\Sdk\platform-tools>"C:\Program Files\Android\Android Studio\jre\bin\java" -jar LogFilter_1.8.jar

단말은 개발자 모드에서 USB디버깅을 활성화 해줍니다.


2.1 일반 상태에서 키를 누를때 발생하는 로그

Tag에 Input 을 넣어서 필터를 해주면 터치 할때 마다 아래와 같은 형태의 로그가 발생됩니다.

2.1.1 Volume Up 키

input event(3value=1) 버튼 누를때
input event(3value=0) 버튼 해제 될때
Delivering key to (숫자VU action: 0x0)
Delivering key to (숫자VU action: 0x1)

2.1.2 Volume Down 키

input event(9value=1) 버튼 누를때
input event(9value=0) 버튼 해제 될때
Delivering key to (숫자VD action: 0x0)
Delivering key to (숫자VD action: 0x1)

2.1.3 Power 키


input event(9value=1) 버튼 누를때

input event(9value=0) 버튼 해제 될때

!@notifyKey(116), action=0

!@notifyKey(116), action=1


2.2 일반 상태에서 터치를 할때 발생하는 로그

터치 누를때 Touch events action is 0x0 

터치에서 손을 뗄때 Touch events action is 0x1 


3. 문제 발생한 상황에서의 로그

1번에서 파일을 생성했으면 단말을 PC와 연결 후 log 폴더에서 dumpstate로 시작하는 파일을 검색합니다. 해당 파일에서 앞서 설명한 버튼과 터치에 관한 로그를 검색하도록 합니다.

실제 로그를 찾아보니 "'" 문자를 표시 안하는 경우가 있어서 logfilter의 로그와 조금 다릅니다. (분석시 참고)

5:59분 알림인데 실제 아래와 같은 로그가 발견 되었습니다.

줄   267138: 11-08 21:26:50.175  1000  1244  2072 I InputReader: Touch event's action is 0x1 (id=2, t=0) [pCnt=1, s=] when=418904.535647

줄   316374: 11-09 05:59:15.281  1000  1244  2072 I InputReader: Touch event's action is 0x0 (id=2, t=0) [pCnt=1, s=0.16732 ] when=419384.247445

줄   317546: 11-09 05:59:15.948  1000  1244  2072 I InputReader: Touch event's action is 0x1 (id=2, t=0) [pCnt=1, s=] when=419384.915882

줄   340006: 11-09 06:58:29.906  1000  1244  2072 I InputReader: Touch event's action is 0x0 (id=2, t=0) [pCnt=1, s=0.16733 ] when=419443.865649


5:59분 15초에 0.6초 가량 터치했다가 손을 뗀 기록이 남아 있습니다.


4. 결론

알림이 어떤 휴대폰 오류로 안울린 것이 아니라 무의식 중에 터치하여 알람을 끈것으로 확인되었습니다.


5. 주의점

로그는 내부적으로 크기가 정해져 있기 때문에 가능하면 문제 발생 즉시 로그 확보가 되어야 분석이 가능합니다.


2018년 9월 30일 일요일

유튜브 재생중 멈춤(간헐적) 로그 분석


휴일 아침 유튜브를 보고 있는데 갑자기 화면이 멈추는 증상이 발생하였습니다. 엥 무슨일이지... 일어나서 로그를 남겨서 분석해 보았습니다.
로그를 남기는 방법은 단말 제조사 마다 다르기 때문에 여기에서는 언급 하지 않겠습니다. 일반적으로 adb가 연결가능한 상황이면 adb bugreport > 파일명 형태를 사용하면 됩니다.

단말기 : 삼성 SM-G930 (갤럭시 S7)
운영체제 : android 8.0 O OS

1. 문제의 시점을 알아야 하기때문에 event log를 확인합니다.

아래와 같이 표기되는 부분입니다.
------ EVENT LOG (logcat -b events -v threadtime -v printable -v uid -d *:v) ------
그중 on_resume으로 검색해서 android activity의 실행 과정을 보고 언제쯤 문제가 발생한것인지 시각대를 확인합니다.

 Line 137043: 09-26 07:27:39.634 10066  5121  5121 I am_on_resume_called: [0,com.sec.android.app.launcher.activities.LauncherActivity,RESUME_ACTIVITY]
 Line 137144: 09-26 07:27:58.968 10160  5194  5194 I am_on_resume_called: [0,com.google.android.apps.youtube.app.WatchWhileActivity,RESUME_ACTIVITY]
 Line 138868: 09-26 07:59:09.868 10160  5194  5194 I am_on_resume_called: [0,com.google.android.apps.youtube.app.WatchWhileActivity,RESUME_ACTIVITY]
 Line 139427: 09-26 08:05:44.199 10066  5121  5121 I am_on_resume_called: [0,com.sec.android.app.launcher.activities.LauncherActivity,RESUME_ACTIVITY]
홈키를 눌러 런처로 돌아갔기 때문에 08:05:44 시각 근처인것 같습니다.
해당 시각 근처 로그를 확인 해 봤습니다.
09-26 08:05:39.041  1000  3646  3665 I am_proc_start: [0,13615,10415,com.roidus.iblugpartial,service,com.roidus.iblugpartial/.service.MediaService]
09-26 08:05:39.131  1000  3646 18226 I am_proc_bound: [0,13615,com.roidus.iblugpartial]
09-26 08:05:39.326  1000  3646  3646 I power_partial_wake_state: [1,*alarm*:android]
09-26 08:05:39.393  1000  3646  3664 I am_pss  : [13186,10015,com.google.android.gms.unstable,36718592,24051712,187392]
09-26 08:05:39.956  1000  3646  4342 I am_uid_running: 99310
09-26 08:05:39.988  1000  3646  4342 I am_proc_start: [0,13667,99310,com.android.chrome:sandboxed_process0,webview_service,com.roidus.iblugpartial/org.chromium.content.app.SandboxedProcessService0]
09-26 08:05:40.125  1000  3646  4342 I am_proc_bound: [0,13667,com.android.chrome:sandboxed_process0]
09-26 08:05:40.751  1000  3646  3646 I notification_cancel: [10415,13615,com.roidus.iblugpartial,10436,NULL,0,0,1088,8,NULL]
09-26 08:05:43.558  1000  3646  4342 I power_partial_wake_state: [3010,AudioMix:audioserver]
09-26 08:05:43.645  1000  3646  4342 I power_partial_wake_state: [2878,AudioMix:audioserver]
09-26 08:05:43.984  1000  3646  3788 I am_new_intent: [0,45004642,23983,com.sec.android.app.launcher/.activities.LauncherActivity,android.intent.action.MAIN,NULL,NULL,276824320,NULL]
09-26 08:05:43.986  1000  3646  3788 I wm_task_moved: [23983,1,0]
09-26 08:05:43.987  1000  3646  3788 I am_focused_stack: [0,0,1,bringingFoundTaskToFront]
09-26 08:05:43.988  1000  3646  3788 I wm_task_moved: [23983,1,0]
09-26 08:05:43.989  1000  3646  3788 I am_pause_activity: [0,34765044,com.google.android.youtube/com.google.android.apps.youtube.app.WatchWhileActivity]
09-26 08:05:43.990  1000  3646  3788 I am_task_to_front: [0,23983]
09-26 08:05:43.993 10160  5194  5194 I am_on_paused_called: [0,com.google.android.apps.youtube.app.WatchWhileActivity,handlePauseActivity]
09-26 08:05:44.007  1000  3646  4342 I am_set_resumed_activity: [0,com.sec.android.app.launcher/.activities.LauncherActivity,resumeTopActivityInnerLocked]
09-26 08:05:44.088  1000  3646  4342 I am_resume_activity: [0,45004642,23983,com.sec.android.app.launcher/.activities.LauncherActivity]
09-26 08:05:44.108  1000  3646  3665 I sysui_count: [window_time_0,394]
09-26 08:05:44.109  1000  3646  3665 I sysui_multi_action: [757,803,799,window_time_0,802,394]
09-26 08:05:44.109  1000  3646  3665 I am_uid_running: 10157
09-26 08:05:44.140  1000  3646  3665 I am_proc_start: [0,13742,10157,com.sec.android.daemonapp,broadcast,com.sec.android.daemonapp/.appwidget.WeatherAppWidget2x1]
09-26 08:05:44.185  1000  3646  3664 I am_pss  : [13594,10010378,com.sds.BizAppLauncher,6145024,4603904,205824]
am_new_intent android.intent.action.MAIN 부분은 홈키를 누른 부분입니다. 해당 인텐트가 발생하면 홈으로 가게됩니다. 결국 43초 전이므로 39~43초 사이에 일이 벌어진것으로 보면 됩니다.
해당 시간에 생성된 process 정보들은 am_proc_start 로그를 보면 됩니다. intent나 service를 받아서 실행됩니다.

2. 이제 main log를 확인 합니다.


09-26 08:05:40.436 10415 13615 13686 W cr_media: Requires BLUETOOTH permission
09-26 08:05:40.544 10415 13615 13615 I MediaPlayer: Need to enable context aware info
09-26 08:05:40.544 10415 13615 13615 V MediaPlayer-JNI: native_setup
09-26 08:05:40.545 10415 13615 13615 V MediaPlayerNative: constructor
09-26 08:05:40.547 10415 13615 13615 V MediaPlayerNative: setListener
09-26 08:05:40.554  root  3322  3631 D DnsProxyListener: DNSDBG::dns addrinfo af 2
09-26 08:05:40.562 10415 13615 13615 W AudioManager: Use of stream types is deprecated for operations other than volume control
09-26 08:05:40.562 10415 13615 13615 W AudioManager: See the documentation of requestAudioFocus() for what to use instead with android.media.AudioAttributes to qualify your playback use case
09-26 08:05:40.565  1000  3646  4342 I MediaFocusControl:  AudioFocus  requestAudioFocus() from uid/pid 10415/13615 clientId=android.media.AudioManager$f9594c3com.roidus.iblugpartial.service.MediaService$7$7d5f140 req=1 flags=0x0

AudioFocus  requestAudioFocus() 로그가 보입니다.
om.roidus.iblugpartial 앱에서 audio를 요청하고 있습니다.

3. 범인은 하나야


DUMP OF SERVICE audio:

MediaFocusControl dump time: 오전 8:07:15

Audio Focus stack entries (last is top of stack):

MultiFocusStack:
size:3
device:2
------------------------------
device = 0
  source:android.os.BinderProxy@7c0403 -- pack: com.google.android.youtube -- client: android.media.AudioManager$8076d7aacpa$4e0f92b -- gain: GAIN -- flags:  -- loss: LOSS -- notified: true -- uid: 10160 -- device: 0 -- attr: AudioAttributes: usage=1 content=2 flags=0x0 tags= bundle=null -- sdk:26
  source:android.os.BinderProxy@b58cf80 -- pack: com.roidus.iblugpartial -- client: android.media.AudioManager$f9594c3com.roidus.iblugpartial.service.MediaService$7$7d5f140 -- gain: GAIN -- flags:  -- loss: none -- notified: true -- uid: 10415 -- device: 0 -- attr: AudioAttributes: usage=1 content=2 flags=0x0 tags= bundle=null -- sdk:23
------------------------------
device = 2
------------------------------
device = 80
------------------------------

DUMP OF SERVICE audio 로그를 확인하면 audio focus가 요청되어진것을 알 수 있습니다.
사건의 중심에 있는 앱은 com.roidus.iblugpartial 앱입니다. 영어 공부하는 앱인데....
로그 확인한봐로는 해당 앱이 kill 되었다가 (안드로이드에서는 background에 있는 앱들이 죽는 경우가 많이 있습니다.) 살아나면서 문제가 발생하고 있습니다. 추가 분석을 하려면 해당 앱에서 깨어난 사유 와 그리고 audio사용을 요청하는데 정상적인 상황인것인지 확인이 필요합니다.
주로 사용하는 앱이라 삭제 하지 말고 현상태로 사용 해야 할 것 같습니다.