Experimental feature in GraalVM

调试 TruffleRuby

像其他 GraalVM 语言一样,TruffleRuby 支持两种标准的调试协议:

另请参阅 工具,了解除了调试器之外的更多工具。

VSCode #

简单快速 #

  1. 在您要调试的项目中打开 VSCode
     $ cd /path/to/project
     $ code .
    
  2. 创建一个名为 .vscode/launch.json 的文件,内容如下:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach",
            "type": "node",
            "request": "attach",
            "debugServer": 4711
        }
    ]
}
  1. 在命令行中运行 TruffleRuby,并传递 --dap,例如:
     $ ruby --dap test.rb
     $ ruby --dap -Ilib test/some_test.rb
     $ TRUFFLERUBYOPT=--dap bundle exec rspec some_spec.rb
    
  2. 在 VSCode 中,单击 运行 -> 开始调试

使用 GraalVM VSCode 扩展 #

首先安装 GraalVM VSCode 扩展

然后按照 此文档 的说明使用 VSCode 调试 TruffleRuby。

RubyMine #

不幸的是,RubyMine/IntelliJ IDEA 尚未支持用于 Ruby 调试的调试适配器协议。

请投票或在 功能请求 上发表评论,以分享您的兴趣。

命令行调试选项 #

打印异常 #

打印异常有两种方法,这对于查找错误源很有用:

  • 标准 Ruby -d 标志,打印每个异常抛出的 file:line
  • --backtraces-raise,在抛出每个异常时显示完整的回溯信息

两者都会打印所有异常,即使这些异常后来被救援了。

可以使用 --exceptions-print-uncaught-java--exceptions-print-java 打印 Java 异常。

有关更多可能性,请查看其他 --backtraces-*--exceptions-* 选项。

打印正在运行的进程的堆栈跟踪和回溯信息 #

可以向 TruffleRuby 发送 SIGQUIT 信号,使其打印所有线程的 Java 堆栈跟踪信息。在终端中,可以使用 Ctrl + \ 向当前进程发送 SIGQUIT 信号。这对于调试挂起和死锁问题非常有用,或者用于了解进程正在执行的操作。这在 TruffleRuby Native 和 JVM 上都有效。

向 TruffleRuby 进程发送 SIGALRM 信号将打印所有线程的 Ruby 回溯信息。

回溯信息中更多信息 #

TruffleRuby 尽力尽可能地匹配 MRI 的回溯信息格式。这有时意味着不会显示其他可用信息。在调试时,您可能希望看到这些信息。

显示更多信息的选项是 --backtraces-interleave-java=true,它会显示在执行每个 Ruby 方法中涉及的 Java 方法。

当您与其他语言(包括 C 扩展)进行交互时,Java 异常的回溯信息可能会缺少信息,因为当 Ruby 有机会将它们格式化为回溯信息时,Java 帧已经消失了。

打印子进程 #

可以使用选项 --log-subprocess 记录由 TruffleRuby 创建的子进程。

$ ruby --log-subprocess -e '`ls .`'
[ruby] INFO: spawn: ls .

但这并非传递性,除非您在 TRUFFLERUBYOPT 中设置了此选项。

打印 TruffleRuby 进程及其参数 #

可以使用 --log-process-args 记录使用 bin/truffleruby 启动器创建的 TruffleRuby 进程及其参数。

$ ruby --log-process-args -e 0
[ruby] INFO: new process: truffleruby --log-process-args -e 0

您可以在 TRUFFLERUBYOPT 中设置此选项,使其也应用于 TruffleRuby 子进程。在使用 --log.file=PATH 时,将为同时运行的不同子进程使用单独的日志文件。这些日志文件以相同的路径开头,但以 12 等后缀结尾。

联系我们