Debugging Ruby

写代码时候,一些简单的 Bug 基本上打印1,2个变量就能找到原因。但是如果因为不了解 gem 而产生的 Bug 就比较难发现,这时候最好是加断点来调试。

Byebug

基础

  • 开发环境下的 server 会自动加载 debugger
  • byebug 是一个普通的方法,所以可以写如下代码 byebug if foo == "bar"
  • debugger 模式下,按回车会执行最后一条命令,输入 help 可以看到完整的命令列表
  • 还可以用 info 查看一些具体信息
# The display command evaluates expressions every time the debugger stops.
(byebug) info display
There are no auto-display expressions now.

# Doing a info on line gives you the line number of the current break point.
(byebug) info line
Line 8 of "/Users/bparanj/projects/blog5/app/controllers/tasks_controller.rb"

停止

  • q[uit] 退出调试并退出程序
  • quit unconditionally, q! 和上一条命令一样,但略过确认的步骤
  • kill 使用 kill -9 结束当前程序

主要命令

  • c[ontinue] <line-number> 继续执行代码到结束,或发现到另外一处断点
  • n[ext] <number> steps over the current line of code (runs the whole current line)
  • s[tep] <number> steps into the current line of code (runs the current line, stopping inside any called methods)
  • up 返回上一层函数,down 进入下一层函数
  • eval 打印变量的值
  • b[ack]t[race] — a.k.a. "w[here]" Display stack trace.
  • irb 进入 irb 编辑代码
  • exit 退出 irb 并继续调试
  • h[elp] <command-name> 帮助
# In this case, we step into the Rails source code.
(byebug) step

[1, 10] in /Users/bparanj/.rvm/gems/ruby-2.3.0@rails5/gems/actionpack-5.0.0.beta3/lib/action_controller/metal/basic_implicit_render.rb
    1: module ActionController
    2:   module BasicImplicitRender
    3:     def send_action(method, *args)
=>  4:       super.tap { default_render unless performed? }
    5:     end
    6:
    7:     def default_render(*args)
    8:       head :no_content
    9:     end
   10:   end
# The eval command is one way to print the values of variables.
(byebug) eval performed?
false

调试

断点和捕获点 Breakpoints and Catchpoints

命令 解释
b[reak] 当前行增加一个断点,可以在表达式中使用 break if foo != bar
b[reak] <filename>:<line-number> 指定文件中的某一行增加一个断点。如果文件名为空,则是当前文件。 b myfile.rb:15 unless my_var.nil?
b[reak] <class>(.或#) 指定类的某方法开头增加一个断点 b MyClass#my_method if my_boolean
info breakpoints 列出全部断点
cond[ition] <number> <expression> 为第 number 断点增加表达式,如表达式为空,则移除该断点的全部表达式
del[ete] <number> 删除某断点,或删除全不断点
disable breakpoints <number> 禁用某断点,或禁用全部断点
cat[ch] <exception> off 启用或禁用表达式的捕获
cat[ch] 列出全部捕获
cat[ch] off 删除全部捕获
sk[ip] 跳过捕获

Pry

  • pry -r ./config/enviroment
  • cd
  • exit
  • ls -h
  • ls -G map 列出所有包含 map 的方法
  • ls -M Repo --grep ^b 列出 Repo 模块中以 b 开头的方法
  • ls -g List global variables
  • ls -c List constants
  • find-method currency Spree 列出命名空间 Spree 下所有包含 currency 的方法
  • show-source Spree::Product#bought_since any method in your application or its gems
  • show-doc Array#in_group_of
  • show-method all.in_group_of
  • edit-method all.in_group_of

pry-byebug

在 Pry 的基础上,利用 Byebug 增加 step, next, finish, continue

  • step Step execution into the next line or method. Takes an optional numeric argument to step multiple times.
  • next Step over to the next line within the same frame. Also takes an optional numeric argument to step multiple lines.
  • finish Execute until current stack frame returns.
  • continue Continue program execution and end the Pry session.

相关资源

byebug

Pry

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Jan 20, 2015

奉献爱心