跳至內容

執行階段追蹤

Crystal 執行階段具有追蹤低階功能的功能。它會印出關於執行階段內部的診斷資訊。

程式必須使用 -Dtracing 旗標建置才能支援追蹤。在執行階段,可以透過環境變數 CRYSTAL_TRACE 啟用個別的追蹤元件。它會接收以逗號分隔的區段清單來啟用。

  • CRYSTAL_TRACE=none 停用追蹤(預設)
  • CRYSTAL_TRACE=gc:啟用垃圾收集器的追蹤
  • CRYSTAL_TRACE=sched:啟用排程器的追蹤
  • CRYSTAL_TRACE=gc,sched:啟用垃圾收集器和排程器的追蹤
  • CRYSTAL_TRACE=all 啟用所有追蹤(相當於 gc,sched

範例

$ crystal build -Dtracing hello-world.cr
$ CRYSTAL_TRACE=sched ./hello-world
sched.spawn 70569399740240 thread=0x7f48d7dc9740:? fiber=0x7f48d7cd0f00:main fiber=0x7f48d7cd0dc0:Signal Loop
sched.enqueue 70569399831716 thread=0x7f48d7dc9740:? fiber=0x7f48d7cd0f00:main fiber=0x7f48d7cd0dc0:Signal Loop duration=163
Hello World

預設情況下,追蹤會列印到標準錯誤。這可以在執行階段使用 CRYSTAL_TRACE_FILE 環境變數來變更。

例如,CRYSTAL_TRACE_FILE=trace.log 會將所有追蹤輸出印到 trace.log 檔案。

追蹤格式

每個追蹤條目都佔用一行,並以換行符號終止,且長度最多為 512 位元組。

每個條目都以一個識別符號開頭,該識別符號由區段和操作名稱組成,並以點號分隔(例如 gc.malloc)。接下來是一個以奈秒為單位的整數表示的時間戳記。最後,是以單一空格分隔的 key=value 形式的中繼資料屬性清單。

前兩個屬性始終是原始的 threadfiber。兩者都以 id 和名稱識別,並以冒號分隔(例如 0x7f48d7cd0f00:main)。

  • 執行緒 id 是作業系統的處理序,因此我們可以將執行緒與偵錯器工作階段進行比對,例如。
  • 光纖 id 是 Crystal 執行階段中的內部位址。名稱是選用的,不一定具有唯一性。

執行階段啟動早期發出的追蹤項目可能會缺少光纖中繼資料和執行緒名稱。

根據特定的追蹤條目,後面可能會跟隨更多中繼資料屬性。

例如,gc.malloc 表示正在配置多少記憶體。

回報的值通常以整數表示,其語意如下

  • 時間和持續時間以奈秒為單位,根據作業系統的單調時鐘(例如,123123ns50000000005s)。
  • 記憶體大小以位元組為單位(例如,10241KB)。