You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IntelliJ中如何调试Java应用调用执行的Dart文件

Java调用Dart脚本时的断点调试配置方法

问题场景

通过Java的Runtime.exec()调用执行Dart文件时,直接在IDE中给Dart代码设置断点无法命中,需要实现Java触发Dart执行后自动停在Dart断点位置的调试能力。
当前运行配置截图:
Java运行配置
运行输出截图:
程序运行输出
断点设置截图:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:57:11