Help us learn about your current experience with the documentation. Take the survey.

Pry 调试

调用 Pry 调试

要调用调试器,在你的代码中某处放置 binding.pry。当 Ruby 解释器执行到这段代码时,程序会停止执行,你可以输入命令来调试程序的状态。

当调试 Puma 或 Sidekiq 等其他进程中的代码时,你可以使用 binding.pry_shell。 然后你可以通过使用 pry-shell 可执行文件连接到这个会话。 你可以观看 这个视频,了解更多关于如何使用 pry-shell 的信息。

binding.pry 偶尔可能会遇到自动加载问题并在名称解析时失败。 如果需要,可以使用 binding.irb 替代,但其功能集较为有限。

byebugbinding.irbbinding.pry

byebug 的界面与 gdb 非常相似,但 byebug 不使用强大的 Pry REPL。

binding.pry 使用 Pry,但缺少一些 byebug 的功能。GitLab 使用 pry-byebug gem。 这个 gem 将 byebug 的一些功能带到了 binding.pry 中,因此使用它可以获得最强的调试能力。

byebug

查看 文档 获取完整的命令列表。

你可以使用 pry 命令启动 Pry REPL。

binding.irb

从 Ruby 2.7 开始,IRB 自带了一个简单的交互式调试器。

查看 文档 了解更多信息。

pry

pry 中有 很多 功能,本文档无法全部涵盖,因此完整的文档请前往 Pry wiki

以下是几个绝对值得一看的功能,也可以在 pry 会话中运行 help 来查看其他可用功能。

状态导航

通过 状态导航,你可以在代码中移动来发现方法等:

# Change context
[1] pry(main)> cd Pry
[2] pry(Pry):1>

# Print methods
[2] pry(Pry):1> ls -m

# Find a method
[3] pry(Pry):1> find-method to_yaml

源码浏览

你可以在 pry 会话中 查看源代码

[1] pry(main)> $ Array#first
# The above is equivalent to
[2] pry(main)> cd Array
[3] pry(Array):1> show-source first

$show-source 的别名。

文档浏览

与源码浏览类似的是 文档浏览

[1] pry(main)> show-doc Array#first

?show-doc 的别名。

命令历史

使用 Control + R 可以搜索你的 命令历史

单步执行

要单步执行代码,你可以使用以下命令:

  • break: 管理断点。
  • step: 单步执行到下一行或方法。可以接受一个可选的数字参数来多次执行。
  • next: 在同一帧中跳到下一行。也可以接受一个可选的数字参数来跳过多行。
  • finish: 执行直到当前栈帧返回。
  • continue: 继续程序执行并结束 Pry 会话。

调用栈导航

你也可以使用这些命令在调用栈中移动:

  • backtrace: 显示当前栈。你可以使用左侧的数字与 frame 命令来导航栈。
  • up: 将栈帧向上移动。可以接受一个可选的数字参数来移动多个帧。
  • down: 将栈帧向下移动。可以接受一个可选的数字参数来移动多个帧。
  • frame <n>: 移动到特定帧。不带参数调用时显示当前帧。

简短命令

当你使用 binding.pry 而不是 byebug 时,像 snfc 这样的简短命令不起作用。要重新安装它们,请将以下内容添加到 ~/.pryrc

if defined?(PryByebug)
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
  Pry.commands.alias_command 'c', 'continue'
end

重复上一条命令

如果你将以下片段放在 ~/.pryrc 中,只需按 Enter 键(例如,使用 stepnext)就可以重复上一条命令:

Pry::Commands.command /^$/, "repeat last command" do
  _pry_.run_command Pry.history.to_a.last
end

byebug 默认支持此功能。