코루틴 및 스레드 디버그
코루틴은 한 스레드에서 일시 중지한 다음 다른 스레드에서 재개할 수 있습니다. 단일 스레드 디스패처에서도 전용 도구가 없으면 코루틴이 언제, 어디서, 무엇을 하는지 알기 어렵습니다.*1
IDEA로 디버그
Kotlin 플러그인인 코루틴 디버거는 Intellij IDEA에서 코루틴 디버깅을 간소화합니다.
디버깅 kotlinx-코루틴-코어 버전 1.3.8 이상에서만 작동합니다.
디버그 도구 창에는 코루틴 탭이 포함되어 있습니다. 이 탭에서는 현재 실행 중이거나 일시 중지된 코루틴에 대한 정보를 검토할 수 있습니다. 코루틴은 실행 중인 디스패처에 따라 그룹화됩니다.

코루틴 디버거를 사용하여 다음을 수행할 수 있습니다.
- 각 코루틴의 상태를 확인할 수 있습니다.
- 실행 중이거나 일시 중지된 코루틴에 대한 로컬 변수 또는 캡처된 변수의 값을 확인할 수 있습니다.
- 코루틴 생성 스택뿐만 아니라 코루틴 내부의 호출 스택도 확인할 수 있습니다. 스택에는 정상적인 디버깅 중에 손실된 프레임을 포함하여 모든 프레임에 대한 변수 값이 포함됩니다.
- 각 코루틴 및 해당 스택의 상태를 포함하는 전체 보고서를 얻을 수 있습니다. 이것을 얻기 위해 코루틴 탭을 마우스 오른쪽 버튼으로 클릭한 후 코루틴의 덤프 가져오기그냥 클릭
코루틴 디버깅을 시작하려면 중단점을 설정하고 디버그 모드에서 애플리케이션을 실행하기만 하면 됩니다.
코루틴 디버깅 정보 지도 시간자세한 내용은
로깅으로 디버그
코루틴 디버거 없이 스레드를 사용하는 애플리케이션을 디버깅하는 한 가지 방법은 각 로그 문에 스레드 이름을 포함하고 스레드 이름을 로그 파일에 인쇄하는 것입니다. 이 기능은 로깅 프레임워크에서 보편적으로 지원됩니다. 코루틴을 사용할 때 스레드 이름만으로는 컨텍스트에 대한 많은 정보를 제공하지 않습니다. kotlinx.코루틴 디버깅을 용이하게 하는 많은 기능을 포함합니다.
JVM 옵션에서 -Dkotlinx.coroutines.debug 를 사용하여 다음 코드를 작성해 보겠습니다.
import kotlinx.coroutines.*
fun log(msg: String) = println("(${Thread.currentThread().name}) $msg")
fun main() = runBlocking<Unit> {
val a = async {
log("I'm computing a piece of the answer")
6
}
val b = async {
log("I'm computing another piece of the answer")
7
}
log("The answer is ${a.await() * b.await()}")
}
완전한 코드는 여기에서 찾을 수 있습니다
이 코드에는 3개의 코루틴이 있습니다. 이들은 runBlocking의 주요 코루틴(#1)과 지연된 값 a(#2) 및 b(#3)를 계산하는 두 개의 코루틴입니다. 모두 runBlocking 컨텍스트에서 실행되며 모두 기본 스레드에서 실행하도록 제한됩니다. 이 코드의 출력은 다음과 같습니다.
(main @coroutine#2) I'm computing a piece of the answer
(main @coroutine#3) I'm computing another piece of the answer
(main @coroutine#1) The answer is 42
로거는 대괄호 안에 스레드 이름을 인쇄하고 현재 실행 중인 코루틴에 추가된 식별자는 다음과 같습니다. 주로 스레드임을 알 수 있습니다. 이 식별자는 디버깅 모드가 켜져 있는 동안 생성된 모든 코루틴에 순차적으로 할당됩니다.
포함된 -ea 옵션으로 JVM을 실행할 때 디버깅 모드가 활성화됩니다. 디버깅 기능에 대해 자세히 알아보기 DEBUG_PROPERTY_NAME 속성 문서에서 찾을 수 있습니다.
다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.
*예를 들어 단일 스레드를 관리하는 디스패처에서 지연이 실행되는 경우 디스패처가 관리하는 스레드가 아닌 기본 실행 스레드에서 지연이 실행됩니다. 이렇게 하면 작업을 실행하기 위해 내부적으로 별도의 디스패처를 지정할 수 있기 때문에 알기 어렵습니다.
이 문서는 공식 코루틴 문서를 번역한 것입니다.
원래의: 코루틴 컨텍스트 및 디스패처 – 코루틴 및 스레드 디버그
원본 텍스트의 최종 편집: 2022년 6월 27일

