byebug 2.7.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -6
- data/.travis.yml +1 -0
- data/CHANGELOG.md +23 -0
- data/Gemfile +9 -0
- data/README.md +35 -32
- data/Rakefile +1 -3
- data/byebug.gemspec +0 -6
- data/ext/byebug/byebug.c +64 -51
- data/ext/byebug/byebug.h +12 -13
- data/ext/byebug/context.c +28 -43
- data/ext/byebug/extconf.rb +6 -6
- data/lib/byebug.rb +34 -38
- data/lib/byebug/command.rb +4 -2
- data/lib/byebug/commands/continue.rb +0 -1
- data/lib/byebug/commands/control.rb +0 -1
- data/lib/byebug/commands/edit.rb +1 -1
- data/lib/byebug/commands/finish.rb +10 -16
- data/lib/byebug/commands/help.rb +1 -1
- data/lib/byebug/commands/kill.rb +1 -1
- data/lib/byebug/commands/quit.rb +1 -1
- data/lib/byebug/commands/repl.rb +3 -3
- data/lib/byebug/commands/set.rb +24 -39
- data/lib/byebug/commands/show.rb +39 -112
- data/lib/byebug/commands/stepping.rb +0 -2
- data/lib/byebug/commands/threads.rb +0 -5
- data/lib/byebug/commands/trace.rb +1 -1
- data/lib/byebug/commands/variables.rb +1 -1
- data/lib/byebug/context.rb +8 -12
- data/lib/byebug/helper.rb +1 -1
- data/lib/byebug/history.rb +46 -0
- data/lib/byebug/interface.rb +5 -5
- data/lib/byebug/interfaces/local_interface.rb +11 -62
- data/lib/byebug/interfaces/remote_interface.rb +6 -22
- data/lib/byebug/interfaces/script_interface.rb +2 -17
- data/lib/byebug/processor.rb +4 -4
- data/lib/byebug/{command_processor.rb → processors/command_processor.rb} +7 -14
- data/lib/byebug/{control_command_processor.rb → processors/control_command_processor.rb} +3 -7
- data/lib/byebug/version.rb +1 -1
- data/test/edit_test.rb +6 -6
- data/test/examples/breakpoint_deep.rb +1 -1
- data/test/finish_test.rb +6 -6
- data/test/help_test.rb +1 -1
- data/test/info_test.rb +0 -1
- data/test/kill_test.rb +2 -2
- data/test/post_mortem_test.rb +35 -219
- data/test/quit_test.rb +2 -2
- data/test/restart_test.rb +12 -33
- data/test/set_test.rb +80 -107
- data/test/show_test.rb +42 -77
- data/test/stepping_test.rb +1 -1
- data/test/support/test_dsl.rb +4 -25
- data/test/support/test_interface.rb +40 -48
- data/test/test_helper.rb +1 -3
- data/test/timeout_test.rb +9 -0
- metadata +8 -75
data/lib/byebug/interface.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Byebug
|
2
2
|
class Interface
|
3
|
-
|
3
|
+
attr_accessor :command_queue, :restart_file
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
@
|
6
|
+
@command_queue, @restart_file = [], nil
|
7
7
|
end
|
8
8
|
|
9
9
|
# Common routine for reporting byebug error messages.
|
@@ -28,7 +28,7 @@ module Byebug
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
require 'byebug/interfaces/local_interface'
|
32
|
+
require 'byebug/interfaces/script_interface'
|
33
|
+
require 'byebug/interfaces/remote_interface'
|
34
34
|
end
|
@@ -1,24 +1,12 @@
|
|
1
|
+
require 'byebug/history'
|
2
|
+
|
1
3
|
module Byebug
|
2
4
|
class LocalInterface < Interface
|
3
|
-
|
4
|
-
attr_accessor :restart_file
|
5
|
-
|
6
|
-
FILE_HISTORY = ".byebug_hist" unless defined?(FILE_HISTORY)
|
5
|
+
attr_reader :history
|
7
6
|
|
8
|
-
def initialize
|
7
|
+
def initialize
|
9
8
|
super
|
10
|
-
|
11
|
-
@have_readline = false
|
12
|
-
@history_save = true
|
13
|
-
@history_length = ENV["HISTSIZE"] ? ENV["HISTSIZE"].to_i : 256
|
14
|
-
@histfile = File.join(ENV["HOME"]||ENV["HOMEPATH"]||".", FILE_HISTORY)
|
15
|
-
open(@histfile, 'r') do |file|
|
16
|
-
file.each do |line|
|
17
|
-
line.chomp!
|
18
|
-
Readline::HISTORY << line
|
19
|
-
end
|
20
|
-
end if File.exist?(@histfile)
|
21
|
-
@restart_file = nil
|
9
|
+
History.load
|
22
10
|
end
|
23
11
|
|
24
12
|
def read_command(prompt)
|
@@ -34,55 +22,16 @@ module Byebug
|
|
34
22
|
end
|
35
23
|
|
36
24
|
def close
|
37
|
-
|
38
|
-
|
39
|
-
# Things to do before quitting
|
40
|
-
def finalize
|
41
|
-
if Byebug.respond_to?(:save_history)
|
42
|
-
Byebug.save_history
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def readline_support?
|
47
|
-
@have_readline
|
25
|
+
History.save
|
48
26
|
end
|
49
27
|
|
50
28
|
private
|
51
29
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
iface = self.handler.interface
|
58
|
-
iface.histfile ||= File.join(ENV["HOME"]||ENV["HOMEPATH"]||".",
|
59
|
-
FILE_HISTORY)
|
60
|
-
open(iface.histfile, 'w') do |file|
|
61
|
-
Readline::HISTORY.to_a.last(iface.history_length).each do |line|
|
62
|
-
file.puts line unless line.strip.empty?
|
63
|
-
end if defined?(iface.history_save) and iface.history_save
|
64
|
-
end rescue nil
|
65
|
-
end
|
66
|
-
public :save_history
|
67
|
-
end
|
68
|
-
|
69
|
-
def readline(prompt, hist)
|
70
|
-
Readline::readline(prompt, hist)
|
71
|
-
rescue Interrupt
|
72
|
-
print "^C\n"
|
73
|
-
retry
|
74
|
-
end
|
75
|
-
rescue LoadError
|
76
|
-
def readline(prompt, hist)
|
77
|
-
@histfile = ''
|
78
|
-
@hist_save = false
|
79
|
-
STDOUT.print prompt
|
80
|
-
STDOUT.flush
|
81
|
-
line = STDIN.gets
|
82
|
-
exit unless line
|
83
|
-
line.chomp!
|
84
|
-
line
|
85
|
-
end
|
30
|
+
def readline(prompt, hist)
|
31
|
+
Readline::readline(prompt, hist)
|
32
|
+
rescue Interrupt
|
33
|
+
print "^C\n"
|
34
|
+
retry
|
86
35
|
end
|
87
36
|
end
|
88
37
|
end
|
@@ -1,44 +1,28 @@
|
|
1
|
+
require 'byebug/history'
|
2
|
+
|
1
3
|
module Byebug
|
2
4
|
class RemoteInterface < Interface
|
3
|
-
|
4
|
-
attr_accessor :restart_file
|
5
|
+
attr_reader :history
|
5
6
|
|
6
7
|
def initialize(socket)
|
7
|
-
|
8
|
+
super()
|
8
9
|
@socket = socket
|
9
|
-
@
|
10
|
-
@history_length = 256
|
11
|
-
@histfile = ''
|
12
|
-
# Do we read the histfile?
|
13
|
-
# open(@histfile, 'r') do |file|
|
14
|
-
# file.each do |line|
|
15
|
-
# line.chomp!
|
16
|
-
# Readline::HISTORY << line
|
17
|
-
# end
|
18
|
-
# end if File.exist?(@histfile)
|
19
|
-
@restart_file = nil
|
10
|
+
@history = History.new
|
20
11
|
end
|
21
12
|
|
22
13
|
def close
|
23
14
|
@socket.close
|
24
|
-
rescue
|
15
|
+
rescue IOError
|
25
16
|
end
|
26
17
|
|
27
18
|
def confirm(prompt)
|
28
19
|
send_command "CONFIRM #{prompt}"
|
29
20
|
end
|
30
21
|
|
31
|
-
def finalize
|
32
|
-
end
|
33
|
-
|
34
22
|
def read_command(prompt)
|
35
23
|
send_command "PROMPT #{prompt}"
|
36
24
|
end
|
37
25
|
|
38
|
-
def readline_support?
|
39
|
-
false
|
40
|
-
end
|
41
|
-
|
42
26
|
def print(*args)
|
43
27
|
@socket.printf(escape(format(*args)))
|
44
28
|
end
|
@@ -1,20 +1,9 @@
|
|
1
1
|
module Byebug
|
2
|
-
class ScriptInterface < Interface
|
3
|
-
attr_accessor :command_queue, :history_length, :history_save, :histfile
|
4
|
-
attr_accessor :restart_file
|
5
|
-
|
2
|
+
class ScriptInterface < Byebug::Interface
|
6
3
|
def initialize(file, out, verbose=false)
|
7
4
|
super()
|
8
|
-
@command_queue = []
|
9
5
|
@file = file.respond_to?(:gets) ? file : open(file)
|
10
|
-
@out = out
|
11
|
-
@verbose = verbose
|
12
|
-
@history_save = false
|
13
|
-
@history_length = 256
|
14
|
-
@histfile = ''
|
15
|
-
end
|
16
|
-
|
17
|
-
def finalize
|
6
|
+
@out, @verbose = out, verbose
|
18
7
|
end
|
19
8
|
|
20
9
|
def read_command(prompt)
|
@@ -26,10 +15,6 @@ module Byebug
|
|
26
15
|
end
|
27
16
|
end
|
28
17
|
|
29
|
-
def readline_support?
|
30
|
-
false
|
31
|
-
end
|
32
|
-
|
33
18
|
def confirm(prompt)
|
34
19
|
'y'
|
35
20
|
end
|
data/lib/byebug/processor.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'forwardable'
|
2
|
-
require_relative 'interface'
|
3
2
|
|
4
3
|
module Byebug
|
5
|
-
|
6
|
-
# Should this be a mixin?
|
7
4
|
class Processor
|
8
5
|
attr_accessor :interface
|
9
6
|
|
@@ -14,5 +11,8 @@ module Byebug
|
|
14
11
|
@interface = interface
|
15
12
|
end
|
16
13
|
end
|
17
|
-
|
18
14
|
end
|
15
|
+
|
16
|
+
require 'byebug/command'
|
17
|
+
require 'byebug/processors/command_processor'
|
18
|
+
require 'byebug/processors/control_command_processor'
|
@@ -1,7 +1,3 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
require_relative 'interface'
|
3
|
-
require_relative 'command'
|
4
|
-
|
5
1
|
module Byebug
|
6
2
|
|
7
3
|
class CommandProcessor < Processor
|
@@ -52,11 +48,11 @@ module Byebug
|
|
52
48
|
return unless @interface
|
53
49
|
__#{mname}(*args)
|
54
50
|
end
|
55
|
-
rescue IOError,
|
56
|
-
|
51
|
+
rescue IOError, SystemCallError
|
52
|
+
@interface.close
|
57
53
|
rescue SignalException
|
58
54
|
raise
|
59
|
-
rescue
|
55
|
+
rescue
|
60
56
|
print "INTERNAL ERROR!!! #\{$!\}\n" rescue nil
|
61
57
|
print $!.backtrace.map{|l| "\t#\{l\}"}.join("\n") rescue nil
|
62
58
|
end
|
@@ -118,9 +114,6 @@ module Byebug
|
|
118
114
|
def always_run(context, file, line, run_level)
|
119
115
|
cmds = Command.commands
|
120
116
|
|
121
|
-
# Remove some commands in post-mortem
|
122
|
-
cmds = cmds.find_all { |cmd| cmd.allow_in_post_mortem } if context.dead?
|
123
|
-
|
124
117
|
state = State.new(cmds, context, @display, file, @interface, line)
|
125
118
|
|
126
119
|
# Change default when in irb or code included in command line
|
@@ -194,8 +187,8 @@ module Byebug
|
|
194
187
|
#
|
195
188
|
def one_cmd(commands, context, input)
|
196
189
|
if cmd = commands.find { |c| c.match(input) }
|
197
|
-
if context.dead? && cmd.class.
|
198
|
-
|
190
|
+
if context.dead? && !cmd.class.allow_in_post_mortem
|
191
|
+
errmsg "Command unavailable in post mortem mode.\n"
|
199
192
|
else
|
200
193
|
cmd.execute
|
201
194
|
end
|
@@ -204,7 +197,7 @@ module Byebug
|
|
204
197
|
if unknown_cmd
|
205
198
|
unknown_cmd.execute
|
206
199
|
else
|
207
|
-
errmsg "Unknown command: \"#{input}\".
|
200
|
+
errmsg "Unknown command: \"#{input}\". Try \"help\".\n"
|
208
201
|
end
|
209
202
|
end
|
210
203
|
end
|
@@ -251,5 +244,5 @@ module Byebug
|
|
251
244
|
end
|
252
245
|
|
253
246
|
end # class CommandProcessor
|
254
|
-
|
247
|
+
|
255
248
|
end
|
@@ -1,7 +1,3 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
require_relative 'interface'
|
3
|
-
require_relative 'command'
|
4
|
-
|
5
1
|
module Byebug
|
6
2
|
|
7
3
|
class ControlCommandProcessor < Processor
|
@@ -32,8 +28,8 @@ module Byebug
|
|
32
28
|
end
|
33
29
|
end
|
34
30
|
end
|
35
|
-
rescue IOError,
|
36
|
-
rescue
|
31
|
+
rescue IOError, SystemCallError
|
32
|
+
rescue
|
37
33
|
print "INTERNAL ERROR!!! #{$!}\n" rescue nil
|
38
34
|
print $!.backtrace.map{|l| "\t#{l}"}.join("\n") rescue nil
|
39
35
|
ensure
|
@@ -75,5 +71,5 @@ module Byebug
|
|
75
71
|
end
|
76
72
|
end
|
77
73
|
end
|
78
|
-
|
74
|
+
|
79
75
|
end
|
data/lib/byebug/version.rb
CHANGED
data/test/edit_test.rb
CHANGED
@@ -4,8 +4,8 @@ class TestEdit < TestDsl::TestCase
|
|
4
4
|
temporary_change_hash ENV, 'EDITOR', 'editr'
|
5
5
|
|
6
6
|
it 'must open current file in current line in configured editor' do
|
7
|
-
Byebug::
|
8
|
-
|
7
|
+
Byebug::EditCommand.any_instance.expects(:system)
|
8
|
+
.with("editr +2 #{fullpath('edit')}")
|
9
9
|
enter 'edit'
|
10
10
|
debug_file 'edit'
|
11
11
|
end
|
@@ -15,8 +15,8 @@ class TestEdit < TestDsl::TestCase
|
|
15
15
|
temporary_change_hash ENV, 'EDITOR', nil
|
16
16
|
|
17
17
|
it 'must call "vim" with current line and file if EDITOR env not set' do
|
18
|
-
Byebug::
|
19
|
-
|
18
|
+
Byebug::EditCommand.any_instance.expects(:system)
|
19
|
+
.with("vim +2 #{fullpath('edit')}")
|
20
20
|
enter 'edit'
|
21
21
|
debug_file 'edit'
|
22
22
|
end
|
@@ -26,8 +26,8 @@ class TestEdit < TestDsl::TestCase
|
|
26
26
|
temporary_change_hash ENV, 'EDITOR', 'editr'
|
27
27
|
|
28
28
|
it 'must open specified line in specified file with configured editor' do
|
29
|
-
Byebug::
|
30
|
-
|
29
|
+
Byebug::EditCommand.any_instance.expects(:system)
|
30
|
+
.with("editr +3 #{fullpath('breakpoint')}")
|
31
31
|
enter "edit #{fullpath('breakpoint')}:3"
|
32
32
|
debug_file 'edit'
|
33
33
|
end
|
data/test/finish_test.rb
CHANGED
@@ -18,22 +18,22 @@ end
|
|
18
18
|
class TestFinish < TestDsl::TestCase
|
19
19
|
before { enter "break #{__FILE__}:14", 'cont' }
|
20
20
|
|
21
|
-
it 'must stop
|
21
|
+
it 'must stop after current frame is finished when without arguments' do
|
22
22
|
enter 'finish'
|
23
23
|
debug_file('finish') { state.line.must_equal 11 }
|
24
24
|
end
|
25
25
|
|
26
|
-
it 'must stop
|
26
|
+
it 'must stop before current frame finishes if 0 specified as argument' do
|
27
27
|
enter 'finish 0'
|
28
|
-
debug_file('finish') { state.line.must_equal
|
28
|
+
debug_file('finish') { state.line.must_equal 15 }
|
29
29
|
end
|
30
30
|
|
31
|
-
it 'must stop
|
31
|
+
it 'must stop after current frame is finished if 1 specified as argument' do
|
32
32
|
enter 'finish 1'
|
33
|
-
debug_file('finish') { state.line.must_equal
|
33
|
+
debug_file('finish') { state.line.must_equal 11 }
|
34
34
|
end
|
35
35
|
|
36
|
-
it 'must
|
36
|
+
it 'must behave consistenly even if current frame has been changed' do
|
37
37
|
enter 'up', 'finish'
|
38
38
|
debug_file('finish') { state.line.must_equal 7 }
|
39
39
|
end
|
data/test/help_test.rb
CHANGED
@@ -27,7 +27,7 @@ class TestHelp < TestDsl::TestCase
|
|
27
27
|
it 'must show an error if an undefined command is specified' do
|
28
28
|
enter 'help foobar'
|
29
29
|
debug_file 'help'
|
30
|
-
check_error_includes 'Undefined command: "foobar".
|
30
|
+
check_error_includes 'Undefined command: "foobar". Try "help".'
|
31
31
|
end
|
32
32
|
|
33
33
|
it "must show a command's help" do
|
data/test/info_test.rb
CHANGED
data/test/kill_test.rb
CHANGED
@@ -11,9 +11,9 @@ class TestKill < TestDsl::TestCase
|
|
11
11
|
debug_file('kill')
|
12
12
|
end
|
13
13
|
|
14
|
-
it 'must
|
14
|
+
it 'must close interface when sending KILL signal explicitly' do
|
15
15
|
Process.stubs(:kill).with('KILL', Process.pid)
|
16
|
-
interface.expects(:
|
16
|
+
interface.expects(:close)
|
17
17
|
enter 'kill KILL'
|
18
18
|
debug_file('kill')
|
19
19
|
end
|
data/test/post_mortem_test.rb
CHANGED
@@ -11,243 +11,59 @@ class TestPostMortem < TestDsl::TestCase
|
|
11
11
|
|
12
12
|
describe 'Features' do
|
13
13
|
before { enter 'set post_mortem', 'cont' }
|
14
|
+
after { Byebug.post_mortem = false }
|
14
15
|
|
15
|
-
it '
|
16
|
-
|
17
|
-
|
16
|
+
it 'is rising right before exiting' do
|
17
|
+
assert_raises(RuntimeError) do
|
18
|
+
debug_file('post_mortem')
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
|
-
it '
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
describe 'Unavailable commands' do
|
27
|
-
temporary_change_hash Byebug.settings, :autoeval, false
|
28
|
-
|
29
|
-
describe 'step' do
|
30
|
-
it 'must not work in post-mortem mode' do
|
31
|
-
enter 'set post_mortem', 'cont', 'step'
|
32
|
-
debug_file 'post_mortem', rescue: true
|
33
|
-
check_error_includes 'Unknown command: "step". Try "help".'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe 'next' do
|
38
|
-
it 'must not work in post-mortem mode' do
|
39
|
-
enter 'set post_mortem', 'cont', 'next'
|
40
|
-
debug_file 'post_mortem', rescue: true
|
41
|
-
check_error_includes 'Unknown command: "next". Try "help".'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe 'finish' do
|
46
|
-
it 'must not work in post-mortem mode' do
|
47
|
-
enter 'set post_mortem', 'cont', 'finish'
|
48
|
-
debug_file 'post_mortem', rescue: true
|
49
|
-
check_error_includes 'Unknown command: "finish". Try "help".'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
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".'
|
22
|
+
it 'sets post_mortem to true' do
|
23
|
+
begin
|
24
|
+
debug_file('post_mortem')
|
25
|
+
rescue
|
26
|
+
Byebug.post_mortem?.must_equal true
|
59
27
|
end
|
60
28
|
end
|
61
29
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
check_error_includes \
|
68
|
-
"Unknown command: \"cond #{Byebug.breakpoints.last.id} true\". " \
|
69
|
-
"Try \"help\"."
|
30
|
+
it 'stops at the correct line' do
|
31
|
+
begin
|
32
|
+
debug_file('post_mortem')
|
33
|
+
rescue
|
34
|
+
Byebug.raised_exception.__bb_line.must_equal 4
|
70
35
|
end
|
71
36
|
end
|
37
|
+
end
|
72
38
|
|
73
|
-
|
74
|
-
|
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".'
|
78
|
-
end
|
79
|
-
end
|
39
|
+
describe 'Unavailable commands' do
|
40
|
+
temporary_change_hash Byebug.settings, :autoeval, false
|
80
41
|
|
81
|
-
|
82
|
-
|
83
|
-
enter
|
84
|
-
|
85
|
-
|
42
|
+
%w(step next finish break condition display reload).each do |cmd|
|
43
|
+
define_method "test_#{cmd}_is_forbidden_in_post_mortem_mode" do
|
44
|
+
enter "#{cmd}"
|
45
|
+
state.context.stubs(:dead?).returns(:true)
|
46
|
+
begin
|
47
|
+
debug_file('post_mortem')
|
48
|
+
rescue RuntimeError
|
49
|
+
check_error_includes 'Command unavailable in post mortem mode.'
|
50
|
+
end
|
86
51
|
end
|
87
52
|
end
|
88
|
-
|
89
|
-
|
90
53
|
end
|
91
54
|
|
92
55
|
describe 'Available commands' do
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
end
|
100
|
-
|
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/)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
describe 'exit' do
|
110
|
-
it 'must work in post-mortem mode' do
|
111
|
-
Byebug::QuitCommand.any_instance.expects(:exit!)
|
112
|
-
enter 'cont', 'exit!'
|
113
|
-
debug_file 'post_mortem', rescue: true
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
describe 'edit' do
|
118
|
-
temporary_change_hash ENV, 'EDITOR', 'editr'
|
119
|
-
|
120
|
-
it 'must work in post-mortem mode' do
|
121
|
-
Byebug::Edit.any_instance.
|
122
|
-
expects(:system).with("editr +2 #{fullpath('edit')}")
|
123
|
-
enter 'cont', "edit #{fullpath('edit')}:2", 'cont'
|
124
|
-
debug_file 'post_mortem', rescue: true
|
125
|
-
end
|
126
|
-
end
|
56
|
+
['restart', 'frame', 'quit', 'edit', 'info', 'irb', 'source', 'help',
|
57
|
+
'var class', 'list', 'method', 'kill', 'eval', 'set', 'save', 'show',
|
58
|
+
'trace', 'thread list'].each do |cmd|
|
59
|
+
define_method "test_#{cmd}_is_permitted_in_post_mortem_mode" do
|
60
|
+
enter "#{cmd}"
|
61
|
+
class_name = cmd.gsub(/(^| )\w/) { |b| b[-1,1].upcase } + 'Command'
|
127
62
|
|
128
|
-
|
129
|
-
|
130
|
-
enter 'cont', 'info line'
|
131
|
-
debug_file 'post_mortem', rescue: true
|
132
|
-
check_output_includes "Line 4 of \"#{__FILE__}\""
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe 'irb' do
|
137
|
-
let(:irb) { stub(context: ->{}) }
|
138
|
-
|
139
|
-
it 'must work in post-mortem mode' do
|
140
|
-
skip "Don't know why this is failing now..."
|
141
|
-
irb.stubs(:eval_input).throws(:IRB_EXIT, :cont)
|
142
|
-
enter 'cont', 'break 11', 'irb'
|
143
|
-
debug_file('post_mortem', rescue: true) { state.line.must_equal 11 }
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
describe 'source' do
|
148
|
-
let(:filename) { 'source_example.txt' }
|
149
|
-
|
150
|
-
before { File.open(filename, 'w') { |f| f.puts 'frame' } }
|
151
|
-
|
152
|
-
it 'must work in post-mortem mode' do
|
153
|
-
enter 'cont', "so #{filename}"
|
154
|
-
debug_file('post_mortem', rescue: true)
|
155
|
-
check_output_includes(/--> #0 PostMortemExample\.a\s+at #{__FILE__}:4/)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
describe 'help' do
|
160
|
-
it 'must work in post-mortem mode' do
|
161
|
-
enter 'cont', 'help'
|
162
|
-
debug_file 'post_mortem', rescue: true
|
163
|
-
check_output_includes 'Available commands:'
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
describe 'var' do
|
168
|
-
it 'must work in post-mortem mode' do
|
169
|
-
enter 'cont', 'var local'
|
170
|
-
debug_file 'post_mortem', rescue: true
|
171
|
-
check_output_includes 'x => nil', 'z => 4'
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
describe 'list' do
|
176
|
-
it 'must work in post-mortem mode' do
|
177
|
-
enter 'cont'
|
178
|
-
debug_file 'post_mortem', rescue: true
|
179
|
-
check_output_includes "[1, 10] in #{__FILE__}"
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
describe 'method' do
|
184
|
-
it 'must work in post-mortem mode' do
|
185
|
-
enter 'cont', 'm i self'
|
186
|
-
debug_file 'post_mortem', rescue: true
|
187
|
-
check_output_includes(/to_s/)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
describe 'kill' do
|
192
|
-
it 'must work in post-mortem mode' do
|
193
|
-
Process.expects(:kill).with('USR1', Process.pid)
|
194
|
-
enter 'cont', 'kill USR1'
|
195
|
-
debug_file 'post_mortem', rescue: true
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
describe 'eval' do
|
200
|
-
it 'must work in post-mortem mode' do
|
201
|
-
enter 'cont', 'eval 2 + 2'
|
202
|
-
debug_file 'post_mortem', rescue: true
|
203
|
-
check_output_includes '4'
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
describe 'set' do
|
208
|
-
temporary_change_hash Byebug.settings, :autolist, 0
|
209
|
-
|
210
|
-
it 'must work in post-mortem mode' do
|
211
|
-
enter 'cont', 'set autolist on'
|
212
|
-
debug_file 'post_mortem', rescue: true
|
213
|
-
check_output_includes 'autolist is on.'
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
describe 'save' do
|
218
|
-
let(:file_name) { 'save_output.txt' }
|
219
|
-
let(:file_contents) { File.read(file_name) }
|
220
|
-
after { File.delete(file_name) }
|
221
|
-
|
222
|
-
it 'must work in post-mortem mode' do
|
223
|
-
enter 'cont', "save #{file_name}"
|
224
|
-
debug_file 'post_mortem', rescue: true
|
225
|
-
file_contents.must_include 'set autoirb off'
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
describe 'show' do
|
230
|
-
it 'must work in post-mortem mode' do
|
231
|
-
enter 'cont', 'show autolist'
|
232
|
-
debug_file 'post_mortem', rescue: true
|
233
|
-
check_output_includes 'autolist is on.'
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
describe 'trace' do
|
238
|
-
it 'must work in post-mortem mode' do
|
239
|
-
enter 'cont', 'trace on'
|
240
|
-
debug_file 'post_mortem', rescue: true
|
241
|
-
check_output_includes 'line tracing is on.'
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
describe 'thread' do
|
246
|
-
it "must work in post-mortem mode" do
|
247
|
-
enter 'cont', 'thread list'
|
248
|
-
debug_file 'post_mortem', rescue: true
|
249
|
-
check_output_includes(/\+ \d+ #<Thread:(\S+) run/)
|
63
|
+
Byebug.const_get(class_name).any_instance.stubs(:execute)
|
64
|
+
assert_raises(RuntimeError) { debug_file('post_mortem') }
|
250
65
|
end
|
251
66
|
end
|
252
67
|
end
|
68
|
+
|
253
69
|
end
|