我在使用Crystal语言方面非常新手,想知道是否存在类似于Ruby Pry的调试器?
这意味着你可以在代码中插入类似于“binding.pry”的东西,在程序执行到此行时停止,并让你控制变量。
我在使用Crystal语言方面非常新手,想知道是否存在类似于Ruby Pry的调试器?
这意味着你可以在代码中插入类似于“binding.pry”的东西,在程序执行到此行时停止,并让你控制变量。
虽然非常不完整,但是存在对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以获取更详细的示例。
更新(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一样。细节可能会变化,因为这只是一个预览,但你已经可以看到它的潜力了。