如何通过“ctx.actions.run(...)”调试 Bazel 规则执行的“java_binary”目标?

Gun*_*nar 5 bazel bazel-rules

我的工作区中有一个java_binary目标,稍后我会将其作为可执行文件传递到ctx.actions.run规则内部。到目前为止,一切都很好。

现在我想java_binary在 Bazel 执行规则时对其进行调试。为了附加调试器,我需要java_binary在调试模式下运行。到目前为止,我唯一想到的就是jvm_flags设置java_binary. 我能够让它发挥作用。但我想知道是否有一种方法可以从命令行实现它,而不是将其烘焙到java_binary.

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

是否可以从命令行实现这一点而无需硬编码jvm_flags

ahu*_*sky 4

尝试:

bazel run //:my-target -- --debug
Run Code Online (Sandbox Code Playgroud)

一种策略是使用 运行构建--subcommands,这将告诉 bazel 打印出构建期间运行的所有命令。java_binary然后找到与您感兴趣的调用相对应的命令行。然后您可以复制/粘贴该命令(包括该cd部分)并修改它以包含调试标志,并像调试任何其他进程一样调试它。

另请注意,java_binary输出一个包含标志的包装器脚本--debug[=<port>],因此这应该是需要添加到命令行的所有内容。

另请注意,--subcommands只会打印构建期间实际执行的命令,因此完全缓存/完全增量构建将不会打印任何内容。您可能需要执行clean或删除您感兴趣的操作的一些输出,以便 bazel 运行该命令。