【问题标题】:How do I debug a 'java_binary' target executed by a Bazel rule via 'ctx.actions.run(...)'?如何通过“ctx.actions.run(...)”调试由 Bazel 规则执行的“java_binary”目标?
【发布时间】:2020-02-28 16:39:25
【问题描述】:

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

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

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

是否可以在不使用硬编码jvm_flags的情况下通过命令行实现这一点?

【问题讨论】:

    标签: bazel bazel-rules


    【解决方案1】:

    试试:

    bazel run //:my-target -- --debug
    

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

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

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

    【讨论】:

    • 我只需要那个调试标志,谢谢bazel run //:my-target -- --debug
    【解决方案2】:

    看起来您可以在-- 之后将--jvm_flag 选项作为程序选项的一部分传递。

    构建:

    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)。这是 Bazel 3.7.0。

    【讨论】:

    • 原来--jvm_flag 是不需要的。查看接受的答案。
    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多