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,174 +0,0 @@
1
- module Byebug
2
- class ListTestCase < TestCase
3
- def setup
4
- @example = -> do
5
- byebug
6
- a = 6
7
- a = 7
8
- a = 8
9
- a = 9
10
- a = 10
11
- a = 11
12
- a = 12
13
- a = 13
14
- a = 14
15
- a = 15
16
- a = 16
17
- a = 17
18
- a = 18
19
- a = 19
20
- a = 20
21
- a = 21
22
- a = 22
23
- a = 23
24
- a = 24
25
- a = 25
26
- a = '%26'
27
- end
28
-
29
- super
30
- end
31
-
32
- def test_lists_source_code_lines
33
- Setting[:listsize] = 10
34
- enter 'list'
35
- debug_proc(@example)
36
- check_output_includes "[1, 10] in #{__FILE__}"
37
- end
38
-
39
- def test_listsize_is_not_set_if_parameter_is_not_an_integer
40
- enter 'set listsize 15.0', 'list'
41
- debug_proc(@example)
42
- check_output_doesnt_include "[1, 15] in #{__FILE__}"
43
- end
44
-
45
- def test_moves_range_up_when_it_goes_before_beginning_of_file
46
- Setting[:listsize] = 12
47
- enter 'list'
48
- debug_proc(@example)
49
- check_output_includes "[1, 12] in #{__FILE__}"
50
- end
51
-
52
- def test_does_not_list_after_the_end_of_file
53
- n_lines = %x{wc -l #{__FILE__}}.split.first.to_i
54
- enter 'break 18', 'cont', "list #{n_lines-3}-#{n_lines+6}"
55
- debug_proc(@example)
56
- check_output_includes "[#{n_lines-3}, #{n_lines}] in #{__FILE__}"
57
- end
58
-
59
- def test_lists_the_whole_file_if_number_of_lines_is_smaller_than_listsize
60
- Setting[:listsize] = 1000
61
- n_lines = %x{wc -l #{__FILE__}}.split.first.to_i
62
- enter 'list'
63
- debug_proc(@example)
64
- check_output_includes "[1, #{n_lines}] in #{__FILE__}"
65
- end
66
-
67
- def test_lists_surrounding_lines_after_the_first_call_to_list
68
- enter 'break 8', 'cont', 'list'
69
- debug_proc(@example)
70
- check_output_includes "[3, 12] in #{__FILE__}"
71
- end
72
-
73
- def test_lists_forwards_after_the_second_call_to_list
74
- enter 'break 8', 'cont', 'list', 'list'
75
- debug_proc(@example)
76
- check_output_includes "[13, 22] in #{__FILE__}"
77
- end
78
-
79
- def test_lists_surrounding_lines_after_the_first_call_to_list_minus
80
- enter 'break 18', 'cont', 'list -'
81
- debug_proc(@example)
82
- check_output_includes "[13, 22] in #{__FILE__}"
83
- end
84
-
85
- def test_lists_backwards_after_the_second_call_to_list_minus
86
- enter 'break 18', 'cont', 'list -', 'list -'
87
- debug_proc(@example)
88
- check_output_includes "[3, 12] in #{__FILE__}"
89
- end
90
-
91
- def test_lists_backwards_from_end_of_file
92
- n_lines = %x{wc -l #{__FILE__}}.split.first.to_i
93
- enter 'break 18', 'cont', "list #{n_lines-9}-#{n_lines}", 'list -'
94
- debug_proc(@example)
95
- check_output_includes "[#{n_lines-19}, #{n_lines-10}] in #{__FILE__}"
96
- end
97
-
98
- def test_lists_surrounding_lines_when_list_equals_is_called
99
- enter 'break 8', 'cont', 'list ='
100
- debug_proc(@example)
101
- check_output_includes "[3, 12] in #{__FILE__}"
102
- end
103
-
104
- def test_lists_specific_range_when_requested_in_hyphen_format
105
- enter 'list 7-9'
106
- debug_proc(@example)
107
- check_output_includes "[7, 9] in #{__FILE__}"
108
- end
109
-
110
- def test_lists_specific_range_when_requested_in_comma_format
111
- enter 'list 7,9'
112
- debug_proc(@example)
113
- check_output_includes "[7, 9] in #{__FILE__}"
114
- end
115
-
116
- def test_lists_nothing_if_unexistent_range_is_specified
117
- enter 'list 500,505'
118
- debug_proc(@example)
119
- check_error_includes 'Invalid line range'
120
- check_output_doesnt_include "[500, 505] in #{__FILE__}"
121
- end
122
-
123
- def test_lists_nothing_if_invalid_range_is_specified
124
- enter 'list 5,4'
125
- debug_proc(@example)
126
- check_error_includes 'Invalid line range'
127
- check_output_doesnt_include "[5, 4] in #{__FILE__}"
128
- end
129
-
130
- def test_list_proper_lines_when_range_around_specific_line_with_hyphen
131
- enter 'list 17-'
132
- debug_proc(@example)
133
- check_output_includes "[12, 21] in #{__FILE__}"
134
- end
135
-
136
- def test_list_proper_lines_when_range_around_specific_line_with_comma
137
- enter 'list 17,'
138
- debug_proc(@example)
139
- check_output_includes "[12, 21] in #{__FILE__}"
140
- end
141
-
142
- def test_shows_an_error_when_the_file_to_list_does_not_exist
143
- enter -> { state.file = 'blabla'; 'list 7-7' }
144
- debug_proc(@example)
145
- check_error_includes 'No sourcefile available for blabla'
146
- end
147
-
148
- def test_correctly_print_lines_containing_the_percentage_symbol
149
- enter 'list 26'
150
- debug_proc(@example)
151
- check_output_includes "26: a = '%26'"
152
- end
153
-
154
- def test_lists_file_changes_by_default
155
- enter 'list', -> do
156
- change_line_in_file(__FILE__, 7, ' a = 100')
157
- 'list 7-7'
158
- end
159
- debug_proc(@example)
160
- check_output_includes(/7:\s+a = 100/)
161
- change_line_in_file(__FILE__, 7, ' a = 7')
162
- end
163
-
164
- def test_does_not_list_file_changes_with_autoreload_disabled
165
- enter 'set noautoreload', 'list', -> do
166
- change_line_in_file(__FILE__, 7, ' a = 100')
167
- 'list 7-7'
168
- end, 'set autoreload'
169
- debug_proc(@example)
170
- check_output_doesnt_include(/7:\s+a = 100/)
171
- change_line_in_file(__FILE__, 7, ' a = 7')
172
- end
173
- end
174
- end
@@ -1,52 +0,0 @@
1
- module Byebug
2
- class MethodExample
3
- def initialize
4
- @a = 'b'
5
- @c = 'd'
6
- end
7
-
8
- def self.foo
9
- 'asdf'
10
- end
11
-
12
- def bla
13
- 'asdf'
14
- end
15
- end
16
-
17
- class MethodTestCase < TestCase
18
- def setup
19
- @example = -> do
20
- byebug
21
- a = MethodExample.new
22
- a.bla
23
- end
24
-
25
- super
26
- end
27
-
28
- %w(method m).each do |cmd_alias|
29
- define_method(:"test_#{cmd_alias}_shows_instance_methods_of_a_class") do
30
- enter 'break 4', 'cont', "#{cmd_alias} MethodExample"
31
- debug_proc(@example)
32
- check_output_includes(/bla/)
33
- check_output_doesnt_include(/foo/)
34
- end
35
- end
36
-
37
- def test_m_shows_an_error_if_specified_object_is_not_a_class_or_module
38
- enter 'm a'
39
- debug_proc(@example)
40
- check_output_includes 'Should be Class/Module: a'
41
- end
42
-
43
- ['method instance', 'm i'].each do |cmd_alias|
44
- define_method(:"test_#{cmd_alias}_shows_methods_of_object") do
45
- enter 'break 22', 'cont', "#{cmd_alias} a"
46
- debug_proc(@example)
47
- check_output_includes(/bla/)
48
- check_output_doesnt_include(/foo/)
49
- end
50
- end
51
- end
52
- end
@@ -1,71 +0,0 @@
1
- module Byebug
2
- class PostMortemExample
3
- def a
4
- z = 4
5
- raise 'blabla'
6
- x = 6
7
- x + z
8
- end
9
- end
10
-
11
- class PostMortemTestCase < TestCase
12
- def setup
13
- @example = -> do
14
- byebug
15
- c = PostMortemExample.new
16
- c.a
17
- end
18
-
19
- super
20
- end
21
-
22
- def test_rises_before_exit_in_post_mortem_mode
23
- enter 'set post_mortem', 'cont', 'set nopost_mortem'
24
- assert_raises(RuntimeError) do
25
- debug_proc(@example)
26
- end
27
- end
28
-
29
- def test_post_mortem_mode_sets_post_mortem_flag_to_true
30
- enter 'set post_mortem', 'cont', 'set nopost_mortem'
31
- begin
32
- debug_proc(@example)
33
- rescue
34
- assert_equal true, Byebug.post_mortem?
35
- end
36
- end
37
-
38
- def test_execution_is_stop_at_the_correct_line_after_exception
39
- enter 'set post_mortem', 'cont', 'set nopost_mortem'
40
- begin
41
- debug_proc(@example)
42
- rescue
43
- assert_equal 5, Byebug.raised_exception.__bb_line
44
- end
45
- end
46
-
47
- %w(step next finish break condition display reload).each do |cmd|
48
- define_method "test_#{cmd}_is_forbidden_in_post_mortem_mode" do
49
- enter 'set noautoeval', 'set post_mortem', "#{cmd}", 'set no_postmortem'
50
- Context.any_instance.stubs(:dead?).returns(:true)
51
- begin
52
- debug_proc(@example)
53
- rescue RuntimeError
54
- check_error_includes 'Command unavailable in post mortem mode.'
55
- end
56
- end
57
- end
58
-
59
- ['restart', 'frame', 'quit', 'edit', 'info', 'irb', 'source', 'help',
60
- 'var class', 'list', 'method', 'kill', 'eval', 'set', 'save', 'show',
61
- 'trace', 'thread list'].each do |cmd|
62
- define_method "test_#{cmd}_is_permitted_in_post_mortem_mode" do
63
- enter 'set post_mortem', "#{cmd}", 'set no_postmortem'
64
- class_name = cmd.gsub(/(^| )\w/) { |b| b[-1,1].upcase } + 'Command'
65
-
66
- Byebug.const_get(class_name).any_instance.stubs(:execute)
67
- assert_raises(RuntimeError) { debug_proc(@example) }
68
- end
69
- end
70
- end
71
- end
@@ -1,26 +0,0 @@
1
- module Byebug
2
- class PryTestCase < 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_pry_command_starts_a_pry_session
17
- PryCommand.any_instance.expects(:execute)
18
- enter 'pry'
19
- debug_proc(@example)
20
- end
21
-
22
- def test_autopry_calls_pry_automatically_after_every_stop
23
- skip 'TODO'
24
- end
25
- end
26
- end if defined?(Pry)
@@ -1,53 +0,0 @@
1
- module Byebug
2
- class QuitTestCase < TestCase
3
- def setup
4
- @example = -> do
5
- byebug
6
- Object.new
7
- end
8
-
9
- super
10
- end
11
-
12
- def test_finishes_byebug_if_user_confirms
13
- QuitCommand.any_instance.expects(:exit!)
14
- enter 'quit', 'y'
15
- debug_proc(@example)
16
- check_confirm_includes 'Really quit? (y/n)'
17
- end
18
-
19
- def test_does_not_quit_if_user_did_not_confirm
20
- QuitCommand.any_instance.expects(:exit!).never
21
- enter 'quit', 'n'
22
- debug_proc(@example)
23
- check_confirm_includes 'Really quit? (y/n)'
24
- end
25
-
26
- def test_quits_inmediately_if_used_with_bang
27
- QuitCommand.any_instance.expects(:exit!)
28
- enter 'quit!'
29
- debug_proc(@example)
30
- check_confirm_doesnt_include 'Really quit? (y/n)'
31
- end
32
-
33
- def test_quits_inmediately_if_used_with_unconditionally
34
- QuitCommand.any_instance.expects(:exit!)
35
- enter 'quit unconditionally'
36
- debug_proc(@example)
37
- check_confirm_doesnt_include 'Really quit? (y/n)'
38
- end
39
-
40
- def test_closes_interface_before_quitting
41
- QuitCommand.any_instance.stubs(:exit!)
42
- interface.expects(:close)
43
- enter 'quit!'
44
- debug_proc(@example)
45
- end
46
-
47
- def test_quits_if_used_with_exit_alias
48
- QuitCommand.any_instance.expects(:exit!)
49
- enter 'exit!'
50
- debug_proc(@example)
51
- end
52
- end
53
- end
@@ -1,39 +0,0 @@
1
- module Byebug
2
- class ReloadTestCase < TestCase
3
- def setup
4
- @example = -> do
5
- byebug
6
- a = 6
7
- a = 7
8
- a = 8
9
- a = 9
10
- a = 10
11
- end
12
-
13
- super
14
- end
15
-
16
- def test_reload_notifies_about_default_setting
17
- enter 'reload'
18
- debug_proc(@example)
19
- check_output_includes \
20
- 'Source code was reloaded. Automatic reloading is on'
21
- end
22
-
23
- def test_reload_notifies_that_automatic_reloading_is_off_is_setting_changed
24
- enter 'set noautoreload', 'reload'
25
- debug_proc(@example)
26
- check_output_includes \
27
- 'Source code was reloaded. Automatic reloading is off'
28
- end
29
-
30
- def test_reload_properly_reloads_source_code
31
- enter 'break 7', 'cont', 'l 8-8',
32
- -> { change_line_in_file(__FILE__, 8, ' a = 100'); 'reload' },
33
- 'l 8-8'
34
- debug_proc(@example)
35
- check_output_includes '8: a = 100'
36
- change_line_in_file(__FILE__, 8, ' a = 8')
37
- end
38
- end
39
- end
@@ -1,46 +0,0 @@
1
- module Byebug
2
- class RestartExample
3
- def concat_args(a, b, c)
4
- a.to_s + b.to_s + c.to_s
5
- end
6
- end
7
-
8
- class RestartTestCase < TestCase
9
- def setup
10
- @example = -> do
11
- byebug
12
- a = ARGV[0]
13
- b = ARGV[1]
14
- c = ARGV[2]
15
- RestartExample.new.concat_args(a, b, c)
16
- end
17
-
18
- super
19
- end
20
-
21
- def must_restart(cmd = nil)
22
- expectation = RestartCommand.any_instance.expects(:exec)
23
- expectation = expectation.with(cmd) if cmd
24
- end
25
-
26
- def test_restarts_with_manual_arguments
27
- cmd = "ruby -rbyebug -I#{$LOAD_PATH.join(' -I')} test/test_helper.rb 1 2"
28
- must_restart(cmd)
29
-
30
- enter 'restart 1 2'
31
- debug_proc(@example)
32
- check_output_includes "Re exec'ing:\n\t#{cmd}"
33
- end
34
-
35
- def test_still_restarts_shows_messages_when_attached_to_running_program
36
- must_restart
37
- enter 'restart'
38
-
39
- debug_proc(@example)
40
- check_output_includes 'Byebug was not called from the outset...'
41
- check_output_includes \
42
- "Program #{Byebug.debugged_program} not executable... " \
43
- "Wrapping it in a ruby call"
44
- end
45
- end
46
- end