IntelliJ中如何调试Java应用调用执行的Dart文件
Java调用Dart脚本时的断点调试配置方法
问题场景
通过Java的Runtime.exec()调用执行Dart文件时,直接在IDE中给Dart代码设置断点无法命中,需要实现Java触发Dart执行后自动停在Dart断点位置的调试能力。
当前运行配置截图:
运行输出截图:
断点设置截图:
现有测试代码
Test.dart
import 'dart:io'; void main() { print("Hello World"); }
Main.java
import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws ParseException, IOException { Options options = new Options(); options.addOption("test", true, "Test Dart"); CommandLine cmd = new DefaultParser().parse(options, args); if (cmd.hasOption("test")) { Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(cmd.getOptionValue("test")); String line; BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); while ((line = input.readLine()) != null) { System.out.println(line); } input.close(); } } }
具体配置步骤
核心原理是启动Dart进程时开启VM调试服务,让IDE调试器可以附加到运行中的Dart进程,不需要修改业务逻辑,按以下步骤操作即可:
- 第一步:修改传入Java程序的Dart启动命令
不要直接使用dart run Test.dart作为--test参数的传入值,替换为带调试参数的启动命令:
参数说明:dart run --observe --pause-isolates-on-start Test.dart--observe用于开启Dart VM的调试服务,启动后会在控制台输出调试连接地址;--pause-isolates-on-start会让Dart进程启动后立刻暂停,等待调试器连接,避免代码直接执行完错过断点。如果需要固定调试端口,可以写成--observe=0.0.0.0:8888,自定义端口号即可。 - 第二步:补全Java进程的流读取逻辑
Dart的调试服务提示信息默认输出到进程错误流,当前代码仅读取标准输出流,不仅看不到调试地址,还可能因为流缓冲区满导致进程阻塞。在原有流读取逻辑前新增错误流读取代码:// 新增:异步读取进程错误流 new Thread(() -> { try (BufferedReader errInput = new BufferedReader(new InputStreamReader(pr.getErrorStream()))) { String errLine; while ((errLine = errInput.readLine()) != null) { System.err.println(errLine); } } catch (IOException e) { e.printStackTrace(); } }).start(); - 第三步:附加Dart调试器
启动Java程序(需要调试Java代码可以直接开Java调试模式启动),控制台会输出Dart VM生成的调试链接,格式类似http://127.0.0.1:8181/xxxxxx=/。打开IDE的Dart调试配置,选择「Attach to Dart Process」(附加到Dart进程),输入链接对应的端口号即可连接调试;如果是IDEA/Android Studio,直接点击控制台输出的调试链接可以自动唤起IDE完成附加。 - (可选)自动化配置
如果不需要每次手动附加,可以在IDE中创建复合运行配置:设置启动Java程序后自动执行Dart附加调试任务,配合前面提到的固定调试端口参数,就能实现一键启动、自动命中Java和Dart的所有断点。
附加成功后Dart进程会从暂停状态恢复执行,运行到预设断点位置就会自动停下,和本地直接调试Dart代码的体验完全一致。
内容的提问来源于stack exchange,提问作者Cold_Class
相关产品推荐
相关产品推荐

