summaryrefslogtreecommitdiff
path: root/doc/development/pry_debugging.md
blob: 5481da348e8f51fc9ecf0b90d73461e58219513b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
---
stage: none
group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---

# Pry debugging

## Invoking pry debugging

To invoke the debugger, place `binding.pry` somewhere in your
code. When the Ruby interpreter hits that code, execution stops,
and you can type in commands to debug the state of the program.

When debugging code in another process like Puma or Sidekiq, you can use `binding.pry_shell`.
You can then connect to this session by using the [pry-shell](https://github.com/meinac/pry-shell) executable.
You can watch [this video](https://www.youtube.com/watch?v=Lzs_PL_BySo), for more information about
how to use the `pry-shell`.

## `byebug` vs `binding.pry`

`byebug` has a very similar interface as `gdb`, but `byebug` does not
use the powerful Pry REPL.

`binding.pry` uses Pry, but lacks some of the `byebug`
features. GitLab uses the [`pry-byebug`](https://github.com/deivid-rodriguez/pry-byebug)
gem. This gem brings some capabilities `byebug` to `binding.pry`, so
using that gives you the most debugging powers.

## `byebug`

Check out [the docs](https://github.com/deivid-rodriguez/byebug) for the full list of commands.

You can start the Pry REPL with the `pry` command.

## `pry`

There are **a lot** of features present in `pry`, too much to cover in
this document, so for the full documentation head over to the [Pry wiki](https://github.com/pry/pry/wiki).

Below are a few features definitely worth checking out, also run
`help` in a pry session to see what else you can do.

### State navigation

With the [state navigation](https://github.com/pry/pry/wiki/State-navigation)
you can move around in the code to discover methods and such:

```ruby
# 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
```

### Source browsing

You [look at the source code](https://github.com/pry/pry/wiki/Source-browsing)
from your `pry` session:

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

`$` is an alias for `show-source`.

### Documentation browsing

Similar to source browsing, is [Documentation browsing](https://github.com/pry/pry/wiki/Documentation-browsing).

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

`?` is an alias for `show-doc`.

### Command history

With <kbd>Control</kbd> + <kbd>R</kbd> you can search your [command history](https://github.com/pry/pry/wiki/History).

## Stepping

To step through the code, you can use the following commands:

- `break`: Manage breakpoints.
- `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.

## Callstack navigation

You also can move around in the callstack with these commands:

- `backtrace`: Shows the current stack. You can use the numbers on the
  left side with the frame command to navigate the stack.
- `up`: Moves the stack frame up. Takes an optional numeric argument
  to move multiple frames.
- `down`: Moves the stack frame down. Takes an optional numeric
  argument to move multiple frames.
- `frame <n>`: Moves to a specific frame. Called without arguments
  displays the current frame.

## Short commands

When you use `binding.pry` instead of `byebug`, the short commands
like `s`, `n`, `f`, and `c` do not work. To reinstall them, add this
to `~/.pryrc`:

```ruby
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
```

## Repeat last command

You can repeat the last command by just hitting the <kbd>Enter</kbd>
key (for example, with `step` or`next`), if you place the following snippet
in your `~/.pryrc`:

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

`byebug` supports this out-of-the-box.