Как отладить цель java_binary, выполняемую правилом Bazel, через ctx.actions.run(...)?

У меня есть java_binary target в моей рабочей области, которую я позже передаю как исполняемый файл в ctx.actions.runвнутри правила. Все идет нормально.

Теперь я хочу отладить это java_binaryпока Базель выполняет правило. Для подключения отладчика мне понадобитсяjava_binaryзапустить в режиме отладки. Пока что единственное, что я придумал, - это установитьjvm_flags на java_binary. Я смог заставить это работать. Но мне было интересно, есть ли способ добиться этого из командной строки вместо того, чтобы запекать его вjava_binary.

java_binary(
    ...
    jvm_flags = [
        "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000"
    ],
)

Можно ли добиться этого из командной строки без жесткого кодирования jvm_flags?

3 ответа

Решение

Одна из стратегий - запустить сборку с --subcommands, который скажет bazel распечатать все команды, которые он выполняет во время сборки. Затем найдите командную строку, соответствующую вызовуjava_binary вас интересует. Затем вы можете скопировать / вставить эту команду (включая cd part) и измените его, включив в него флаги отладки, и выполните отладку, как и любой другой процесс.

Отметим также, что java_binary выводит сценарий оболочки, который включает --debug[=<port>] flag, так что это должно быть все, что нужно добавить в командную строку.

Отметим также, что --subcommandsбудет печатать только те команды, которые фактически выполняются во время сборки, поэтому полностью кэшированная / полностью инкрементная сборка ничего не напечатает. Возможно, вам придется сделатьcleanили удалите некоторые из выходных данных интересующего вас действия, чтобы bazel запустил эту команду.

Похоже, вы можете передать эту опцию как часть опций программы после файла .

СТРОИТЬ:

      java_binary(
    name = "extract",
    main_class = "com.pkg.Main",
    resources = glob(["src/main/resources/**/*"]),
)

Интерфейс командной строки:

      bazel run //:extract -- --jvm_flag="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=7942" -path %cd%\config.json

Кажется, что --jvm_flagопция должна идти сразу после --, перед опциями программы ( -pathв примере). Это с Базелем 3.7.0.

Принятый ответ работает, но если вы ищете более полную команду, попробуйте запустить

      bazel run --java_debug --test_arg=--wrapper_script_flag=--debug=8000 -- //your-target/...

Вы должны увидеть это в журналах Bazel.

      ...
Listening for transport dt_socket at address: 8000
...

Если вы запускаете команду на другом хосте, вы можете отменить ssh-туннель, используя

      ssh -L 8000:localhost:8000 <remote-host-cname>

Как только вы это сделаете, просто привяжите свой отладчик к порту 8000, используя этот флаг JVM.

      -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000

Это должно делать то, что вы ищете.

Другие вопросы по тегам