- GraalVM for JDK 23 (最新)
- GraalVM for JDK 24 (抢先体验)
- GraalVM for JDK 21
- GraalVM for JDK 17
- 存档
- 开发版本
调试 TruffleRuby
像其他 GraalVM 语言一样,TruffleRuby 支持两种标准的调试协议:
- 调试适配器协议 (DAP),支持最佳
- Chrome 开发者工具协议,支持有限,因为该协议不处理线程
另请参阅 工具,了解除了调试器之外的更多工具。
VSCode #
简单快速 #
- 在您要调试的项目中打开 VSCode
$ cd /path/to/project $ code .
- 创建一个名为
.vscode/launch.json
的文件,内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach",
"type": "node",
"request": "attach",
"debugServer": 4711
}
]
}
- 在命令行中运行 TruffleRuby,并传递
--dap
,例如:$ ruby --dap test.rb $ ruby --dap -Ilib test/some_test.rb $ TRUFFLERUBYOPT=--dap bundle exec rspec some_spec.rb
- 在 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
时,将为同时运行的不同子进程使用单独的日志文件。这些日志文件以相同的路径开头,但以 1
、2
等后缀结尾。