Experimental feature in GraalVM

调试 TruffleRuby

TruffleRuby,与其它 GraalVM 语言一样,支持两种标准调试协议:

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

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 中点击 Run -> Start Debugging

借助 GraalVM VSCode 扩展 #

首先安装GraalVM VSCode 扩展

然后遵循此文档,通过 VSCode 调试 TruffleRuby。

RubyMine #

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

请对功能请求进行投票或评论,以表达您的兴趣。

命令行调试选项 #

打印异常 #

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

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

两者都打印所有异常,即使这些异常随后被捕获。

Java 异常可以使用 --exceptions-print-uncaught-java--exceptions-print-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 等后缀结尾。

联系我们