有没有类似于Pry的Crystal语言工具?

18

我在使用Crystal语言方面非常新手,想知道是否存在类似于Ruby Pry的调试器?

这意味着你可以在代码中插入类似于“binding.pry”的东西,在程序执行到此行时停止,并让你控制变量。

2个回答

28

虽然非常不完整,但是存在对LLDB的支持。

您可以在代码中的任何位置添加 debugger 以启动断点,使得LLDB停止执行。您应该(必须?)使用 -d--debug 标志构建一个二进制文件,然后使用LLDB运行它:

$ crystal build -d foo.cr
$ lldb ./foo
(lldb) run

请查看https://groups.google.com/forum/m/#!topic/crystal-lang/gRf-yDNdZ-Y以获取更详细的示例。


4

更新(2023年): Crystal解释器(请参见下面的原始答案)现在已经功能齐备,支持交互式调试:

  • 使用crystal i运行代码
  • 使用debugger在代码中设置断点

例如,这是一个调试会话:

def bar(str, val)
  debugger
  puts "***\n#{str}\n***"
end

def foo(dummy)
  bar("test", dummy)
end

foo(42)
puts "Finished"

$ crystal i example.cr
From: example.cr:3:8 <Program>#bar:

    1: def bar(str, val)
    2:   debugger
 => 3:   puts "***\n#{str}\n***"
    4: end
    5: 
    6: def foo(dummy)
    7:   bar("test", dummy)
    8: end

pry(bar)> str
 => "test"
pry(bar)> str += " (changed with debugger)"
 => "test (changed with debugger)"
pry(bar)> next
***
test (changed with debugger)
***
From: example.cr:4:3 <Program>#bar:

    1: def bar(str, val)
    2:   debugger
    3:   puts "***\n#{str}\n***"
 => 4: end
    5: 
    6: def foo(dummy)
    7:   bar("test", dummy)
    8: end
    9: 

pry(bar)> continue
Finished

在撰写本文时,只有Julien的答案是以调试模式编译,添加debugger语句以创建断点,然后使用lldb运行的。但是,现在出现了一种新的技巧:

在Crystal 1.0会议上,Ary在他的精彩演讲Crystal on demand中揭示了他一直在开发的Crystal解释器。它包括一个REPL,但他还在其上实现了类似Pry的Crystal调试器。

它尚未发布,但您可以在此演讲中看到它的实际效果。交互式调试器的部分从9:41开始

它还使用debugger语句来触发断点。如果你用解释模式crystal i运行代码,触发断点将进入一个交互式调试会话,就像Pry一样。细节可能会变化,因为这只是一个预览,但你已经可以看到它的潜力了。
如果你想跟踪开发,拉取请求是#10910: crystal i(现在重新打开为#11159: crystal i)。

https://crystal-lang.org/2021/12/29/crystal-i/ 更详细地解释了 Crystal 的“调试器”,可能需要从源代码编译以获取解释器;Crystal 开发人员不会编译带有解释器的分发版本。 - Nick
1
@Nick 它已经合并,但默认情况下被禁用。要启用它,您必须使用“解释器”标志进行编译 https://github.com/crystal-lang/crystal/blob/f4ae5f033b379fb96c00b04e344e6c17994b50e7/Makefile#L27 - Philipp Claßen
1
我更新了答案:解释器模式现在默认启用,并且在我的测试中表现非常好。 - Philipp Claßen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接