- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
调试 TruffleRuby
TruffleRuby,与其它 GraalVM 语言一样,支持两种标准调试协议:
- 调试适配器协议 (DAP),支持度最佳
- Chrome DevTools 协议,支持有限,因为该协议不处理线程
另请参阅工具,获取除调试器之外的更多工具。
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 中点击
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
时,将使用单独的日志文件用于同时运行的不同子进程。这些日志文件以相同的路径开头,但以 1
、2
等后缀结尾。