#optimised_out

무린무린· 3개월

코틀린 코루틴 디버깅 시 'was Optimised Out(최적화로 제거됨)' 메시지 해결하기

코틀린으로 비동기 프로그래밍을 하다 보면, 코루틴의 일시 중단 지점에서 변수 값을 확인하려 할 때 디버거에서 '최적화로 제거됨(was optimised out)'이라는 메시지를 접하게 되는 경우가 있습니다. 이는 코루틴이 상태 기계(state machine)로 컴파일되면서, 일시 중단 지점 이후에 필요하지 않은 변수들은 성능 최적화를 위해 제거되기 때문입니다. 이러한 상황은 디버깅을 어렵게 만들 수 있어서 당혹스러울 수 있는데요, 빌드 설정을 조정하여 디버깅 시에만 이러한 변수를 유지하도록 설정하는 방법을 알아보겠습니다. 이를 통해 IntelliJ IDEA나 Android Studio에서 코루틴을 디버깅할 때 변수 값을 확인할 수 있으며, 프로덕션 성능에는 영향을 주지 않습니다. 왜 변수들이 '최적화로 제거됨' 상태가 되는가? 코틀린 코루틴은 컴파일 시 상태 기계로 변환됩니다. 이 과정에서 일시 중단(suspend) 지점 이후에 사용되지 않는 변수들은 메모리 사용을 줄이기 위해 제거됩니다. 또한, inline 함수로 표시된 코루틴 함수는 컴파일러가 코드 최적화를 위해 불필요한 변수를 제거할 수 있습니다. 이러한 최적화는 성능 향상에는 도움이 되지만, 디버깅 시에는 변수 값을 확인하지 못하게 만드는 원인이 됩니다. '최적화로 제거됨' 변수를 다시 보이게 만드는 방법 디버깅 시에만 코루틴의 변수를 유지하도록 빌드 설정을 동적으로 변경할 수 있습니다. 이를 위해 idea.active 속성을 활용하여, IntelliJ IDEA나 Android Studio에서 작업할 때만 디버그 친화적인 설정을 적용할 수 있습니다. 1. 코루틴 디버깅 동적 활성화 build.gradle.kts 파일에서 다음과 같이 설정합니다. // Kotlin Multiplatform kotlin { compilerOptions { if (System.getProperty("idea.active") == "true") { println("Enable coroutine debugging") freeCompilerArgs = listOf("-Xdebug") } } } // Kotlin JVM kotlin { compilerOptions { if (System.getProperty("idea.active") == "true") { println("Enable coroutine debugging") freeCompilerArgs.add("-Xdebug") } } } 2. 설정의 작동 원리 System.getProperty("idea.active"): 이 시스템 속성은 프로젝트가 IntelliJ IDEA나 Android Studio에서 열릴 때 자동으로 true로 설정됩니다. 이를 통해 IDE에서 작업할 때만 디버그 관련 설정을 적용할 수 있습니다. -Xdebug: 이 컴파일러 인자는 디버그 친화적인 바이트코드를 생성하여, 디버깅 시 코루틴 변수에 대한 정보를 더 많이 유지합니다. 3. idea.active 사용의 장점 성능 저하 방지: -Xdebug와 같은 디버그 옵션은 애플리케이션의 성능을 저하시킬 수 있습니다. 이를 IDE에서 작업할 때만 활성화하여 프로덕션 빌드에는 영향을 주지 않도록 합니다. 작업 흐름 간소화: IntelliJ IDEA나 Android Studio에서 디버그 설정을 자동으로 활성화하여, 개발 중에 설정을 수동으로 변경하는 번거로움을 줄입니다. 안전한 설정 관리: 이 방법을 통해 빌드 스크립트를 깔끔하게 유지하면서, 필요한 경우에만 디버그 플래그를 적용할 수 있습니다. 마치며 코틀린 코루틴을 디버깅할 때 '최적화로 제거됨' 메시지로 인해 변수 값을 확인하지 못하는 문제는 위와 같은 빌드 설정 조정을 통해 해결할 수 있습니다. 이를 통해 디버깅 효율성을 높이고, 프로덕션 성능에는 영향을 주지 않도록 설정할 수 있습니다. 출처: Debugging Kotlin Coroutines: Making “Optimised Out” Variables Visible
206
0