Experimental feature in GraalVM

偵錯 TruffleRuby

TruffleRuby 與其他 GraalVM 語言一樣,支援 2 種標準偵錯協定

另請參閱工具,以了解除偵錯工具之外的更多工具。

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 旗標,會列印每個例外狀況引發的 檔案:行數
  • --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 時,會將不同的記錄檔用於同時執行的不同子處理序。這些記錄檔開頭的路径相同,但結尾會有 12 等後綴。

與我們聯繫