Android/Application

Android - Logcat과 디버깅 도구 활용하기

임베디드 친구 2024. 12. 5. 09:04
728x90
반응형

Android - Logcat과 디버깅 도구 활용하기

안드로이드 애플리케이션을 개발하다 보면 버그가 발생하는 것은 피할 수 없는 일입니다. 하지만 다행히도 Android Studio에는 강력한 도구들이 내장되어 있어, 효율적으로 버그를 추적하고 문제를 해결할 수 있습니다. 오늘 포스팅에서는 Android 디버깅에 필수적인 Logcat과 디버깅 도구들을 활용하여 버그를 추적하고 해결하는 방법에 대해 설명하겠습니다. 예제 코드와 함께 실전에서 어떻게 사용하는지 알아보겠습니다.

Logcat이란?

Logcat은 Android에서 로그 메시지를 출력하고 볼 수 있는 콘솔 도구입니다. 앱이 동작하는 동안 발생하는 로그를 볼 수 있어, 버그가 발생했을 때 문제의 원인을 찾는 데 큰 도움이 됩니다. Logcat은 Android Studio 내에 내장되어 있어 쉽게 사용할 수 있습니다.

Logcat 설정 및 사용 방법

  1. Logcat 열기: Android Studio에서 View > Tool Windows > Logcat을 선택하거나, 우측 하단에 있는 Logcat 아이콘을 클릭하여 열 수 있습니다.
  2. 필터 설정: Logcat은 매우 많은 로그를 출력하기 때문에, 특정 태그나 수준에 따라 필터링하여 볼 수 있습니다.
    • 로그 수준: 로그 수준은 Verbose, Debug, Info, Warn, Error 등이 있으며, 각기 다른 심각도를 의미합니다.
    • 태그 필터링: TAG를 사용하여 원하는 로그만 선택적으로 볼 수 있습니다.

Logcat을 사용한 로그 출력 방법

앱 내에서 로그를 출력하는 방법은 매우 간단합니다. Android의 Log 클래스를 사용하여 로그를 출력할 수 있습니다. Log 클래스는 다양한 메서드를 제공하며, 각 메서드는 로그의 심각도에 따라 구분됩니다.

  • Log.v(String tag, String msg) - Verbose 로그
  • Log.d(String tag, String msg) - Debug 로그
  • Log.i(String tag, String msg) - Info 로그
  • Log.w(String tag, String msg) - Warn 로그
  • Log.e(String tag, String msg) - Error 로그

다음은 간단한 예제입니다:

import android.util.Log

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tag = "MainActivity"
        Log.d(tag, "앱이 시작되었습니다.")

        val result = divide(4, 0)
        if (result == null) {
            Log.e(tag, "0으로 나눌 수 없습니다.")
        }
    }

    private fun divide(a: Int, b: Int): Int? {
        return if (b != 0) {
            a / b
        } else {
            null
        }
    }
}

위 예제에서는 Log.d()를 사용하여 앱이 시작되었음을 출력하고, Log.e()를 사용하여 예외 상황(0으로 나누기)을 출력합니다. 로그를 통해 코드가 어떤 경로를 거쳐 실행되는지 알 수 있습니다.

Logcat 필터링 예제

위 코드에서 로그 태그로 MainActivity를 사용했습니다. Logcat에서 로그를 필터링할 때 TAGMainActivity를 입력하면 해당 태그로 출력된 로그만 볼 수 있습니다.

  • 로그 수준 필터링: 특정 심각도의 로그만 보고 싶을 때 사용합니다. 예를 들어, Error 수준의 로그만 보고 싶다면, Logcat 상단의 드롭다운 메뉴에서 Error를 선택합니다.

디버깅 도구 활용하기

버그를 찾고 해결하는 데는 로그만으로는 한계가 있습니다. 이럴 때 Android Studio의 디버깅 기능을 활용하면 더 쉽게 문제를 파악할 수 있습니다.

Breakpoint 설정하기

브레이크포인트(Breakpoint)는 코드의 특정 지점에서 실행을 멈추게 하여 변수의 값을 확인하거나 코드의 흐름을 이해할 수 있게 해줍니다. 브레이크포인트를 설정하려면 다음과 같이 하면 됩니다:

  1. 코드 줄번호 클릭: 디버깅하고자 하는 코드의 줄 번호 옆을 클릭하면 빨간색 점이 생기면서 브레이크포인트가 설정됩니다.
  2. 디버깅 시작: 상단의 Run > Debug '앱 이름'을 선택하면 브레이크포인트에서 코드 실행이 멈추고, 변수의 값을 확인할 수 있습니다.

디버깅을 통해 변수 값 확인하기

다음은 변수 값을 확인하기 위한 예제입니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val numbers = listOf(1, 2, 3, 4, 5)
        val sum = calculateSum(numbers)
        Log.d("MainActivity", "합계: $sum")
    }

    private fun calculateSum(numbers: List<Int>): Int {
        var sum = 0
        for (number in numbers) {
            sum += number // 여기에서 브레이크포인트 설정
        }
        return sum
    }
}

위 코드에서 calculateSum() 함수의 sum += number 부분에 브레이크포인트를 설정하면, 반복문이 실행될 때마다 sum 변수의 값을 확인할 수 있습니다. 이를 통해 원하는 값이 제대로 더해지고 있는지 확인할 수 있습니다.

Watch와 Evaluate를 사용한 값 평가

WatchEvaluate 도구는 디버깅 시 유용하게 사용할 수 있는 기능입니다.

  • Watch: 변수나 표현식을 Watch 창에 추가하면 해당 값이 어떻게 변하는지 실시간으로 확인할 수 있습니다.
  • Evaluate: 코드가 멈췄을 때 특정 표현식이나 메서드를 Evaluate 창에서 실행해 볼 수 있습니다. 이를 통해 런타임 상황에서 특정 변수의 값을 손쉽게 확인하거나 로직을 검증할 수 있습니다.

디버깅 예제 - NullPointerException 해결하기

다음은 NullPointerException 발생을 추적하고 해결하는 예제입니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val person: Person? = null
        try {
            val name = person!!.name
            Log.d("MainActivity", "이름: $name")
        } catch (e: NullPointerException) {
            Log.e("MainActivity", "NullPointerException 발생: ${e.message}")
        }
    }
}

data class Person(val name: String)

위 코드에서 person 객체는 null로 설정되어 있어 person!!.name에서 NullPointerException이 발생합니다. 이를 방지하기 위해 예외 처리를 추가했습니다. 디버깅을 통해 프로그램이 예외를 처리하는 부분에서 코드의 흐름을 파악할 수 있습니다.

디버깅 팁

  1. 작은 단위로 나누어 디버깅하기: 문제가 발생한 부분을 작은 단위로 나누어 디버깅하면 더 쉽게 문제를 파악할 수 있습니다.
  2. 변수의 상태를 항상 확인하기: 예상치 못한 값이 들어가는 경우 버그가 발생하기 쉽습니다. 변수의 상태를 확인하는 습관을 들이는 것이 중요합니다.
  3. 반복적인 로그 사용 피하기: 너무 많은 로그를 남기면 오히려 디버깅이 더 어려워질 수 있습니다. 중요한 부분에만 로그를 사용하세요.

마무리

Logcat과 디버깅 도구는 Android 개발에서 매우 중요한 역할을 합니다. 특히 로그를 통해 앱의 실행 흐름을 파악하고, 브레이크포인트를 활용하여 문제의 원인을 정확히 찾아내는 것은 필수적인 스킬입니다. 이번 포스팅에서 다룬 내용을 잘 활용하여 여러분의 안드로이드 개발 여정을 조금 더 수월하게 만드셨으면 좋겠습니다.

반응형