type必须设为"java",因为kotlin调试依赖jvm和jdwp协议;mainclass需写全限定名如"com.example.appkt";必须配置prelaunchtask确保class已编译。

launch.json里type不能设成kotlin
VSCode没有原生Kotlin调试器,type字段必须填"java",不是"kotlin"或"kotlin-jvm"。填错会导致调试启动失败、断点灰色不可用,或者直接报“Invalid launch configuration”。
原因很简单:Kotlin编译后是字节码,调试器实际 attach 的是 JVM 进程,所有配置都走 Java 调试协议(JDWP)。Kotlin 插件只提供语言服务,不接管调试流程。
mainClass必须带Kt后缀且路径严格匹配
mainClass值要写成"com.example.AppKt",不是"com.example.App",也不是"AppKt"(缺包名)。
这个类名由 Kotlin 编译器生成规则决定:顶层fun main()所在的文件App.kt → 编译后类名就是AppKt;如果文件在src/main/kotlin/com/example/App.kt,那完整类名就是com.example.AppKt。
常见错误现象:
-
Could not find or load main class com.example.App→ 少了Kt -
No such file or directory: .../out/production/classes/com/example/AppKt.class→ 源码没放在src/main/kotlin下,Gradle 没编译出对应 class
必须配preLaunchTask确保class已编译
VSCode 不会自动触发 Gradle 编译。如果launch.json里没设preLaunchTask,调试器会尝试 attach 到一个根本不存在的 class 文件上,结果就是断点不命中、程序直接退出。
推荐写法(放在.vscode/launch.json中):
{
"configurations": [
{
"type": "java",
"name": "Debug App",
"request": "launch",
"mainClass": "com.example.AppKt",
"projectName": "my-kotlin-project",
"preLaunchTask": "gradle build"
}
]
}
preLaunchTask值要和.vscode/tasks.json里定义的 task 名完全一致;建议用gradle build而不是compileKotlin,前者保证依赖、资源、class 全量就绪。
不要手动加--debug-jvm或-Djdwp参数
Gradle 5.4+ 已默认支持./gradlew run --debug-jvm启动带 JDWP 的 JVM,但 VSCode 调试不需要你手动传这些参数——type: "java"配置会自动注入标准 JDWP 启动参数。
如果你在launch.json里硬塞"vmArgs": "-agentlib:jdwp=...",反而会冲突,导致 JVM 启动失败或端口占用。
真正该检查的是:./gradlew run --debug-jvm能否在终端成功启动并打印Listening for transport dt_socket at address: 5005?如果不行,问题在 Gradle 配置,不在 VSCode。











