byebug 2.3.1 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +3 -11
- data/Rakefile +10 -3
- data/bin/byebug +16 -2
- data/byebug.gemspec +1 -0
- data/ext/byebug/byebug.c +0 -54
- data/ext/byebug/byebug.h +3 -4
- data/ext/byebug/extconf.rb +1 -1
- data/lib/byebug.rb +15 -42
- data/lib/byebug/command.rb +12 -28
- data/lib/byebug/commands/breakpoints.rb +2 -0
- data/lib/byebug/commands/catchpoint.rb +1 -1
- data/lib/byebug/commands/condition.rb +1 -0
- data/lib/byebug/commands/display.rb +6 -0
- data/lib/byebug/commands/frame.rb +10 -3
- data/lib/byebug/commands/info.rb +5 -3
- data/lib/byebug/commands/reload.rb +1 -0
- data/lib/byebug/commands/set.rb +5 -1
- data/lib/byebug/commands/threads.rb +5 -4
- data/lib/byebug/commands/trace.rb +5 -5
- data/lib/byebug/context.rb +3 -3
- data/lib/byebug/interface.rb +3 -187
- data/lib/byebug/interfaces/local_interface.rb +88 -0
- data/lib/byebug/interfaces/remote_interface.rb +55 -0
- data/lib/byebug/interfaces/script_interface.rb +45 -0
- data/lib/byebug/processor.rb +15 -13
- data/lib/byebug/version.rb +1 -1
- data/test/breakpoints_test.rb +23 -25
- data/test/conditions_test.rb +6 -8
- data/test/continue_test.rb +4 -6
- data/test/debugger_alias_test.rb +5 -0
- data/test/display_test.rb +9 -11
- data/test/edit_test.rb +0 -2
- data/test/eval_test.rb +1 -3
- data/test/finish_test.rb +12 -12
- data/test/frame_test.rb +38 -40
- data/test/help_test.rb +1 -3
- data/test/info_test.rb +12 -14
- data/test/kill_test.rb +0 -2
- data/test/list_test.rb +1 -3
- data/test/method_test.rb +0 -2
- data/test/post_mortem_test.rb +77 -96
- data/test/quit_test.rb +0 -2
- data/test/reload_test.rb +0 -2
- data/test/repl_test.rb +3 -5
- data/test/restart_test.rb +0 -2
- data/test/save_test.rb +1 -3
- data/test/set_test.rb +3 -5
- data/test/show_test.rb +0 -2
- data/test/source_test.rb +0 -2
- data/test/stepping_test.rb +17 -19
- data/test/support/test_dsl.rb +21 -13
- data/test/test_helper.rb +23 -1
- data/test/thread_test.rb +19 -21
- data/test/trace_test.rb +12 -14
- data/test/variables_test.rb +6 -6
- metadata +22 -3
data/test/edit_test.rb
CHANGED
data/test/eval_test.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
1
|
class EvalTest
|
4
2
|
def sum(a,b)
|
5
3
|
a + b
|
@@ -31,7 +29,7 @@ class TestEval < TestDsl::TestCase
|
|
31
29
|
|
32
30
|
it 'must work when inspect raises an exception' do
|
33
31
|
enter 'c 4', 'p @foo'
|
34
|
-
debug_file('eval') {
|
32
|
+
debug_file('eval') { state.line.must_equal 4 }
|
35
33
|
check_output_includes 'RuntimeError Exception: Broken'
|
36
34
|
end
|
37
35
|
|
data/test/finish_test.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
1
|
class FinishExample
|
4
2
|
def a
|
5
3
|
b
|
@@ -18,28 +16,30 @@ class FinishExample
|
|
18
16
|
end
|
19
17
|
|
20
18
|
class TestFinish < TestDsl::TestCase
|
19
|
+
before { enter "break #{__FILE__}:14", 'cont' }
|
20
|
+
|
21
21
|
it 'must stop at the next frame by default' do
|
22
|
-
enter
|
23
|
-
debug_file('finish') {
|
22
|
+
enter 'finish'
|
23
|
+
debug_file('finish') { state.line.must_equal 11 }
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'must stop at the #0 frame by default' do
|
27
|
-
enter
|
28
|
-
debug_file('finish') {
|
27
|
+
enter 'finish 0'
|
28
|
+
debug_file('finish') { state.line.must_equal 11 }
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'must stop at the specified frame' do
|
32
|
-
enter
|
33
|
-
debug_file('finish') {
|
32
|
+
enter 'finish 1'
|
33
|
+
debug_file('finish') { state.line.must_equal 7 }
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'must stop at the next frame if the current frame was changed' do
|
37
|
-
enter
|
38
|
-
debug_file('finish') {
|
37
|
+
enter 'up', 'finish'
|
38
|
+
debug_file('finish') { state.line.must_equal 7 }
|
39
39
|
end
|
40
40
|
|
41
41
|
describe 'not a number is specified for frame' do
|
42
|
-
before { enter
|
42
|
+
before { enter 'finish foo' }
|
43
43
|
|
44
44
|
it 'must show an error' do
|
45
45
|
debug_file('finish')
|
@@ -47,7 +47,7 @@ class TestFinish < TestDsl::TestCase
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'must be on the same line' do
|
50
|
-
debug_file('finish') {
|
50
|
+
debug_file('finish') { state.line.must_equal 14 }
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
data/test/frame_test.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
1
|
class FrameExample
|
4
2
|
def initialize(f)
|
5
3
|
@f = f
|
@@ -47,60 +45,60 @@ class TestFrame < TestDsl::TestCase
|
|
47
45
|
describe 'when byebug started at the beginning' do
|
48
46
|
before do
|
49
47
|
@tst_file = fullpath('frame')
|
50
|
-
enter "break #{__FILE__}:
|
48
|
+
enter "break #{__FILE__}:21", 'cont'
|
51
49
|
end
|
52
50
|
|
53
51
|
it 'must go up' do
|
54
52
|
enter 'up'
|
55
|
-
debug_file('frame') {
|
53
|
+
debug_file('frame') { state.line.must_equal 16 }
|
56
54
|
end
|
57
55
|
|
58
56
|
it 'must go up by specific number of frames' do
|
59
57
|
enter 'up 2'
|
60
|
-
debug_file('frame') {
|
58
|
+
debug_file('frame') { state.line.must_equal 11 }
|
61
59
|
end
|
62
60
|
|
63
61
|
it 'must go down' do
|
64
62
|
enter 'up', 'down'
|
65
|
-
debug_file('frame') {
|
63
|
+
debug_file('frame') { state.line.must_equal 21 }
|
66
64
|
end
|
67
65
|
|
68
66
|
it 'must go down by specific number of frames' do
|
69
67
|
enter 'up 3', 'down 2'
|
70
|
-
debug_file('frame') {
|
68
|
+
debug_file('frame') { state.line.must_equal 16 }
|
71
69
|
end
|
72
70
|
|
73
71
|
it 'must set frame' do
|
74
72
|
enter 'frame 2'
|
75
|
-
debug_file('frame') {
|
73
|
+
debug_file('frame') { state.line.must_equal 11 }
|
76
74
|
end
|
77
75
|
|
78
76
|
it 'must print current stack frame when without arguments' do
|
79
77
|
enter 'up', 'frame'
|
80
78
|
debug_file('frame')
|
81
|
-
check_output_includes(/#1 FrameExample\.c\s+at #{__FILE__}:
|
79
|
+
check_output_includes(/#1 FrameExample\.c\s+at #{__FILE__}:16/)
|
82
80
|
end
|
83
81
|
|
84
82
|
it 'must set frame to the first one' do
|
85
83
|
enter 'up', 'frame 0'
|
86
|
-
debug_file('frame') {
|
84
|
+
debug_file('frame') { state.line.must_equal 21 }
|
87
85
|
end
|
88
86
|
|
89
87
|
it 'must set frame to the last one' do
|
90
88
|
enter 'frame -1'
|
91
|
-
debug_file('frame') {
|
89
|
+
debug_file('frame') { File.basename(state.file).must_equal 'test_helper.rb' }
|
92
90
|
end
|
93
91
|
|
94
92
|
it 'must not set frame if the frame number is too low' do
|
95
93
|
enter 'down'
|
96
|
-
debug_file('frame') {
|
94
|
+
debug_file('frame') { state.line.must_equal 21 }
|
97
95
|
check_output_includes \
|
98
96
|
"Can't navigate beyond the newest frame", interface.error_queue
|
99
97
|
end
|
100
98
|
|
101
99
|
it 'must not set frame if the frame number is too high' do
|
102
100
|
enter 'up 100'
|
103
|
-
debug_file('frame') {
|
101
|
+
debug_file('frame') { state.line.must_equal 21 }
|
104
102
|
check_output_includes \
|
105
103
|
"Can't navigate beyond the oldest frame", interface.error_queue
|
106
104
|
end
|
@@ -113,9 +111,9 @@ class TestFrame < TestDsl::TestCase
|
|
113
111
|
enter 'where'
|
114
112
|
debug_file 'frame'
|
115
113
|
check_output_includes(
|
116
|
-
/--> #0 FrameExample\.d\(e#String\)\s+at #{__FILE__}:
|
117
|
-
/#1 FrameExample\.c\s+at #{__FILE__}:
|
118
|
-
/#2 FrameExample\.b\s+at #{__FILE__}:
|
114
|
+
/--> #0 FrameExample\.d\(e#String\)\s+at #{__FILE__}:21/,
|
115
|
+
/#1 FrameExample\.c\s+at #{__FILE__}:16/,
|
116
|
+
/#2 FrameExample\.b\s+at #{__FILE__}:11/)
|
119
117
|
end
|
120
118
|
end
|
121
119
|
|
@@ -126,10 +124,10 @@ class TestFrame < TestDsl::TestCase
|
|
126
124
|
enter 'where'
|
127
125
|
debug_file 'frame'
|
128
126
|
check_output_includes(
|
129
|
-
/--> #0 FrameExample\.d\(e#String\)\s+at #{shortpath(__FILE__)}:
|
130
|
-
/#1 FrameExample\.c\s+at #{shortpath(__FILE__)}:
|
131
|
-
/#2 FrameExample\.b\s+at #{shortpath(__FILE__)}:
|
132
|
-
/#3 FrameExample\.a\s+at #{shortpath(__FILE__)}:
|
127
|
+
/--> #0 FrameExample\.d\(e#String\)\s+at #{shortpath(__FILE__)}:21/,
|
128
|
+
/#1 FrameExample\.c\s+at #{shortpath(__FILE__)}:16/,
|
129
|
+
/#2 FrameExample\.b\s+at #{shortpath(__FILE__)}:11/,
|
130
|
+
/#3 FrameExample\.a\s+at #{shortpath(__FILE__)}:7/)
|
133
131
|
end
|
134
132
|
end
|
135
133
|
end
|
@@ -142,10 +140,10 @@ class TestFrame < TestDsl::TestCase
|
|
142
140
|
enter 'where'
|
143
141
|
debug_file 'frame'
|
144
142
|
check_output_includes(
|
145
|
-
/--> #0 FrameExample\.d\(e#String\)\s+at #{__FILE__}:
|
146
|
-
/#1 FrameExample\.c\s+at #{__FILE__}:
|
147
|
-
/#2 FrameExample\.b\s+at #{__FILE__}:
|
148
|
-
/#3 FrameExample\.a\s+at #{__FILE__}:
|
143
|
+
/--> #0 FrameExample\.d\(e#String\)\s+at #{__FILE__}:21/,
|
144
|
+
/#1 FrameExample\.c\s+at #{__FILE__}:16/,
|
145
|
+
/#2 FrameExample\.b\s+at #{__FILE__}:11/,
|
146
|
+
/#3 FrameExample\.a\s+at #{__FILE__}:7/)
|
149
147
|
end
|
150
148
|
end
|
151
149
|
|
@@ -155,40 +153,40 @@ class TestFrame < TestDsl::TestCase
|
|
155
153
|
it 'displays current backtrace with callstyle "short"' do
|
156
154
|
enter 'where'
|
157
155
|
debug_file 'frame'
|
158
|
-
check_output_includes(/--> #0 d\(e\)\s+at #{__FILE__}:
|
159
|
-
/#1 c\s+at #{__FILE__}:
|
160
|
-
/#2 b\s+at #{__FILE__}:
|
161
|
-
/#3 a\s+at #{__FILE__}:
|
156
|
+
check_output_includes(/--> #0 d\(e\)\s+at #{__FILE__}:21/,
|
157
|
+
/#1 c\s+at #{__FILE__}:16/,
|
158
|
+
/#2 b\s+at #{__FILE__}:11/,
|
159
|
+
/#3 a\s+at #{__FILE__}:7/)
|
162
160
|
end
|
163
161
|
end
|
164
162
|
end
|
165
163
|
end
|
166
164
|
|
167
165
|
describe 'when byebug is started deep in the callstack' do
|
168
|
-
before { enter "break #{__FILE__}:
|
166
|
+
before { enter "break #{__FILE__}:40", 'cont' }
|
169
167
|
|
170
168
|
it 'must print backtrace' do
|
171
169
|
enter 'where'
|
172
170
|
debug_file 'frame_deep'
|
173
171
|
check_output_includes(
|
174
|
-
/--> #0 FrameDeepExample\.d\(e#String\)\s+at #{__FILE__}:
|
175
|
-
/#1 FrameDeepExample\.c\s+at #{__FILE__}:
|
176
|
-
/#2 FrameDeepExample\.b\s+at #{__FILE__}:
|
172
|
+
/--> #0 FrameDeepExample\.d\(e#String\)\s+at #{__FILE__}:40/,
|
173
|
+
/#1 FrameDeepExample\.c\s+at #{__FILE__}:37/,
|
174
|
+
/#2 FrameDeepExample\.b\s+at #{__FILE__}:32/)
|
177
175
|
end
|
178
176
|
|
179
177
|
it 'must go up' do
|
180
178
|
enter 'up'
|
181
|
-
debug_file('frame_deep') {
|
179
|
+
debug_file('frame_deep') { state.line.must_equal 37 }
|
182
180
|
end
|
183
181
|
|
184
182
|
it 'must go down' do
|
185
183
|
enter 'up', 'down'
|
186
|
-
debug_file('frame_deep') {
|
184
|
+
debug_file('frame_deep') { state.line.must_equal 40 }
|
187
185
|
end
|
188
186
|
|
189
187
|
it 'must set frame' do
|
190
188
|
enter 'frame 2'
|
191
|
-
debug_file('frame_deep') {
|
189
|
+
debug_file('frame_deep') { state.line.must_equal 32 }
|
192
190
|
end
|
193
191
|
|
194
192
|
it 'must eval properly when scaling the stack' do
|
@@ -200,29 +198,29 @@ class TestFrame < TestDsl::TestCase
|
|
200
198
|
|
201
199
|
describe 'c-frames' do
|
202
200
|
it 'must mark c-frames when printing the stack' do
|
203
|
-
enter "break #{__FILE__}:
|
201
|
+
enter "break #{__FILE__}:3", 'cont', 'where'
|
204
202
|
enter 'where'
|
205
203
|
debug_file 'frame'
|
206
204
|
check_output_includes(
|
207
|
-
/--> #0 FrameExample.initialize\(f#String\)\s+at #{__FILE__}:
|
205
|
+
/--> #0 FrameExample.initialize\(f#String\)\s+at #{__FILE__}:3/,
|
208
206
|
/ͱ-- #1 Class.new\(\*args\)\s+at #{fullpath('frame')}:3/,
|
209
207
|
/#2 <top \(required\)>\s+at #{fullpath('frame')}:3/)
|
210
208
|
end
|
211
209
|
|
212
210
|
it '"up" skips c-frames' do
|
213
|
-
enter "break #{__FILE__}:
|
211
|
+
enter "break #{__FILE__}:7", 'cont', 'up', 'eval fr_ex.class.to_s'
|
214
212
|
debug_file 'frame'
|
215
213
|
check_output_includes '"FrameExample"'
|
216
214
|
end
|
217
215
|
|
218
216
|
it '"down" skips c-frames' do
|
219
|
-
enter "break #{__FILE__}:
|
217
|
+
enter "break #{__FILE__}:7", 'cont', 'up', 'down', 'eval @f'
|
220
218
|
debug_file 'frame'
|
221
219
|
check_output_includes '"f"'
|
222
220
|
end
|
223
221
|
|
224
222
|
it 'must not jump straigh to c-frames' do
|
225
|
-
enter "break #{__FILE__}:
|
223
|
+
enter "break #{__FILE__}:3", 'cont', 'frame 1'
|
226
224
|
debug_file 'frame'
|
227
225
|
check_output_includes "Can't navigate to c-frame", interface.error_queue
|
228
226
|
end
|
data/test/help_test.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
1
|
class TestHelp < TestDsl::TestCase
|
4
2
|
include Columnize
|
5
3
|
|
6
4
|
let(:available_commands) {
|
7
|
-
Byebug::Command.commands.
|
5
|
+
Byebug::Command.commands.map(&:names).flatten.uniq.sort }
|
8
6
|
|
9
7
|
describe 'when typed alone' do
|
10
8
|
temporary_change_hash Byebug.settings, :width, 50
|
data/test/info_test.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
1
|
class InfoExample
|
4
2
|
def initialize
|
5
3
|
@foo = "bar"
|
@@ -35,7 +33,7 @@ class TestInfo < TestDsl::TestCase
|
|
35
33
|
|
36
34
|
describe 'Args info' do
|
37
35
|
it 'must show info about all args' do
|
38
|
-
enter "break #{__FILE__}:
|
36
|
+
enter "break #{__FILE__}:10", 'cont', 'info args'
|
39
37
|
debug_file 'info'
|
40
38
|
check_output_includes 'y = "a"', 'z = "b"'
|
41
39
|
end
|
@@ -182,7 +180,7 @@ class TestInfo < TestDsl::TestCase
|
|
182
180
|
|
183
181
|
describe 'Instance variables info' do
|
184
182
|
it 'must show instance variables' do
|
185
|
-
enter "break #{__FILE__}:
|
183
|
+
enter "break #{__FILE__}:10", 'cont', 'info instance_variables'
|
186
184
|
debug_file 'info'
|
187
185
|
check_output_includes '@bla = "blabla"', '@foo = "bar"'
|
188
186
|
end
|
@@ -190,9 +188,9 @@ class TestInfo < TestDsl::TestCase
|
|
190
188
|
|
191
189
|
describe 'Line info' do
|
192
190
|
it 'must show the current line' do
|
193
|
-
enter "break #{__FILE__}:
|
191
|
+
enter "break #{__FILE__}:10", 'cont', 'info line'
|
194
192
|
debug_file 'info'
|
195
|
-
check_output_includes "Line
|
193
|
+
check_output_includes "Line 10 of \"#{__FILE__}\""
|
196
194
|
end
|
197
195
|
end
|
198
196
|
|
@@ -200,13 +198,13 @@ class TestInfo < TestDsl::TestCase
|
|
200
198
|
temporary_change_hash Byebug.settings, :width, 28
|
201
199
|
|
202
200
|
it 'must show the current local variables' do
|
203
|
-
enter "break #{__FILE__}:
|
201
|
+
enter "break #{__FILE__}:10", 'cont', 'info locals'
|
204
202
|
debug_file 'info'
|
205
203
|
check_output_includes 'w = "11111111111111111111...', 'x = 2'
|
206
204
|
end
|
207
205
|
|
208
206
|
it 'must fail if local variable doesn\'t respond to #to_s or to #inspect' do
|
209
|
-
enter "break #{__FILE__}:
|
207
|
+
enter "break #{__FILE__}:15", 'cont', 'info locals'
|
210
208
|
debug_file 'info'
|
211
209
|
check_output_includes 'a = *Error in evaluation*'
|
212
210
|
end
|
@@ -254,11 +252,11 @@ class TestInfo < TestDsl::TestCase
|
|
254
252
|
|
255
253
|
describe 'Stack info' do
|
256
254
|
it 'must show stack info' do
|
257
|
-
enter 'set fullpath', "break #{__FILE__}:
|
255
|
+
enter 'set fullpath', "break #{__FILE__}:8", 'cont', 'info stack'
|
258
256
|
debug_file 'info'
|
259
257
|
check_output_includes(
|
260
|
-
/--> #0 InfoExample.a\(y\#String, z\#String\)\s+at #{__FILE__}:
|
261
|
-
/#1 InfoExample.b\s+at #{__FILE__}:
|
258
|
+
/--> #0 InfoExample.a\(y\#String, z\#String\)\s+at #{__FILE__}:8/,
|
259
|
+
/#1 InfoExample.b\s+at #{__FILE__}:19/,
|
262
260
|
/#2 <top \(required\)>\s+at #{fullpath('info')}:4/)
|
263
261
|
end
|
264
262
|
end
|
@@ -275,7 +273,7 @@ class TestInfo < TestDsl::TestCase
|
|
275
273
|
temporary_change_hash Byebug.settings, :width, 30
|
276
274
|
|
277
275
|
it 'must show all variables' do
|
278
|
-
enter "break #{__FILE__}:
|
276
|
+
enter "break #{__FILE__}:10", 'cont', 'info variables'
|
279
277
|
debug_file 'info'
|
280
278
|
check_output_includes(/self = #<InfoExample:\S+.../,
|
281
279
|
'w = "1111111111111111111111...',
|
@@ -285,7 +283,7 @@ class TestInfo < TestDsl::TestCase
|
|
285
283
|
end
|
286
284
|
|
287
285
|
it 'must fail if the variable doesn\'t respond to #to_s or to #inspect' do
|
288
|
-
enter "break #{__FILE__}:
|
286
|
+
enter "break #{__FILE__}:15", 'cont', 'info variables'
|
289
287
|
debug_file 'info'
|
290
288
|
check_output_includes 'a = *Error in evaluation*',
|
291
289
|
/self = #<InfoExample:\S+.../,
|
@@ -294,7 +292,7 @@ class TestInfo < TestDsl::TestCase
|
|
294
292
|
end
|
295
293
|
|
296
294
|
it 'must correctly print variables containing % sign' do
|
297
|
-
enter "break #{__FILE__}:
|
295
|
+
enter "break #{__FILE__}:21", 'cont', 'info variables'
|
298
296
|
debug_file 'info'
|
299
297
|
check_output_includes 'e = "%.2f"'
|
300
298
|
end
|
data/test/kill_test.rb
CHANGED
data/test/list_test.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
1
|
class TestList < TestDsl::TestCase
|
4
2
|
describe 'listsize' do
|
5
3
|
it 'must show lines according to :listsize setting' do
|
@@ -160,7 +158,7 @@ class TestList < TestDsl::TestCase
|
|
160
158
|
end
|
161
159
|
|
162
160
|
it 'must show an error when there is no such file' do
|
163
|
-
enter -> {
|
161
|
+
enter -> { state.file = 'blabla'; 'list 4-4' }
|
164
162
|
debug_file 'list'
|
165
163
|
check_error_includes 'No sourcefile available for blabla'
|
166
164
|
end
|
data/test/method_test.rb
CHANGED
data/test/post_mortem_test.rb
CHANGED
@@ -1,40 +1,25 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
1
|
class PostMortemExample
|
4
2
|
def a
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
x = 6
|
10
|
-
x + z
|
11
|
-
end
|
12
|
-
rescue => e
|
13
|
-
e
|
14
|
-
end
|
3
|
+
z = 4
|
4
|
+
raise 'blabla'
|
5
|
+
x = 6
|
6
|
+
x + z
|
15
7
|
end
|
16
8
|
end
|
17
9
|
|
18
10
|
class TestPostMortem < TestDsl::TestCase
|
11
|
+
|
19
12
|
describe 'Features' do
|
20
|
-
before { enter 'cont' }
|
13
|
+
before { enter 'set post_mortem', 'cont' }
|
21
14
|
|
22
15
|
it 'must enter into post-mortem mode' do
|
23
|
-
debug_file('post_mortem'
|
16
|
+
debug_file('post_mortem', rescue: true) do
|
17
|
+
Byebug.post_mortem?.must_equal true
|
18
|
+
end
|
24
19
|
end
|
25
20
|
|
26
21
|
it 'must stop at the correct line' do
|
27
|
-
debug_file('post_mortem') {
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'must exit from post-mortem mode after stepping command' do
|
31
|
-
enter 'break 13', 'cont'
|
32
|
-
debug_file('post_mortem') { Byebug.post_mortem?.must_equal false }
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'must save the raised exception' do
|
36
|
-
debug_file('post_mortem') {
|
37
|
-
Byebug.last_exception.must_be_kind_of RuntimeError }
|
22
|
+
debug_file('post_mortem', rescue: true) { assert_equal 4, state.line }
|
38
23
|
end
|
39
24
|
end
|
40
25
|
|
@@ -43,69 +28,81 @@ class TestPostMortem < TestDsl::TestCase
|
|
43
28
|
|
44
29
|
describe 'step' do
|
45
30
|
it 'must not work in post-mortem mode' do
|
46
|
-
enter 'cont', 'step'
|
47
|
-
debug_file 'post_mortem'
|
31
|
+
enter 'set post_mortem', 'cont', 'step'
|
32
|
+
debug_file 'post_mortem', rescue: true
|
48
33
|
check_error_includes 'Unknown command: "step". Try "help".'
|
49
34
|
end
|
50
35
|
end
|
51
36
|
|
52
37
|
describe 'next' do
|
53
38
|
it 'must not work in post-mortem mode' do
|
54
|
-
enter 'cont', 'next'
|
55
|
-
debug_file 'post_mortem'
|
39
|
+
enter 'set post_mortem', 'cont', 'next'
|
40
|
+
debug_file 'post_mortem', rescue: true
|
56
41
|
check_error_includes 'Unknown command: "next". Try "help".'
|
57
42
|
end
|
58
43
|
end
|
59
44
|
|
60
45
|
describe 'finish' do
|
61
46
|
it 'must not work in post-mortem mode' do
|
62
|
-
enter 'cont', 'finish'
|
63
|
-
debug_file 'post_mortem'
|
47
|
+
enter 'set post_mortem', 'cont', 'finish'
|
48
|
+
debug_file 'post_mortem', rescue: true
|
64
49
|
check_error_includes 'Unknown command: "finish". Try "help".'
|
65
50
|
end
|
66
51
|
end
|
67
|
-
end
|
68
52
|
|
69
|
-
|
70
|
-
|
53
|
+
describe 'break' do
|
54
|
+
it 'must not be able to set breakpoints in post-mortem mode' do
|
55
|
+
enter 'set post_mortem', 'cont', "break #{__FILE__}:6"
|
56
|
+
debug_file 'post_mortem', rescue: true
|
57
|
+
check_error_includes "Unknown command: \"break #{__FILE__}:6\". " \
|
58
|
+
'Try "help".'
|
59
|
+
end
|
60
|
+
end
|
71
61
|
|
72
|
-
describe '
|
73
|
-
it 'must
|
74
|
-
|
75
|
-
|
76
|
-
debug_file 'post_mortem'
|
62
|
+
describe 'condition' do
|
63
|
+
it 'must not be able to set conditions in post-mortem mode' do
|
64
|
+
enter "break #{__FILE__}:6", 'set post_mortem', 'cont',
|
65
|
+
->{ "cond #{Byebug.breakpoints.last.id} true" }
|
66
|
+
debug_file 'post_mortem', rescue: true
|
67
|
+
check_error_includes \
|
68
|
+
"Unknown command: \"cond #{Byebug.breakpoints.last.id} true\". " \
|
69
|
+
"Try \"help\"."
|
77
70
|
end
|
78
71
|
end
|
79
72
|
|
80
73
|
describe 'display' do
|
81
|
-
it 'must be able to set display expressions in post-mortem mode' do
|
82
|
-
enter 'cont', 'display 2 + 2'
|
83
|
-
debug_file 'post_mortem'
|
84
|
-
|
74
|
+
it 'must be not able to set display expressions in post-mortem mode' do
|
75
|
+
enter 'set post_mortem', 'cont', 'display 2 + 2'
|
76
|
+
debug_file 'post_mortem', rescue: true
|
77
|
+
check_error_includes 'Unknown command: "display 2 + 2". Try "help".'
|
85
78
|
end
|
86
79
|
end
|
87
80
|
|
88
|
-
describe '
|
81
|
+
describe 'reload' do
|
89
82
|
it 'must work in post-mortem mode' do
|
90
|
-
enter 'cont', '
|
91
|
-
debug_file
|
92
|
-
|
93
|
-
/--> #0 block in PostMortemExample\.a\s+at #{__FILE__}:8/)
|
83
|
+
enter 'set post_mortem', 'cont', 'reload'
|
84
|
+
debug_file 'post_mortem', rescue: true
|
85
|
+
check_error_includes 'Unknown command: "reload". Try "help".'
|
94
86
|
end
|
95
87
|
end
|
96
88
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
describe 'Available commands' do
|
93
|
+
describe 'restart' do
|
94
|
+
it 'must work in post-mortem mode' do
|
95
|
+
must_restart
|
96
|
+
enter 'cont', 'restart'
|
97
|
+
debug_file 'post_mortem', rescue: true
|
102
98
|
end
|
103
99
|
end
|
104
100
|
|
105
|
-
describe '
|
106
|
-
it 'must
|
107
|
-
enter 'cont', '
|
108
|
-
debug_file('post_mortem') {
|
101
|
+
describe 'frame' do
|
102
|
+
it 'must work in post-mortem mode' do
|
103
|
+
enter 'cont', 'frame'
|
104
|
+
debug_file('post_mortem', rescue: true) { state.line.must_equal 4 }
|
105
|
+
check_output_includes(/--> #0 PostMortemExample\.a\s+at #{__FILE__}:4/)
|
109
106
|
end
|
110
107
|
end
|
111
108
|
|
@@ -113,20 +110,7 @@ class TestPostMortem < TestDsl::TestCase
|
|
113
110
|
it 'must work in post-mortem mode' do
|
114
111
|
Byebug::QuitCommand.any_instance.expects(:exit!)
|
115
112
|
enter 'cont', 'exit!'
|
116
|
-
debug_file 'post_mortem'
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
describe 'reload' do
|
121
|
-
after { change_line_in_file(@tst_file, 4, 'c.a') }
|
122
|
-
|
123
|
-
it 'must work in post-mortem mode' do
|
124
|
-
enter 'cont', -> do
|
125
|
-
change_line_in_file(@tst_file, 4, 'bo = BasicObject.new')
|
126
|
-
'reload'
|
127
|
-
end, 'up 3', 'l 4-4'
|
128
|
-
debug_file 'post_mortem'
|
129
|
-
check_output_includes '=> 4: bo = BasicObject.new'
|
113
|
+
debug_file 'post_mortem', rescue: true
|
130
114
|
end
|
131
115
|
end
|
132
116
|
|
@@ -137,15 +121,15 @@ class TestPostMortem < TestDsl::TestCase
|
|
137
121
|
Byebug::Edit.any_instance.
|
138
122
|
expects(:system).with("editr +2 #{fullpath('edit')}")
|
139
123
|
enter 'cont', "edit #{fullpath('edit')}:2", 'cont'
|
140
|
-
debug_file 'post_mortem'
|
124
|
+
debug_file 'post_mortem', rescue: true
|
141
125
|
end
|
142
126
|
end
|
143
127
|
|
144
128
|
describe 'info' do
|
145
129
|
it 'must work in post-mortem mode' do
|
146
130
|
enter 'cont', 'info line'
|
147
|
-
debug_file 'post_mortem'
|
148
|
-
check_output_includes "Line
|
131
|
+
debug_file 'post_mortem', rescue: true
|
132
|
+
check_output_includes "Line 4 of \"#{__FILE__}\""
|
149
133
|
end
|
150
134
|
end
|
151
135
|
|
@@ -155,30 +139,27 @@ class TestPostMortem < TestDsl::TestCase
|
|
155
139
|
it 'must work in post-mortem mode' do
|
156
140
|
skip "Don't know why this is failing now..."
|
157
141
|
irb.stubs(:eval_input).throws(:IRB_EXIT, :cont)
|
158
|
-
enter 'cont', 'break
|
159
|
-
debug_file('post_mortem') {
|
142
|
+
enter 'cont', 'break 11', 'irb'
|
143
|
+
debug_file('post_mortem', rescue: true) { state.line.must_equal 11 }
|
160
144
|
end
|
161
145
|
end
|
162
146
|
|
163
147
|
describe 'source' do
|
164
|
-
before { File.open(filename, 'w') do |f|
|
165
|
-
f.puts 'break 2'
|
166
|
-
f.puts 'break 3 if true'
|
167
|
-
end }
|
168
|
-
after { FileUtils.rm(filename) }
|
169
|
-
|
170
148
|
let(:filename) { 'source_example.txt' }
|
171
149
|
|
150
|
+
before { File.open(filename, 'w') { |f| f.puts 'frame' } }
|
151
|
+
|
172
152
|
it 'must work in post-mortem mode' do
|
173
153
|
enter 'cont', "so #{filename}"
|
174
|
-
debug_file('post_mortem'
|
154
|
+
debug_file('post_mortem', rescue: true)
|
155
|
+
check_output_includes(/--> #0 PostMortemExample\.a\s+at #{__FILE__}:4/)
|
175
156
|
end
|
176
157
|
end
|
177
158
|
|
178
159
|
describe 'help' do
|
179
160
|
it 'must work in post-mortem mode' do
|
180
161
|
enter 'cont', 'help'
|
181
|
-
debug_file 'post_mortem'
|
162
|
+
debug_file 'post_mortem', rescue: true
|
182
163
|
check_output_includes 'Available commands:'
|
183
164
|
end
|
184
165
|
end
|
@@ -186,7 +167,7 @@ class TestPostMortem < TestDsl::TestCase
|
|
186
167
|
describe 'var' do
|
187
168
|
it 'must work in post-mortem mode' do
|
188
169
|
enter 'cont', 'var local'
|
189
|
-
debug_file 'post_mortem'
|
170
|
+
debug_file 'post_mortem', rescue: true
|
190
171
|
check_output_includes 'x => nil', 'z => 4'
|
191
172
|
end
|
192
173
|
end
|
@@ -194,15 +175,15 @@ class TestPostMortem < TestDsl::TestCase
|
|
194
175
|
describe 'list' do
|
195
176
|
it 'must work in post-mortem mode' do
|
196
177
|
enter 'cont'
|
197
|
-
debug_file 'post_mortem'
|
198
|
-
check_output_includes "[
|
178
|
+
debug_file 'post_mortem', rescue: true
|
179
|
+
check_output_includes "[1, 10] in #{__FILE__}"
|
199
180
|
end
|
200
181
|
end
|
201
182
|
|
202
183
|
describe 'method' do
|
203
184
|
it 'must work in post-mortem mode' do
|
204
185
|
enter 'cont', 'm i self'
|
205
|
-
debug_file 'post_mortem'
|
186
|
+
debug_file 'post_mortem', rescue: true
|
206
187
|
check_output_includes(/to_s/)
|
207
188
|
end
|
208
189
|
end
|
@@ -211,14 +192,14 @@ class TestPostMortem < TestDsl::TestCase
|
|
211
192
|
it 'must work in post-mortem mode' do
|
212
193
|
Process.expects(:kill).with('USR1', Process.pid)
|
213
194
|
enter 'cont', 'kill USR1'
|
214
|
-
debug_file 'post_mortem'
|
195
|
+
debug_file 'post_mortem', rescue: true
|
215
196
|
end
|
216
197
|
end
|
217
198
|
|
218
199
|
describe 'eval' do
|
219
200
|
it 'must work in post-mortem mode' do
|
220
201
|
enter 'cont', 'eval 2 + 2'
|
221
|
-
debug_file 'post_mortem'
|
202
|
+
debug_file 'post_mortem', rescue: true
|
222
203
|
check_output_includes '4'
|
223
204
|
end
|
224
205
|
end
|
@@ -228,7 +209,7 @@ class TestPostMortem < TestDsl::TestCase
|
|
228
209
|
|
229
210
|
it 'must work in post-mortem mode' do
|
230
211
|
enter 'cont', 'set autolist on'
|
231
|
-
debug_file 'post_mortem'
|
212
|
+
debug_file 'post_mortem', rescue: true
|
232
213
|
check_output_includes 'autolist is on.'
|
233
214
|
end
|
234
215
|
end
|
@@ -236,11 +217,11 @@ class TestPostMortem < TestDsl::TestCase
|
|
236
217
|
describe 'save' do
|
237
218
|
let(:file_name) { 'save_output.txt' }
|
238
219
|
let(:file_contents) { File.read(file_name) }
|
239
|
-
after {
|
220
|
+
after { File.delete(file_name) }
|
240
221
|
|
241
222
|
it 'must work in post-mortem mode' do
|
242
223
|
enter 'cont', "save #{file_name}"
|
243
|
-
debug_file 'post_mortem'
|
224
|
+
debug_file 'post_mortem', rescue: true
|
244
225
|
file_contents.must_include 'set autoirb off'
|
245
226
|
end
|
246
227
|
end
|
@@ -248,7 +229,7 @@ class TestPostMortem < TestDsl::TestCase
|
|
248
229
|
describe 'show' do
|
249
230
|
it 'must work in post-mortem mode' do
|
250
231
|
enter 'cont', 'show autolist'
|
251
|
-
debug_file 'post_mortem'
|
232
|
+
debug_file 'post_mortem', rescue: true
|
252
233
|
check_output_includes 'autolist is on.'
|
253
234
|
end
|
254
235
|
end
|
@@ -256,7 +237,7 @@ class TestPostMortem < TestDsl::TestCase
|
|
256
237
|
describe 'trace' do
|
257
238
|
it 'must work in post-mortem mode' do
|
258
239
|
enter 'cont', 'trace on'
|
259
|
-
debug_file 'post_mortem'
|
240
|
+
debug_file 'post_mortem', rescue: true
|
260
241
|
check_output_includes 'line tracing is on.'
|
261
242
|
end
|
262
243
|
end
|
@@ -264,7 +245,7 @@ class TestPostMortem < TestDsl::TestCase
|
|
264
245
|
describe 'thread' do
|
265
246
|
it "must work in post-mortem mode" do
|
266
247
|
enter 'cont', 'thread list'
|
267
|
-
debug_file
|
248
|
+
debug_file 'post_mortem', rescue: true
|
268
249
|
check_output_includes(/\+ \d+ #<Thread:(\S+) run/)
|
269
250
|
end
|
270
251
|
end
|