- 適用於 JDK 23 的 GraalVM (最新)
- 適用於 JDK 24 的 GraalVM (搶先體驗)
- 適用於 JDK 21 的 GraalVM
- 適用於 JDK 17 的 GraalVM
- 封存
- 開發版本
偵錯 TruffleRuby
TruffleRuby 與其他 GraalVM 語言一樣,支援 2 種標準偵錯協定
- 最受支援的偵錯介面協定 (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
旗標,會列印每個例外狀況引發的檔案:行數
--backtraces-raise
,會在每個引發的例外狀況上顯示完整的追溯
兩者都會列印所有例外狀況,即使這些例外狀況之後被救援也是如此。
可以使用 --exceptions-print-uncaught-java
或 --exceptions-print-java
來列印 Java 例外狀況。
請參閱其他 --backtraces-*
和 --exceptions-*
選項,以了解更多可能性。
列印執行中處理序的堆疊追蹤和回溯 #
可以將 SIGQUIT
訊號傳送至 TruffleRuby,以使其列印所有執行緒的 Java 堆疊追蹤。 Ctrl + \
可用於將 SIGQUIT
傳送至終端機中的目前處理序。這對於偵錯當機和死結,或了解處理序正在執行的工作很有用。這適用於 TruffleRuby Native 和 JVM。
將 SIGALRM
傳送至 TruffleRuby 處理序將會列印所有執行緒的 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
等後綴。