(CoroutineDebugger) Minor fixes, kotlinx.coroutines version fix

This commit is contained in:
Vladimir Ilmov
2020-04-20 16:32:29 +02:00
parent 0ce8ca7bcd
commit 73f5e48518
22 changed files with 197 additions and 179 deletions
@@ -211,21 +211,6 @@ abstract class AbstractKotlinEvaluateExpressionTest : KotlinDescriptorTestCaseWi
super.expandAll(tree, runnable, HashSet(), filter, suspendContext)
}
private fun SuspendContextImpl.runActionInSuspendCommand(action: SuspendContextImpl.() -> Unit) {
if (myInProgress) {
action()
} else {
val command = object : SuspendContextCommandImpl(this) {
override fun contextAction(suspendContext: SuspendContextImpl) {
action(suspendContext)
}
}
// Try to execute the action inside a command if we aren't already inside it.
debuggerSession.process.managerThread?.invoke(command) ?: command.contextAction(this)
}
}
private fun mayThrow(collector: MutableMap<String, Throwable>, expression: String, f: () -> Unit) {
try {
f()
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.debugger.test
import com.intellij.debugger.engine.AsyncStackTraceProvider
import com.intellij.debugger.engine.JavaStackFrame
import com.intellij.debugger.engine.SuspendContextImpl
import com.intellij.debugger.memory.utils.StackFrameItem
import com.intellij.execution.configurations.JavaParameters
import com.intellij.execution.process.ProcessOutputTypes
import com.intellij.jarRepository.JarRepositoryManager
@@ -25,8 +24,7 @@ import org.jetbrains.jps.model.library.JpsMavenRepositoryLibraryDescriptor
import org.jetbrains.kotlin.idea.debugger.coroutine.CoroutineAsyncStackTraceProvider
import org.jetbrains.kotlin.idea.debugger.coroutine.PreflightProvider
import org.jetbrains.kotlin.idea.debugger.coroutine.data.CreationCoroutineStackFrameItem
import org.jetbrains.kotlin.idea.debugger.coroutine.util.format
import org.jetbrains.kotlin.idea.debugger.invokeInManagerThread
import org.jetbrains.kotlin.idea.debugger.invokeInSuspendManagerThread
import org.jetbrains.kotlin.idea.debugger.test.preference.DebuggerPreferences
import org.jetbrains.kotlin.idea.debugger.test.util.XDebuggerTestUtil
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
@@ -45,14 +43,7 @@ abstract class KotlinDescriptorTestCaseWithStackFrames() : KotlinDescriptorTestC
val agentList = mutableListOf<JpsMavenRepositoryLibraryDescriptor>()
val classPath = mutableListOf<String>()
protected fun out(stackFrame: StackFrameItem) {
if (stackFrame is CreationCoroutineStackFrameItem && stackFrame.first)
out(0, "Creation stack frame")
out(INDENT_FRAME, stackFrame.format())
outVariables(debugProcess.invokeInManagerThread { stackFrame.createFrame(debugProcess) } ?: return)
}
protected fun out(frame: JavaStackFrame) {
protected fun out(frame: XStackFrame) {
out(INDENT_FRAME, XDebuggerTestUtil.getFramePresentation(frame))
outVariables(frame)
}
@@ -92,18 +83,33 @@ abstract class KotlinDescriptorTestCaseWithStackFrames() : KotlinDescriptorTestC
try {
out("Thread stack trace:")
val stackFrames: List<XStackFrame> = XDebuggerTestUtil.collectFrames(executionStack)
for (frame in stackFrames) {
if (frame is JavaStackFrame) {
out(frame)
val stackFrames = asyncStackTraceProvider?.getAsyncStackTrace(frame, suspendContext as SuspendContextImpl)
if (stackFrames != null) {
if (stackFrames is PreflightProvider) {
val preflightFrame = stackFrames.getPreflight()
out(0, preflightFrame.coroutineInfoData.key.toString())
val suspendContextImpl = suspendContext as SuspendContextImpl
suspendContextImpl.runActionInSuspendCommand {
for (frame in stackFrames) {
if (frame is JavaStackFrame) {
out(frame)
val stackFrames = suspendContext.invokeInSuspendManagerThread(debugProcess) {
asyncStackTraceProvider?.getAsyncStackTrace(frame, suspendContextImpl)
}
if (stackFrames != null) {
if (stackFrames is PreflightProvider) {
val preflightFrame = stackFrames.getPreflight()
out(0, preflightFrame.coroutineInfoData.key.toString())
}
for (frameItem in stackFrames) {
if (frameItem is CreationCoroutineStackFrameItem && frameItem.first)
out(0, "Creation stack frame")
val frame: XStackFrame? = suspendContext.invokeInSuspendManagerThread(debugProcess) {
frameItem.createFrame(debugProcess)
}
frame?.let {
out(frame)
}
}
return@runActionInSuspendCommand
}
for (frameItem in stackFrames)
out(frameItem)
return@doWhenXSessionPausedThenResume
}
}
}
@@ -118,7 +124,6 @@ abstract class KotlinDescriptorTestCaseWithStackFrames() : KotlinDescriptorTestC
}
}
protected fun getAsyncStackTraceProvider(): CoroutineAsyncStackTraceProvider? {
val area = Extensions.getArea(null)
if (!area.hasExtensionPoint(ASYNC_STACKTRACE_EP_NAME)) {
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.debugger.test
import com.intellij.debugger.actions.MethodSmartStepTarget
import com.intellij.debugger.engine.*
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl
import com.intellij.debugger.engine.events.SuspendContextCommandImpl
import com.intellij.debugger.impl.DebuggerContextImpl
import com.intellij.debugger.impl.JvmSteppingCommandProvider
import com.intellij.debugger.impl.PositionUtil
@@ -157,4 +158,19 @@ abstract class KotlinDescriptorTestCaseWithStepping : KotlinDescriptorTestCase()
}
}
}
protected fun SuspendContextImpl.runActionInSuspendCommand(action: SuspendContextImpl.() -> Unit) {
if (myInProgress) {
action()
} else {
val command = object : SuspendContextCommandImpl(this) {
override fun contextAction(suspendContext: SuspendContextImpl) {
action(suspendContext)
}
}
// Try to execute the action inside a command if we aren't already inside it.
debuggerSession.process.managerThread?.invoke(command) ?: command.contextAction(this)
}
}
}
@@ -33,8 +33,8 @@ public class XCoroutinesStackTraceTestGenerated extends AbstractXCoroutinesStack
runTest("idea/jvm-debugger/jvm-debugger-test/testData/xcoroutines/coroutineSuspendFun.kt");
}
@TestMetadata("coroutineSuspendFun135.kt")
public void testCoroutineSuspendFun135() throws Exception {
runTest("idea/jvm-debugger/jvm-debugger-test/testData/xcoroutines/coroutineSuspendFun135.kt");
@TestMetadata("coroutineSuspendFun136.kt")
public void testCoroutineSuspendFun136() throws Exception {
runTest("idea/jvm-debugger/jvm-debugger-test/testData/xcoroutines/coroutineSuspendFun136.kt");
}
}
@@ -8,17 +8,17 @@ Thread stack trace:
a:21, SuspendFunKt (coroutine1)
($completion, $continuation, $result, a, aParam)
CoroutineNameIdState(name=coroutine, id=-1, state=UNKNOWN, dispatcher=null)
test1:15, coroutine1.SuspendFunKt
test1:15, SuspendFunKt (coroutine1)
(i, test1)
invoke:9, coroutine1.SuspendFunKt$main$result$1
invoke:9, SuspendFunKt$main$result$1 (coroutine1)
(continuation, p1, this)
invokeSuspend:121, kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$3
invokeSuspend:121, IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$3 (kotlin.coroutines.intrinsics)
($i$a$-createCoroutineFromSuspendFunction-IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$2, it, result, this)
resumeWith:33, kotlin.coroutines.jvm.internal.BaseContinuationImpl
resumeWith:33, BaseContinuationImpl (kotlin.coroutines.jvm.internal)
($i$a$-with-BaseContinuationImpl$resumeWith$1, $this$with, completion, current, param, result, this)
startCoroutine:128, kotlin.coroutines.ContinuationKt
startCoroutine:128, ContinuationKt (kotlin.coroutines)
($this$startCoroutine, completion, receiver)
main:9, coroutine1.SuspendFunKt
main:9, SuspendFunKt (coroutine1)
(cnt)
Disconnected from the target VM
@@ -8,38 +8,38 @@ Thread stack trace:
b:23, CoroutineSuspendFunKt (continuation)
($completion, $continuation, $result, b, paramA)
CoroutineNameIdState(name=coroutine, id=1, state=RUNNING, dispatcher=BlockingEventLoop@6f45df59)
a:16, continuation.CoroutineSuspendFunKt
a:16, CoroutineSuspendFunKt (continuation)
(a)
invokeSuspend:10, continuation.CoroutineSuspendFunKt$main$1
invokeSuspend:10, CoroutineSuspendFunKt$main$1 (continuation)
($this$runBlocking)
resumeWith:33, kotlin.coroutines.jvm.internal.BaseContinuationImpl
resumeWith:33, BaseContinuationImpl (kotlin.coroutines.jvm.internal)
($i$a$-with-BaseContinuationImpl$resumeWith$1, $this$with, completion, current, param, result, this)
run:56, kotlinx.coroutines.DispatchedTask
run:56, DispatchedTask (kotlinx.coroutines)
($i$a$-withCoroutineContext-DispatchedTask$run$1, $i$f$withCoroutineContext, context, continuation, countOrElement$iv, delegate, exception, fatalException, job, oldValue$iv, state, taskContext, this)
processNextEvent:272, kotlinx.coroutines.EventLoopImplBase
processNextEvent:272, EventLoopImplBase (kotlinx.coroutines)
(delayed, this)
joinBlocking:79, kotlinx.coroutines.BlockingCoroutine
joinBlocking:79, BlockingCoroutine (kotlinx.coroutines)
(this)
runBlocking:54, kotlinx.coroutines.BuildersKt__BuildersKt
runBlocking:54, BuildersKt__BuildersKt (kotlinx.coroutines)
(block, context, contextInterceptor, coroutine, currentThread, eventLoop, newContext)
runBlocking:1, kotlinx.coroutines.BuildersKt
runBlocking:1, BuildersKt (kotlinx.coroutines)
()
runBlocking$default:36, kotlinx.coroutines.BuildersKt__BuildersKt
runBlocking$default:36, BuildersKt__BuildersKt (kotlinx.coroutines)
()
runBlocking$default:1, kotlinx.coroutines.BuildersKt
runBlocking$default:1, BuildersKt (kotlinx.coroutines)
()
main:9, continuation.CoroutineSuspendFunKt
main:9, CoroutineSuspendFunKt (continuation)
(main)
Creation stack frame
createCoroutineUnintercepted:116, kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt
createCoroutineUnintercepted:116, IntrinsicsKt__IntrinsicsJvmKt (kotlin.coroutines.intrinsics)
()
startCoroutineCancellable:26, kotlinx.coroutines.intrinsics.CancellableKt
startCoroutineCancellable:26, CancellableKt (kotlinx.coroutines.intrinsics)
()
runBlocking$default:1, kotlinx.coroutines.BuildersKt
runBlocking$default:1, BuildersKt (kotlinx.coroutines)
()
main:9, continuation.CoroutineSuspendFunKt
main:9, CoroutineSuspendFunKt (continuation)
()
main:-1, continuation.CoroutineSuspendFunKt
main:-1, CoroutineSuspendFunKt (continuation)
()
Disconnected from the target VM
@@ -1,46 +0,0 @@
LineBreakpoint created at coroutineSuspendFun135.kt:29
Run Java
Connected to the target VM
coroutineSuspendFun135.kt:29
Thread stack trace:
c:29, CoroutineSuspendFun135Kt (continuation)
($completion, c, paramB)
b:23, CoroutineSuspendFun135Kt (continuation)
($completion, $continuation, $result, b, paramA)
CoroutineNameIdState(name=coroutine, id=1, state=RUNNING, dispatcher=BlockingEventLoop@305fd85d)
a:16, continuation.CoroutineSuspendFun135Kt
(a)
invokeSuspend:10, continuation.CoroutineSuspendFun135Kt$main$1
($this$runBlocking)
resumeWith:33, kotlin.coroutines.jvm.internal.BaseContinuationImpl
($i$a$-with-BaseContinuationImpl$resumeWith$1, $this$with, completion, current, param, result, this)
run:56, kotlinx.coroutines.DispatchedTask
($i$a$-withCoroutineContext-DispatchedTask$run$1, $i$f$withCoroutineContext, context, continuation, countOrElement$iv, delegate, exception, fatalException, job, oldValue$iv, state, taskContext, this)
processNextEvent:274, kotlinx.coroutines.EventLoopImplBase
(delayed, task, this)
joinBlocking:79, kotlinx.coroutines.BlockingCoroutine
(this)
runBlocking:54, kotlinx.coroutines.BuildersKt__BuildersKt
(block, context, contextInterceptor, coroutine, currentThread, eventLoop, newContext)
runBlocking:1, kotlinx.coroutines.BuildersKt
()
runBlocking$default:36, kotlinx.coroutines.BuildersKt__BuildersKt
()
runBlocking$default:1, kotlinx.coroutines.BuildersKt
()
main:9, continuation.CoroutineSuspendFun135Kt
(main)
Creation stack frame
createCoroutineUnintercepted:116, kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt
()
startCoroutineCancellable:26, kotlinx.coroutines.intrinsics.CancellableKt
()
runBlocking$default:1, kotlinx.coroutines.BuildersKt
()
main:9, continuation.CoroutineSuspendFun135Kt
()
main:-1, continuation.CoroutineSuspendFun135Kt
()
Disconnected from the target VM
Process finished with exit code 0
@@ -0,0 +1,46 @@
LineBreakpoint created at coroutineSuspendFun136.kt:29
Run Java
Connected to the target VM
coroutineSuspendFun136.kt:29
Thread stack trace:
c:29, CoroutineSuspendFun136Kt (continuation)
($completion, c, paramB)
b:23, CoroutineSuspendFun136Kt (continuation)
($completion, $continuation, $result, b, paramA)
CoroutineNameIdState(name=coroutine, id=1, state=RUNNING, dispatcher=BlockingEventLoop@305fd85d)
a:16, CoroutineSuspendFun136Kt (continuation)
(a)
invokeSuspend:10, CoroutineSuspendFun136Kt$main$1 (continuation)
($this$runBlocking)
resumeWith:33, BaseContinuationImpl (kotlin.coroutines.jvm.internal)
($i$a$-with-BaseContinuationImpl$resumeWith$1, $this$with, completion, current, param, result, this)
run:56, DispatchedTask (kotlinx.coroutines)
($i$a$-withCoroutineContext-DispatchedTask$run$1, $i$f$withCoroutineContext, context, continuation, countOrElement$iv, delegate, exception, fatalException, job, oldValue$iv, state, taskContext, this)
processNextEvent:274, EventLoopImplBase (kotlinx.coroutines)
(delayed, task, this)
joinBlocking:79, BlockingCoroutine (kotlinx.coroutines)
(this)
runBlocking:54, BuildersKt__BuildersKt (kotlinx.coroutines)
(block, context, contextInterceptor, coroutine, currentThread, eventLoop, newContext)
runBlocking:1, BuildersKt (kotlinx.coroutines)
()
runBlocking$default:36, BuildersKt__BuildersKt (kotlinx.coroutines)
()
runBlocking$default:1, BuildersKt (kotlinx.coroutines)
()
main:9, CoroutineSuspendFun136Kt (continuation)
(main)
Creation stack frame
createCoroutineUnintercepted:116, IntrinsicsKt__IntrinsicsJvmKt (kotlin.coroutines.intrinsics)
()
startCoroutineCancellable:26, CancellableKt (kotlinx.coroutines.intrinsics)
()
runBlocking$default:1, BuildersKt (kotlinx.coroutines)
()
main:9, CoroutineSuspendFun136Kt (continuation)
()
main:-1, CoroutineSuspendFun136Kt (continuation)
()
Disconnected from the target VM
Process finished with exit code 0