본문 바로가기

코틀린

Debug coroutines using IntelliJ IDEA – tutorial (IntlliJ IDEA를 활용해서 코루틴을 디버깅 하는 방법)

코루틴에서 디버깅 하는 방법에 관해서 알아 볼것이다. 공식문서를 참조했다.
import kotlinx.coroutines.*
// 코루틴을 감싸기 위해서 runBlocking() 을 사용.
fun main() = runBlocking<Unit> {
    // 지연된 코루틴 값을 설정하기 위해서 async 예약어를 사용해서 변수 a와 b를 설정.
    val a = async{
        println("I'm computing part of the answer")
        6
    }
    val b = async{
        println("I'm computing another part of the answer")
        7
    }
    // 결과값이 산출될때까지 기다리기 위해서 await() 함수를 사용한다. 그리고 println은 계산되고 있는 상태와 결과값을 확인하기 위해서 사용.
    println("The answer is ${a.await()} * ${b.await()}")
}

runBlocking

expect fun <T> runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T

 

Runs a new coroutine and blocks the current thread until its completion. This function should not be used from a coroutine. It is designed to bridge regular blocking code to libraries that are written in suspending style, to be used in main functions and in tests.
도저히 의역이 안되네.. 조금 다른 블로그의 내용을 인용하겠다. 위의 내용이 의미하는 것은 아래 문장과 같다.
runBlocking은 이름이 내포하듯이 현재 쓰레드(여기선 main 쓰레드)를 블록킹 시키고 새로운 코루틴을 실행시킨다.
위와 같이 코드를 설정하고 중단점을 아래와 같이 설정한뒤 코드를 실행해본다.
코루틴 탭에서 현재 실행중인 코루틴이나 suspend(일시중지)된 코루틴을 확인할 수 있다.
첫번째는 실행중이고 나머지 두개는 생성된 상태다.
 
그리고 resume 을 눌러봅시다.
Running 상태였던  1번째 코루틴(메인함수)이 suspend되버렸다.
첫 번째 코루틴은 값을 곱할 수 있도록 값을 기다리는 중이므로 SUSPENDED 상태다.
 
그리고 2번째 코루틴은 Running 상태가 되서 a 값을 계산중이다.
 
3번째 코루틴은 Created 상태에서 b 값을 계산중이지 않다.
 
한번더 resume 버튼을 눌러보자.
첫번째 코루틴은 곱셈 결과를 기다리려고 suspned 상태이다.
 
두번째 코루틴은 계산이 끝나고 사라져버렸다.
 
세번째 코루틴은 b 값을 계산하기 위해서 Running 상태가 됐다.
 
인텔리제이 IDE를 사용해서 각 코루틴의 상태값을 깊게 파서 확인하는게 가능하다.
 

Optimized-out variables

디버거에서 suspend 함수를 사용한다면, "was optimized out" 라는 값을 변수명 옆에서 확인 가능하다.
optimize ( optimise ) ( 과거형: optimized ) ( 과거 분사: optimized )
  • 동사 …을 최대한 좋게[적합하게] 만들다[활용하다]
 
이 문장이 의미하는 바는 변수의 생명주기가 줄어들었다는 것을 의미하고,  더 이상 변수가 존재하지 않는 다는 것을 말한다. optimized 된 변수의 값을 디버깅해서 찾는것은 힘든데, 이는 변수를 볼 수 없어서다.
-Xdebug 디버그 옵션을 사용해서 이 기능을 비활성화 할 수 있다.
 
Never use this flag in production: -Xdebug can cause memory leaks.

 

 

 

 
 

'코틀린' 카테고리의 다른 글

Null safety  (0) 2023.11.11
Coroutine2  (2) 2023.10.27
Coroutine  (0) 2023.10.24
inline 함수와 reified type  (0) 2023.10.20
lamda 람다란?  (2) 2023.10.19