(CoroutineDebugger) Stack printing logic extracted to the single place

for DebugMetadata and CoroutinePanel, some corner cases fixed, test
cases added.
Added:
 - external maven dependencies in test scenarios
 - comparing stack traces + variables on breakpoint
This commit is contained in:
Vladimir Ilmov
2020-04-14 14:08:59 +02:00
parent 153056b4fd
commit 3cd0eb0fca
47 changed files with 1487 additions and 734 deletions
@@ -0,0 +1,30 @@
package coroutine1
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
fun main() {
val cnt = Continuation<Int>(EmptyCoroutineContext) { }
val result = ::test1.startCoroutine(1, cnt)
println(result)
}
suspend fun test1(i: Int): Int {
val test1 = "a"
a(test1)
println(test1)
return i
}
suspend fun a(aParam: String) {
val a = "a"
b(a)
println(a)
}
suspend fun b(bParam: String) {
val b = "b"
// Breakpoint!
println(b)
}
@@ -0,0 +1,26 @@
package continuation
fun main() {
val a = "a"
fibonacci().take(10).toList()
}
fun nextSequence(terms: Pair<Int, Int>): Pair<Int, Int> {
val terms1 = Pair(terms.second, terms.first + terms.second)
if (terms1.first == 8) {
//Breakpoint!
return terms1
} else
return terms1
}
fun fibonacci() = sequence {
var terms = Pair(0, 1)
var step = 0
while (true) {
yield(terms.first)
terms = nextSequence(terms)
step++
}
}
@@ -0,0 +1,28 @@
LineBreakpoint created at sequence.kt:14
Run Java
Connected to the target VM
sequence.kt:12
Thread stack trace:
nextSequence:12, SequenceKt (continuation)
(terms, terms1)
invokeSuspend:23, SequenceKt$fibonacci$1 (continuation)
($result, $this$sequence, step, terms, this)
resumeWith:33, kotlin.coroutines.jvm.internal.BaseContinuationImpl
($i$a$-with-BaseContinuationImpl$resumeWith$1, $this$with, completion, current, param, result, this)
hasNext:140, kotlin.sequences.SequenceBuilderIterator
(step, this)
hasNext:374, kotlin.sequences.TakeSequence$iterator$1
(this)
toCollection:722, kotlin.sequences.SequencesKt___SequencesKt
($this$toCollection, destination)
toMutableList:752, kotlin.sequences.SequencesKt___SequencesKt
($this$toMutableList)
toList:743, kotlin.sequences.SequencesKt___SequencesKt
($this$toList)
main:5, continuation.SequenceKt
(a)
main:-1, continuation.SequenceKt
()
Disconnected from the target VM
Process finished with exit code 0
@@ -0,0 +1,30 @@
package continuation
// ATTACH_LIBRARY: coroutines
// ATTACH_LIBRARY: maven(org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.3.4)-javaagent
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.yield
fun main() {
val main = "main"
runBlocking {
a()
}
}
suspend fun a() {
val a = "a"
b(a)
val aLate = "a" // to prevent stackFrame to collapse
}
suspend fun b(paramA: String) {
yield()
val b = "b"
c(b)
}
suspend fun c(paramB: String) {
val c = "c"
//Breakpoint!
}
@@ -0,0 +1,47 @@
LineBreakpoint created at coroutineSuspendFun.kt:30
Run Java
Connected to the target VM
coroutineSuspendFun.kt:30
Thread stack trace:
c:30, CoroutineSuspendFunKt (continuation)
($completion, c, paramB)
b:24, CoroutineSuspendFunKt (continuation)
($completion, $continuation, $result, b, paramA)
a:17, continuation.CoroutineSuspendFunKt
(a)
invokeSuspend:11, continuation.CoroutineSuspendFunKt$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:272, kotlinx.coroutines.EventLoopImplBase
(delayed, 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:10, continuation.CoroutineSuspendFunKt
(main)
main:-1, continuation.CoroutineSuspendFunKt
()
Creation stack frame
createCoroutineUnintercepted:116, kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt
()
startCoroutineCancellable:26, kotlinx.coroutines.intrinsics.CancellableKt
()
runBlocking$default:1, kotlinx.coroutines.BuildersKt
()
main:10, continuation.CoroutineSuspendFunKt
()
main:-1, continuation.CoroutineSuspendFunKt
()
Disconnected from the target VM
Process finished with exit code 0