Study Record

[안드로이드] 디버깅 살펴보기 본문

안드로이드

[안드로이드] 디버깅 살펴보기

초코초코초코 2023. 7. 3. 21:28
728x90

 

😶 개요

앱 비정상 종료, 기능 동작 안함 등과 같이 개발자가 의도하지 않은 동작을 발생시키는 소프트웨어 오류를 버그라고 한다. 개발자가 코드를 작성하는 과정에서 버그가 있기 마련이다. 따라서, 이 버그를 식별하고 수정하는 것이 Android 개발자에게 중요한 기술 중 하나이다. 

 

버그를 수정하는 프로세스를 디버깅이라고 하며 Android 스튜디오에는 여러가지 디버깅 도구가 있다.

 

 

😶 Log Class

Android 앱에서 출력 로깅 권장사항은 Log 클래스를 사용하는 것이다. Log.v(), Log.d(), Log.i(), Log.w(), Log.e() 등 여러가지 출력 로깅 함수를 사용할 수 있고 이 함수들은 태그와 로그 메시지, 이렇게 2가지 매재변수가 필요하다.

val TAG = "DEBUG_ERROR"
Log.d(TAG, "The Debug Error")

 

 

출력 로깅 함수들은 서로 다른 로그 수준을 사용한다.

 

로그 수준 사용 사례
ERROR 심각한 오류 발생 보고 (ex. 비정상 종료) Log.e()
WARN 오류보단 덜 심각하지만 심각한 오류를 방지하기 위해 수정해야 하는 사항 보고 (ex. 지원 중단된 함수) Log.w()
INFO 성공적으로 완료되는 작업과 같은 유용한 정보 제공 Log.i()
DEBUG 문제를 조사할 때 도움이 될만한 정보가 포함되며 출시 빌드에는 포함되지 않음 Log.d()
VERBOSE 가장 포괄적인 로그 수준으로 출시 빌드에 초함되지 않음  Log.v()

 

 

 

😶 스택 트레이스

비정상 종료(예외)를 설명하는 오류 로그를 스택 트레이스라고 부른다. 가장 최근부터 예외에 이르기까지 호출된 모든 함수를 표시해준다. 

 

한 함수가 다른 함수를 호출하면 두번째 함수가 완료될 때까지 첫번째 함수의 코드를 실행하지 않는다. 두번째 함수가 완료되면 첫번째 함수가 중단된 부분부터 재개된다. 두번째 함수에서 세번째 함수를 호출한다면 마찬가지로 세번째 함수가 호출될 때까지 두번째 함수도 중단된다. 이렇게 계속 카드를 쌓는 것과 비슷하게 코드(함수)들이 스택처럼 쌓인다.

 

따라서, 스택 트레이스처럼 가장 최근부터 예외에 이르기까지 호출된 모든 함수를 표시해주는 기법이 복잡한 문제를 디버그할 수 있도록 한다.

Process: com.example.debugging, PID: 14581
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.debugging/com.example.debugging.MainActivity}: java.lang.ArithmeticException: divide by zero
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.ArithmeticException: divide by zero
        at com.example.debugging.MainActivity.division(MainActivity.kt:21)
        at com.example.debugging.MainActivity.onCreate(MainActivity.kt:14)
        at android.app.Activity.performCreate(Activity.java:8000)
        at android.app.Activity.performCreate(Activity.java:7984)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

 

 

 

728x90