byebug 3.5.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.rubocop.yml +18 -1
  4. data/.travis.yml +21 -1
  5. data/CHANGELOG.md +356 -308
  6. data/CONTRIBUTING.md +31 -15
  7. data/GUIDE.md +859 -475
  8. data/Gemfile +8 -10
  9. data/LICENSE +1 -1
  10. data/README.md +41 -45
  11. data/Rakefile +30 -28
  12. data/byebug.gemspec +18 -18
  13. data/ext/byebug/breakpoint.c +88 -75
  14. data/ext/byebug/byebug.c +253 -252
  15. data/ext/byebug/byebug.h +53 -53
  16. data/ext/byebug/context.c +188 -159
  17. data/ext/byebug/extconf.rb +9 -6
  18. data/ext/byebug/locker.c +53 -11
  19. data/ext/byebug/threads.c +137 -39
  20. data/lib/byebug/attacher.rb +7 -2
  21. data/lib/byebug/breakpoint.rb +30 -0
  22. data/lib/byebug/command.rb +36 -32
  23. data/lib/byebug/commands/break.rb +49 -48
  24. data/lib/byebug/commands/catch.rb +64 -0
  25. data/lib/byebug/commands/condition.rb +13 -9
  26. data/lib/byebug/commands/continue.rb +8 -4
  27. data/lib/byebug/commands/delete.rb +10 -4
  28. data/lib/byebug/commands/display.rb +33 -25
  29. data/lib/byebug/commands/edit.rb +18 -13
  30. data/lib/byebug/commands/enable_disable.rb +26 -24
  31. data/lib/byebug/commands/eval.rb +77 -35
  32. data/lib/byebug/commands/finish.rb +9 -5
  33. data/lib/byebug/commands/frame.rb +66 -125
  34. data/lib/byebug/commands/help.rb +14 -21
  35. data/lib/byebug/commands/history.rb +5 -1
  36. data/lib/byebug/commands/info.rb +41 -106
  37. data/lib/byebug/commands/interrupt.rb +6 -2
  38. data/lib/byebug/commands/irb.rb +5 -2
  39. data/lib/byebug/commands/kill.rb +6 -2
  40. data/lib/byebug/commands/list.rb +21 -14
  41. data/lib/byebug/commands/method.rb +17 -9
  42. data/lib/byebug/commands/pry.rb +13 -3
  43. data/lib/byebug/commands/quit.rb +10 -5
  44. data/lib/byebug/commands/restart.rb +12 -19
  45. data/lib/byebug/commands/save.rb +10 -6
  46. data/lib/byebug/commands/set.rb +15 -14
  47. data/lib/byebug/commands/show.rb +8 -8
  48. data/lib/byebug/commands/source.rb +14 -8
  49. data/lib/byebug/commands/stepping.rb +15 -29
  50. data/lib/byebug/commands/threads.rb +73 -49
  51. data/lib/byebug/commands/tracevar.rb +56 -0
  52. data/lib/byebug/commands/undisplay.rb +8 -4
  53. data/lib/byebug/commands/untracevar.rb +38 -0
  54. data/lib/byebug/commands/var.rb +107 -0
  55. data/lib/byebug/context.rb +78 -42
  56. data/lib/byebug/core.rb +78 -40
  57. data/lib/byebug/helper.rb +58 -42
  58. data/lib/byebug/history.rb +12 -1
  59. data/lib/byebug/interface.rb +91 -11
  60. data/lib/byebug/interfaces/local_interface.rb +12 -19
  61. data/lib/byebug/interfaces/remote_interface.rb +12 -15
  62. data/lib/byebug/interfaces/script_interface.rb +14 -18
  63. data/lib/byebug/interfaces/test_interface.rb +54 -0
  64. data/lib/byebug/printers/base.rb +64 -0
  65. data/lib/byebug/printers/plain.rb +53 -0
  66. data/lib/byebug/processor.rb +20 -1
  67. data/lib/byebug/processors/command_processor.rb +57 -172
  68. data/lib/byebug/processors/control_command_processor.rb +16 -43
  69. data/lib/byebug/remote.rb +13 -7
  70. data/lib/byebug/runner.rb +102 -54
  71. data/lib/byebug/setting.rb +45 -68
  72. data/lib/byebug/settings/autoeval.rb +2 -0
  73. data/lib/byebug/settings/autoirb.rb +3 -0
  74. data/lib/byebug/settings/autolist.rb +3 -0
  75. data/lib/byebug/settings/autosave.rb +2 -0
  76. data/lib/byebug/settings/basename.rb +2 -0
  77. data/lib/byebug/settings/callstyle.rb +2 -0
  78. data/lib/byebug/settings/fullpath.rb +2 -0
  79. data/lib/byebug/settings/histfile.rb +2 -0
  80. data/lib/byebug/settings/histsize.rb +2 -0
  81. data/lib/byebug/settings/linetrace.rb +2 -0
  82. data/lib/byebug/settings/listsize.rb +2 -0
  83. data/lib/byebug/settings/post_mortem.rb +7 -2
  84. data/lib/byebug/settings/stack_on_error.rb +2 -0
  85. data/lib/byebug/settings/verbose.rb +2 -0
  86. data/lib/byebug/settings/width.rb +2 -0
  87. data/lib/byebug/state.rb +12 -0
  88. data/lib/byebug/states/control_state.rb +26 -0
  89. data/lib/byebug/states/regular_state.rb +178 -0
  90. data/lib/byebug/version.rb +1 -1
  91. metadata +24 -109
  92. data/lib/byebug/commands/catchpoint.rb +0 -53
  93. data/lib/byebug/commands/reload.rb +0 -29
  94. data/lib/byebug/commands/trace.rb +0 -50
  95. data/lib/byebug/commands/variables.rb +0 -206
  96. data/lib/byebug/options.rb +0 -46
  97. data/lib/byebug/settings/autoreload.rb +0 -12
  98. data/lib/byebug/settings/forcestep.rb +0 -14
  99. data/lib/byebug/settings/testing.rb +0 -12
  100. data/lib/byebug/settings/tracing_plus.rb +0 -11
  101. data/test/commands/break_test.rb +0 -364
  102. data/test/commands/condition_test.rb +0 -85
  103. data/test/commands/continue_test.rb +0 -47
  104. data/test/commands/delete_test.rb +0 -26
  105. data/test/commands/display_test.rb +0 -37
  106. data/test/commands/edit_test.rb +0 -52
  107. data/test/commands/eval_test.rb +0 -89
  108. data/test/commands/finish_test.rb +0 -74
  109. data/test/commands/frame_test.rb +0 -223
  110. data/test/commands/help_test.rb +0 -66
  111. data/test/commands/history_test.rb +0 -61
  112. data/test/commands/info_test.rb +0 -238
  113. data/test/commands/interrupt_test.rb +0 -45
  114. data/test/commands/irb_test.rb +0 -28
  115. data/test/commands/kill_test.rb +0 -50
  116. data/test/commands/list_test.rb +0 -174
  117. data/test/commands/method_test.rb +0 -52
  118. data/test/commands/post_mortem_test.rb +0 -71
  119. data/test/commands/pry_test.rb +0 -26
  120. data/test/commands/quit_test.rb +0 -53
  121. data/test/commands/reload_test.rb +0 -39
  122. data/test/commands/restart_test.rb +0 -46
  123. data/test/commands/save_test.rb +0 -67
  124. data/test/commands/set_test.rb +0 -140
  125. data/test/commands/show_test.rb +0 -76
  126. data/test/commands/source_test.rb +0 -46
  127. data/test/commands/stepping_test.rb +0 -192
  128. data/test/commands/thread_test.rb +0 -164
  129. data/test/commands/trace_test.rb +0 -71
  130. data/test/commands/undisplay_test.rb +0 -75
  131. data/test/commands/variables_test.rb +0 -105
  132. data/test/debugger_alias_test.rb +0 -7
  133. data/test/runner_test.rb +0 -150
  134. data/test/support/matchers.rb +0 -65
  135. data/test/support/test_interface.rb +0 -59
  136. data/test/support/utils.rb +0 -122
  137. data/test/test_helper.rb +0 -58
@@ -1,66 +0,0 @@
1
- module Byebug
2
- class HelpTestCase < TestCase
3
- include Columnize
4
-
5
- def setup
6
- @example = -> do
7
- byebug
8
- end
9
-
10
- super
11
- end
12
-
13
- def available_cmds
14
- @available_cmds ||= Command.commands.map(&:names).flatten.uniq.sort
15
- end
16
-
17
- %w(help h).each do |cmd_alias|
18
- define_method(:"test_#{cmd_alias}_shows_help_for_help_command_itself") do
19
- enter 'set width 50', cmd_alias
20
- debug_proc(@example)
21
- check_output_includes \
22
- 'Type "help <command-name>" for help on a specific command',
23
- 'Available commands:', columnize(available_cmds, 50)
24
- end
25
- end
26
-
27
- def test_help_with_specific_command_shows_help_for_it
28
- enter 'help break'
29
- debug_proc(@example)
30
- check_output_includes \
31
- "b[reak] file:line [if expr]\n" \
32
- "b[reak] class(.|#)method [if expr]\n\n" \
33
- "Set breakpoint to some position, (optionally) if expr == true\n"
34
- end
35
-
36
- def test_help_with_undefined_command_shows_an_error
37
- enter 'help foobar'
38
- debug_proc(@example)
39
- check_error_includes 'Undefined command: "foobar". Try "help"'
40
- end
41
-
42
- def test_help_with_command_and_subcommand_shows_subcommands_help
43
- enter 'help info breakpoints'
44
- debug_proc(@example)
45
- check_output_includes(/Status of user-settable breakpoints/)
46
- end
47
-
48
- def test_help_set_shows_help_for_set_command
49
- enter 'help set'
50
- debug_proc(@example)
51
- check_output_includes(/Modifies parts of byebug environment/)
52
- end
53
-
54
- def test_help_set_plus_a_setting_shows_help_for_that_setting
55
- enter 'help set width'
56
- debug_proc(@example)
57
- check_output_includes(/Number of characters per line in byebug's output/)
58
- end
59
-
60
- def test_help_show_shows_help_for_show_command
61
- enter 'help show'
62
- debug_proc(@example)
63
- check_output_includes(/Generic command for showing byebug settings/)
64
- end
65
- end
66
- end
@@ -1,61 +0,0 @@
1
- module Byebug
2
- class HistoryTestCase < TestCase
3
- def setup
4
- @example = -> do
5
- byebug
6
- a = 2
7
- a = 3
8
- end
9
-
10
- super
11
- end
12
-
13
- def test_history_displays_latest_records_from_readline_history
14
- enter 'show', 'history'
15
- debug_proc(@example)
16
- check_output_includes("1 show\n 2 history")
17
- end
18
-
19
- def test_history_n_displays_whole_history_if_n_is_bigger_than_history_size
20
- enter 'show', 'history 3'
21
- debug_proc(@example)
22
-
23
- check_output_includes("1 show\n 2 history 3")
24
- end
25
-
26
- def test_history_n_displays_lastest_n_records_from_readline_history
27
- enter 'show width', 'show autolist', 'history 2'
28
- debug_proc(@example)
29
-
30
- check_output_includes("2 show autolist\n 3 history 2")
31
- end
32
-
33
- def test_history_does_not_save_empty_commands
34
- enter 'show', 'show width', '', 'history 3'
35
- debug_proc(@example)
36
-
37
- check_output_includes("1 show\n 2 show width\n 3 history 3")
38
- end
39
-
40
- def test_history_does_not_save_duplicated_consecutive_commands
41
- enter 'show', 'show width', 'show width', 'history 3'
42
- debug_proc(@example)
43
-
44
- check_output_includes("1 show\n 2 show width\n 3 history 3")
45
- end
46
-
47
- def test_cmds_from_previous_repls_are_remembered_if_autosave_enabled
48
- enter 'set autosave', 'next', 'history 2'
49
- debug_proc(@example)
50
-
51
- check_output_includes("2 next\n 3 history 2")
52
- end
53
-
54
- def test_cmds_from_previous_repls_are_not_remembered_if_autosave_disabled
55
- enter 'set noautosave', 'next', 'history 2'
56
- debug_proc(@example)
57
-
58
- check_output_includes("1 history 2")
59
- end
60
- end
61
- end
@@ -1,238 +0,0 @@
1
- module Byebug
2
- class InfoExample
3
- def initialize
4
- @foo = 'bar'
5
- @bla = 'blabla'
6
- end
7
-
8
- def a(y, z)
9
- w = '1' * 45
10
- x = 2
11
- w + x.to_s + y + z + @foo
12
- end
13
-
14
- def c
15
- a = BasicObject.new
16
- a
17
- end
18
-
19
- def b
20
- a('a', 'b')
21
- e = "%.2f"
22
- e
23
- end
24
-
25
- def d
26
- raise 'bang'
27
- rescue
28
- end
29
- end
30
-
31
- class InfoTestCase < TestCase
32
- include Columnize
33
-
34
- def setup
35
- @example = -> do
36
- byebug
37
- i = InfoExample.new
38
- i.b
39
- i.c
40
- i.d
41
- end
42
-
43
- super
44
- end
45
-
46
- def test_info_about_all_args
47
- enter 'break 11', 'cont', 'info args'
48
- debug_proc(@example)
49
- check_output_includes 'y = "a"', 'z = "b"'
50
- end
51
-
52
- def test_info_about_all_breakpoints
53
- enter 'break 38', 'break 39 if y == z', 'info breakpoints'
54
- debug_proc(@example)
55
- check_output_includes 'Num Enb What',
56
- /\d+ +y at #{__FILE__}:38/,
57
- /\d+ +y at #{__FILE__}:39 if y == z/
58
- end
59
-
60
- def test_info_about_specific_breakpoints
61
- enter 'b 38', 'b 39', -> { "info breakpoints #{Breakpoint.first.id}" }
62
- debug_proc(@example)
63
- check_output_includes 'Num Enb What', /\d+ +y at #{__FILE__}:38/
64
- check_output_doesnt_include(/\d+ +y at #{__FILE__}:39/)
65
- end
66
-
67
- def test_info_breakpoints_shows_a_message_when_no_breakpoints_found
68
- enter 'info breakpoints'
69
- debug_proc(@example)
70
- check_output_includes 'No breakpoints.'
71
- end
72
-
73
- def test_info_breakpoints_shows_error_if_specific_breakpoint_do_not_exist
74
- enter 'break 38', 'info breakpoints 100'
75
- debug_proc(@example)
76
- check_error_includes 'No breakpoints found among list given'
77
- end
78
-
79
- def test_info_breakpoints_shows_hit_counts
80
- enter 'break 39', 'cont', 'info breakpoints'
81
- debug_proc(@example)
82
- check_output_includes(
83
- /\d+ +y at #{__FILE__}:39/, 'breakpoint already hit 1 time')
84
- end
85
-
86
- def test_info_display_shows_all_display_expressions
87
- enter 'display 3 + 3', 'display a + b', 'info display'
88
- debug_proc(@example)
89
- check_output_includes "Auto-display expressions now in effect:",
90
- 'Num Enb Expression',
91
- '1: y 3 + 3',
92
- '2: y a + b'
93
- end
94
-
95
- def test_info_display_shows_a_message_when_no_display_expressions_found
96
- enter 'info display'
97
- debug_proc(@example)
98
- check_output_includes 'There are no auto-display expressions now.'
99
- end
100
-
101
- def files
102
- @files ||= SCRIPT_LINES__.keys.uniq.sort
103
- end
104
-
105
- %w(file files).each do |subcmd_alias|
106
- define_method(:"test_info_#{subcmd_alias}_shows_all_files_read_in") do
107
- enter 'list' # list command explicitly reloads current file into cache
108
- enter "info #{subcmd_alias}"
109
- debug_proc(@example)
110
- check_output_includes "File #{__FILE__}", File.stat(__FILE__).mtime.to_s
111
- end
112
- end
113
-
114
- def filename
115
- @filename ||= "File #{__FILE__}"
116
- end
117
-
118
- def lines
119
- @lines ||= "#{File.foreach(__FILE__).count} lines"
120
- end
121
-
122
- def mtime
123
- @mtime ||= File.stat(__FILE__).mtime.to_s
124
- end
125
-
126
- def sha1
127
- @sha1 ||= Digest::SHA1.hexdigest(__FILE__)
128
- end
129
-
130
- def breakpoint_line_numbers
131
- @breakpoint_line_numbers ||=
132
- columnize(LineCache.trace_line_numbers(__FILE__).to_a.sort,
133
- Byebug::Setting[:width])
134
- end
135
-
136
- def test_info_file_basic_shows_basic_info_about_a_specific_file
137
- enter "info file #{__FILE__} basic"
138
- debug_proc(@example)
139
- check_output_includes filename, lines
140
- check_output_doesnt_include breakpoint_line_numbers, mtime, sha1
141
- end
142
-
143
- def test_info_file_lines_shows_number_of_lines_in_a_specific_file
144
- enter "info file #{__FILE__} lines"
145
- debug_proc(@example)
146
- check_output_includes filename, lines
147
- check_output_doesnt_include breakpoint_line_numbers, mtime, sha1
148
- end
149
-
150
- def test_info_file_mtime_shows_mtime_of_a_specific_file
151
- enter "info file #{__FILE__} mtime"
152
- debug_proc(@example)
153
- check_output_includes filename, mtime
154
- check_output_doesnt_include lines, breakpoint_line_numbers, sha1
155
- end
156
-
157
- def test_info_file_sha1_shows_sha1_signature_of_a_specific_file
158
- enter "info file #{__FILE__} sha1"
159
- debug_proc(@example)
160
- check_output_includes filename, sha1
161
- check_output_doesnt_include lines, breakpoint_line_numbers, mtime
162
- end
163
-
164
- def test_info_file_breakpoints_shows_breakpoints_in_a_specific_file
165
- enter 'break 38', 'break 39', "info file #{__FILE__} breakpoints"
166
- debug_proc(@example)
167
- check_output_includes(
168
- /Created breakpoint \d+ at #{__FILE__}:38/,
169
- /Created breakpoint \d+ at #{__FILE__}:39/,
170
- filename,
171
- 'breakpoint line numbers:', breakpoint_line_numbers)
172
- check_output_doesnt_include lines, mtime, sha1
173
- end
174
-
175
- def test_info_file_all_shows_all_available_info_about_a_specific_file
176
- enter "info file #{__FILE__} all"
177
- debug_proc(@example)
178
- check_output_includes \
179
- filename, lines, breakpoint_line_numbers, mtime, sha1
180
- end
181
-
182
- def test_info_file_does_not_show_any_info_if_parameter_is_invalid
183
- enter "info file #{__FILE__} blabla"
184
- debug_proc(@example)
185
- check_error_includes 'Invalid parameter blabla'
186
- end
187
-
188
- def test_info_line_shows_info_about_the_current_line
189
- enter 'break 11', 'cont', 'info line'
190
- debug_proc(@example)
191
- check_output_includes "Line 11 of \"#{__FILE__}\""
192
- end
193
-
194
- def test_info_program_shows_the_initial_stop_reason
195
- enter 'info program'
196
- debug_proc(@example)
197
- check_output_includes \
198
- "It stopped after stepping, next'ing or initial start."
199
- end
200
-
201
- def test_info_program_shows_the_step_stop_reason
202
- enter 'step', 'info program'
203
- debug_proc(@example)
204
- check_output_includes \
205
- 'Program stopped.',
206
- "It stopped after stepping, next'ing or initial start."
207
- end
208
-
209
- def test_info_program_shows_the_breakpoint_stop_reason
210
- enter 'break 38', 'cont', 'info program'
211
- debug_proc(@example)
212
- check_output_includes 'Program stopped.', 'It stopped at a breakpoint.'
213
- end
214
-
215
- def test_info_program_shows_the_catchpoint_stop_reason
216
- enter 'catch Exception', 'cont', 'info program'
217
- debug_proc(@example)
218
- check_output_includes 'Program stopped.', 'It stopped at a catchpoint.'
219
- end
220
-
221
- def test_info_program_shows_the_unknown_stop_reason
222
- enter 'break 39', 'cont',
223
- ->{ context.stubs(:stop_reason).returns('blabla'); 'info program' }
224
- debug_proc(@example)
225
- check_output_includes 'Program stopped.', 'Unknown reason: blabla'
226
- end
227
-
228
- def test_shows_an_error_if_the_program_is_crashed
229
- skip('TODO')
230
- end
231
-
232
- def test_shows_help_when_typing_just_info
233
- enter 'info', 'cont'
234
- debug_proc(@example)
235
- check_output_includes(/List of "info" subcommands:/)
236
- end
237
- end
238
- end
@@ -1,45 +0,0 @@
1
- module Byebug
2
- class InterruptExample
3
- def self.a(num)
4
- num += 2
5
- b(num)
6
- end
7
-
8
- def self.b(num)
9
- v2 = 5 if 1 == num ; [1, 2, v2].map { |a| a.to_f }
10
- c(num)
11
- end
12
-
13
- def self.c(num)
14
- num += 4
15
- num
16
- end
17
- end
18
-
19
- class InterruptTestCase < TestCase
20
- def setup
21
- @example = -> do
22
- byebug
23
- ex = InterruptExample.a(7)
24
- 2.times do
25
- ex += 1
26
- end
27
- InterruptExample.b(ex)
28
- end
29
-
30
- super
31
- end
32
-
33
- def test_interrupt_stops_at_the_next_statement
34
- enter 'interrupt', 'continue'
35
- debug_proc(@example) do
36
- assert_equal [__FILE__, 4], [state.file, state.line]
37
- end
38
- end
39
-
40
- def test_interrupt_steps_into_blocks
41
- enter 'break 24', 'cont', 'interrupt', 'cont'
42
- debug_proc(@example) { assert_equal 25, state.line }
43
- end
44
- end
45
- end
@@ -1,28 +0,0 @@
1
- module Byebug
2
- class IrbTestCase < TestCase
3
- def setup
4
- @example = -> do
5
- byebug
6
- a = 2
7
- a = 3
8
- a = 4
9
- end
10
-
11
- super
12
-
13
- interface.stubs(:kind_of?).with(LocalInterface).returns(true)
14
- end
15
-
16
- def test_irb_command_starts_an_irb_session
17
- IrbCommand.any_instance.expects(:execute)
18
- enter 'irb'
19
- debug_proc(@example)
20
- end
21
-
22
- def test_autoirb_calls_irb_automatically_after_every_stop
23
- IrbCommand.any_instance.expects(:execute)
24
- enter 'set autoirb', 'break 8', 'cont'
25
- debug_proc(@example)
26
- end
27
- end
28
- end
@@ -1,50 +0,0 @@
1
- module Byebug
2
- class KillExample
3
- def self.kill_me
4
- 'dieeee'
5
- end
6
- end
7
-
8
- class KillTestCase < TestCase
9
- def setup
10
- @example = -> do
11
- byebug
12
- KillExample.kill_me
13
- end
14
-
15
- super
16
- end
17
-
18
- def test_kill_sends_signal_to_some_pid
19
- Process.expects(:kill).with('USR1', Process.pid)
20
- enter 'kill USR1'
21
- debug_proc(@example)
22
- end
23
-
24
- def test_kill_closes_interface_when_sending_KILL_signal_explicitly
25
- Process.stubs(:kill).with('KILL', Process.pid)
26
- interface.expects(:close)
27
- enter 'kill KILL'
28
- debug_proc(@example)
29
- end
30
-
31
- def test_kill_asks_confirmation_when_sending_kill_implicitly
32
- Process.expects(:kill).with('KILL', Process.pid)
33
- enter 'kill', 'y'
34
- debug_proc(@example)
35
- check_confirm_includes 'Really kill? (y/n)'
36
- end
37
-
38
- def test_kill_does_not_send_an_unknown_signal
39
- Process.expects(:kill).with('BLA', Process.pid).never
40
- enter 'kill BLA'
41
- debug_proc(@example)
42
- end
43
-
44
- def test_kill_shows_an_error_when_the_signal_in_unknown
45
- enter 'kill BLA'
46
- debug_proc(@example)
47
- check_error_includes 'signal name BLA is not a signal I know about'
48
- end
49
- end
50
- end