(CoroutineDebugger) Added check if agent is not available in target jvm

This commit is contained in:
Vladimir Ilmov
2020-04-08 14:26:17 +02:00
parent 38ec388429
commit 153056b4fd
4 changed files with 32 additions and 20 deletions
@@ -6,10 +6,7 @@
package org.jetbrains.kotlin.idea.configuration package org.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.util.text.StringUtil
import com.intellij.util.Consumer import com.intellij.util.Consumer
import com.intellij.util.SystemProperties
import org.jetbrains.kotlin.idea.debugger.coroutine.standaloneCoroutineDebuggerEnabled
import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension
class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtension() { class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtension() {
@@ -24,16 +21,17 @@ class KotlinGradleCoroutineDebugProjectResolver : AbstractProjectResolverExtensi
} }
private fun setupCoroutineAgentForJvmForkedTestTasks(initScriptConsumer: Consumer<String>) { private fun setupCoroutineAgentForJvmForkedTestTasks(initScriptConsumer: Consumer<String>) {
val lines = arrayOf( val script =
"gradle.taskGraph.beforeTask { Task task ->", //language=Gradle
" if (task instanceof Test) {", """
" def kotlinxCoroutinesDebugJar = task.classpath.find { it.name.startsWith(\"kotlinx-coroutines-debug\") }", gradle.taskGraph.beforeTask { Task task ->
" if (kotlinxCoroutinesDebugJar)", if (task instanceof Test) {
" task.jvmArgs (\"-javaagent:\${kotlinxCoroutinesDebugJar?.absolutePath}\", \"-ea\")", def kotlinxCoroutinesDebugJar = task.classpath.find { it.name.startsWith("kotlinx-coroutines-debug") }
" }", if (kotlinxCoroutinesDebugJar)
"}" task.jvmArgs ("-javaagent:${'$'}{kotlinxCoroutinesDebugJar?.absolutePath}", "-ea")
) }
val script = StringUtil.join(lines, SystemProperties.getLineSeparator()) }
""".trimIndent()
initScriptConsumer.consume(script) initScriptConsumer.consume(script)
} }
} }
@@ -101,6 +101,4 @@ class DebuggerConnection(
} }
} }
fun standaloneCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines.standalone")
fun coroutineDebuggerTraceEnabled() = Registry.`is`("kotlin.debugger.coroutines.trace") fun coroutineDebuggerTraceEnabled() = Registry.`is`("kotlin.debugger.coroutines.trace")
@@ -8,10 +8,17 @@ package org.jetbrains.kotlin.idea.debugger.coroutine.data
class CoroutineInfoCache( class CoroutineInfoCache(
val cache: MutableList<CoroutineInfoData> = mutableListOf(), var state: CacheState = CacheState.INIT val cache: MutableList<CoroutineInfoData> = mutableListOf(), var state: CacheState = CacheState.INIT
) { ) {
fun ok(infoList: List<CoroutineInfoData>) { fun ok(infoList: List<CoroutineInfoData>): CoroutineInfoCache {
cache.clear() cache.clear()
cache.addAll(infoList) cache.addAll(infoList)
state = CacheState.OK state = CacheState.OK
return this
}
fun ok(): CoroutineInfoCache {
cache.clear()
state = CacheState.OK
return this
} }
fun fail(): CoroutineInfoCache { fun fail(): CoroutineInfoCache {
@@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.debugger.coroutine.proxy
import com.intellij.debugger.engine.DebuggerManagerThreadImpl import com.intellij.debugger.engine.DebuggerManagerThreadImpl
import com.intellij.debugger.engine.SuspendContextImpl import com.intellij.debugger.engine.SuspendContextImpl
import com.intellij.openapi.util.registry.Registry
import org.jetbrains.kotlin.idea.debugger.coroutine.command.CoroutineBuilder import org.jetbrains.kotlin.idea.debugger.coroutine.command.CoroutineBuilder
import org.jetbrains.kotlin.idea.debugger.coroutine.data.CoroutineInfoCache import org.jetbrains.kotlin.idea.debugger.coroutine.data.CoroutineInfoCache
import org.jetbrains.kotlin.idea.debugger.coroutine.data.CoroutineInfoData import org.jetbrains.kotlin.idea.debugger.coroutine.data.CoroutineInfoData
@@ -25,7 +26,7 @@ class CoroutineDebugProbesProxy(val suspendContext: SuspendContextImpl) {
val coroutineInfoCache = CoroutineInfoCache() val coroutineInfoCache = CoroutineInfoCache()
try { try {
val executionContext = suspendContext.executionContext() ?: return coroutineInfoCache.fail() val executionContext = suspendContext.executionContext() ?: return coroutineInfoCache.fail()
val libraryAgentProxy = findProvider(executionContext) val libraryAgentProxy = findProvider(executionContext) ?: return coroutineInfoCache.ok()
val infoList = libraryAgentProxy.dumpCoroutinesInfo() val infoList = libraryAgentProxy.dumpCoroutinesInfo()
coroutineInfoCache.ok(infoList) coroutineInfoCache.ok(infoList)
} catch (e: Throwable) { } catch (e: Throwable) {
@@ -35,8 +36,16 @@ class CoroutineDebugProbesProxy(val suspendContext: SuspendContextImpl) {
return coroutineInfoCache return coroutineInfoCache
} }
private fun findProvider(executionContext: DefaultExecutionContext) = private fun findProvider(executionContext: DefaultExecutionContext): CoroutineInfoProvider? {
CoroutineLibraryAgent2Proxy.instance(executionContext) ?: CoroutineNoLibraryProxy(executionContext) val agentProxy = CoroutineLibraryAgent2Proxy.instance(executionContext)
if (agentProxy != null)
return agentProxy
if (standaloneCoroutineDebuggerEnabled())
return CoroutineNoLibraryProxy(executionContext)
return null
}
fun frameBuilder() = CoroutineBuilder(suspendContext) fun frameBuilder() = CoroutineBuilder(suspendContext)
} }
fun standaloneCoroutineDebuggerEnabled() = Registry.`is`("kotlin.debugger.coroutines.standalone")