Как отладить цель 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
Это должно делать то, что вы ищете.