trepanning 0.0.4 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +161 -0
- data/NEWS +10 -0
- data/Rakefile +13 -19
- data/app/frame.rb +1 -1
- data/app/irb.rb +1 -1
- data/app/util.rb +3 -10
- data/data/irbrc +1 -1
- data/lib/trepanning.rb +2 -2
- data/processor/command/alias.rb +10 -11
- data/processor/command/backtrace.rb +8 -9
- data/processor/command/base/cmd.rb +4 -0
- data/processor/command/base/subcmd.rb +0 -1
- data/processor/command/base/submgr.rb +12 -3
- data/processor/command/break.rb +14 -15
- data/processor/command/condition.rb +11 -12
- data/processor/command/continue.rb +10 -11
- data/processor/command/debug.rb +7 -8
- data/processor/command/delete.rb +10 -9
- data/processor/command/directory.rb +1 -1
- data/processor/command/disable.rb +8 -9
- data/processor/command/disassemble.rb +7 -8
- data/processor/command/display.rb +10 -11
- data/processor/command/down.rb +8 -9
- data/processor/command/enable.rb +9 -10
- data/processor/command/exit.rb +11 -10
- data/processor/command/finish.rb +12 -11
- data/processor/command/frame.rb +3 -4
- data/processor/command/help.rb +14 -16
- data/processor/command/info.rb +7 -8
- data/processor/command/irb.rb +13 -14
- data/processor/command/kill.rb +21 -10
- data/processor/command/list.rb +36 -36
- data/processor/command/macro.rb +4 -5
- data/processor/command/next.rb +19 -20
- data/processor/command/nocache.rb +3 -4
- data/processor/command/{print.rb → pr.rb} +11 -9
- data/processor/command/ps.rb +8 -8
- data/processor/command/quit.rb +17 -15
- data/processor/command/raise.rb +11 -10
- data/processor/command/reload.rb +4 -5
- data/processor/command/restart.rb +11 -10
- data/processor/command/save.rb +12 -9
- data/processor/command/set.rb +14 -15
- data/processor/command/set_subcmd/debug_subcmd/dbgr.rb +1 -1
- data/processor/command/set_subcmd/debug_subcmd/skip.rb +1 -1
- data/processor/command/show.rb +7 -7
- data/processor/command/show_subcmd/alias.rb +3 -4
- data/processor/command/show_subcmd/args.rb +0 -2
- data/processor/command/show_subcmd/auto.rb +2 -3
- data/processor/command/show_subcmd/basename.rb +0 -3
- data/processor/command/show_subcmd/debug.rb +2 -1
- data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +1 -1
- data/processor/command/show_subcmd/different.rb +0 -3
- data/processor/command/show_subcmd/events.rb +0 -2
- data/processor/command/show_subcmd/macro.rb +2 -5
- data/processor/command/show_subcmd/max.rb +2 -1
- data/processor/command/show_subcmd/trace.rb +2 -2
- data/processor/command/source.rb +9 -8
- data/processor/command/step.rb +28 -29
- data/processor/command/stepi.rb +1 -1
- data/processor/command/unalias.rb +4 -5
- data/processor/command/undisplay.rb +4 -5
- data/processor/command/up.rb +9 -10
- data/processor/eval.rb +6 -2
- data/processor/frame.rb +32 -26
- data/processor/main.rb +1 -1
- data/processor/mock.rb +9 -3
- data/processor/running.rb +11 -7
- data/processor/validate.rb +1 -2
- data/test/functional/test-fn_helper.rb +42 -0
- data/test/functional/test-raise.rb +1 -1
- data/test/functional/test-return.rb +2 -2
- data/test/unit/test-app-util.rb +3 -4
- data/test/unit/test-base-subcmd.rb +2 -1
- data/test/unit/test-cmd-help.rb +4 -4
- data/test/unit/test-proc-frame.rb +1 -2
- data/test/unit/test-proc-main.rb +1 -1
- metadata +10 -7
data/processor/command/enable.rb
CHANGED
@@ -10,15 +10,15 @@ class Trepan::Command::EnableCommand < Trepan::Command::DisableCommand
|
|
10
10
|
# Silence already initialized constant .. warnings
|
11
11
|
old_verbose = $VERBOSE
|
12
12
|
$VERBOSE = nil
|
13
|
-
|
14
|
-
|
13
|
+
NAME = File.basename(__FILE__, '.rb')
|
14
|
+
HELP = <<-HELP
|
15
|
+
#{NAME} [display] bpnumber [bpnumber ...]
|
15
16
|
|
16
17
|
Enables the breakpoints given as a space separated list of breakpoint
|
17
18
|
numbers. See also "info break" to get a list.
|
18
|
-
|
19
|
+
HELP
|
19
20
|
|
20
21
|
ALIASES = %w(en)
|
21
|
-
NAME = File.basename(__FILE__, '.rb')
|
22
22
|
SHORT_HELP = 'Enable some breakpoints'
|
23
23
|
$VERBOSE = old_verbose
|
24
24
|
|
@@ -31,13 +31,12 @@ end
|
|
31
31
|
|
32
32
|
if __FILE__ == $0
|
33
33
|
require_relative '../mock'
|
34
|
-
|
35
|
-
|
36
|
-
cmd.run([name])
|
37
|
-
cmd.
|
38
|
-
cmdproc = dbgr.core.processor
|
34
|
+
dbgr, cmd = MockDebugger::setup
|
35
|
+
cmd.run([cmd.name])
|
36
|
+
cmd.run([cmd.name, '1'])
|
37
|
+
cmdproc = cmd.proc
|
39
38
|
cmds = cmdproc.commands
|
40
39
|
break_cmd = cmds['break']
|
41
40
|
break_cmd.run(['break', cmdproc.frame.source_location[0].to_s])
|
42
|
-
cmd.run([name, '1'])
|
41
|
+
cmd.run([cmd.name, '1'])
|
43
42
|
end
|
data/processor/command/exit.rb
CHANGED
@@ -3,19 +3,22 @@ require_relative 'base/cmd'
|
|
3
3
|
class Trepan::Command::ExitCommand < Trepan::Command
|
4
4
|
|
5
5
|
unless defined?(HELP)
|
6
|
-
|
7
|
-
|
6
|
+
NAME = File.basename(__FILE__, '.rb')
|
7
|
+
HELP = <<-HELP
|
8
|
+
#{NAME} [exitcode]
|
9
|
+
|
10
|
+
hard exit of the debugged program.
|
8
11
|
|
9
12
|
The program being debugged is exited via exit!() which does not run
|
10
13
|
the Kernel at_exit finalizers. If a return code is given, that is the
|
11
14
|
return code passed to exit() - presumably the return code that will be
|
12
15
|
passed back to the OS. If no exit code is given, 0 is used.
|
13
16
|
|
14
|
-
See also the commands "quit" and "kill".
|
17
|
+
See also the commands "quit" and "kill".
|
18
|
+
HELP
|
15
19
|
|
16
20
|
CATEGORY = 'support'
|
17
21
|
MAX_ARGS = 2 # Need at most this many
|
18
|
-
NAME = File.basename(__FILE__, '.rb')
|
19
22
|
SHORT_HELP = 'Exit program via "exit!"'
|
20
23
|
end
|
21
24
|
|
@@ -23,7 +26,7 @@ See also the commands "quit" and "kill".'
|
|
23
26
|
# whether exit! or exit is used.
|
24
27
|
|
25
28
|
# This method runs the command
|
26
|
-
def run(args)
|
29
|
+
def run(args)
|
27
30
|
unconditional =
|
28
31
|
if args.size > 1 && args[1] == 'unconditionally'
|
29
32
|
args.shift
|
@@ -46,9 +49,7 @@ end
|
|
46
49
|
|
47
50
|
if __FILE__ == $0
|
48
51
|
require_relative '../mock'
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
fork { cmd.run([name]) }
|
53
|
-
cmd.run([name, '10'])
|
52
|
+
dbgr, cmd = MockDebugger::setup
|
53
|
+
fork { cmd.run([cmd.name]) }
|
54
|
+
cmd.run([cmd.name, '10'])
|
54
55
|
end
|
data/processor/command/finish.rb
CHANGED
@@ -5,8 +5,9 @@ require_relative 'base/cmd'
|
|
5
5
|
class Trepan::Command::FinishCommand < Trepan::Command
|
6
6
|
|
7
7
|
unless defined?(HELP)
|
8
|
-
|
9
|
-
|
8
|
+
NAME = File.basename(__FILE__, '.rb')
|
9
|
+
HELP = <<-HELP
|
10
|
+
#{NAME} [levels]
|
10
11
|
|
11
12
|
Continue execution until leaving the current function.
|
12
13
|
Sometimes this is called 'step out'.
|
@@ -21,20 +22,21 @@ guarentee the stack level is the same as or less than the current
|
|
21
22
|
one.
|
22
23
|
|
23
24
|
See the break command if you want to stop at a particular point in a
|
24
|
-
program. In general, '
|
25
|
+
program. In general, '#{NAME}', 'step' and 'next' may slow a program down
|
25
26
|
while 'break' will have less overhead.
|
26
|
-
|
27
|
+
HELP
|
27
28
|
ALIASES = %w(fin)
|
28
29
|
CATEGORY = 'running'
|
29
30
|
# execution_set = ['Running']
|
30
|
-
|
31
|
-
|
31
|
+
|
32
|
+
# Need at most this many.
|
33
|
+
MAX_ARGS = 1
|
32
34
|
NEED_STACK = true
|
33
35
|
SHORT_HELP = 'Step program without entering called functions'
|
34
36
|
end
|
35
37
|
|
36
38
|
# This method runs the command
|
37
|
-
def run(args)
|
39
|
+
def run(args)
|
38
40
|
opts = {}
|
39
41
|
if args.size == 1
|
40
42
|
# Form is: "finish" which means "finish 1"
|
@@ -62,9 +64,8 @@ end
|
|
62
64
|
|
63
65
|
if __FILE__ == $0
|
64
66
|
require_relative '../mock'
|
65
|
-
|
66
|
-
|
67
|
-
[%w(finish 1), %w(fin 2-1), %w(n foo)].each do |c|
|
67
|
+
dbgr, cmd = MockDebugger::setup
|
68
|
+
[%W(#{cmd.name} 1), %w(fin 2-1), %w(n foo)].each do |c|
|
68
69
|
cmd.proc.next_level = 0
|
69
70
|
cmd.proc.leave_cmd_loop = false
|
70
71
|
result = cmd.run(c)
|
@@ -72,7 +73,7 @@ if __FILE__ == $0
|
|
72
73
|
puts 'level_count %d, leave_cmd_loop: %s' % [cmd.proc.next_level,
|
73
74
|
cmd.proc.leave_cmd_loop]
|
74
75
|
end
|
75
|
-
[%w(fin),
|
76
|
+
[%w(fin), [cmd.name]].each do |c|
|
76
77
|
cmd.proc.next_level = 0
|
77
78
|
cmd.proc.leave_cmd_loop = false
|
78
79
|
result = cmd.run(c)
|
data/processor/command/frame.rb
CHANGED
@@ -104,14 +104,13 @@ if __FILE__ == $0
|
|
104
104
|
# Demo it.
|
105
105
|
require 'thread_frame'
|
106
106
|
require_relative '../mock'
|
107
|
-
|
108
|
-
dbgr, cmd = MockDebugger::setup(name)
|
107
|
+
dbgr, cmd = MockDebugger::setup
|
109
108
|
|
110
109
|
def sep ; puts '=' * 40 end
|
111
|
-
%w(0 1 -2).each {|count| cmd.run([name, count]); sep }
|
110
|
+
%w(0 1 -2).each {|count| cmd.run([cmd.name, count]); sep }
|
112
111
|
def foo(cmd, name)
|
113
112
|
cmd.proc.frame_setup(RubyVM::ThreadFrame::current)
|
114
113
|
%w(0 -1).each {|count| cmd.run([name, count]); sep }
|
115
114
|
end
|
116
|
-
foo(cmd, name)
|
115
|
+
foo(cmd, cmd.name)
|
117
116
|
end
|
data/processor/command/help.rb
CHANGED
@@ -3,8 +3,9 @@ require_relative 'base/cmd'
|
|
3
3
|
class Trepan::Command::HelpCommand < Trepan::Command
|
4
4
|
|
5
5
|
unless defined?(HELP)
|
6
|
-
|
7
|
-
|
6
|
+
NAME = File.basename(__FILE__, '.rb')
|
7
|
+
HELP = <<-HELP
|
8
|
+
#{NAME} [command [subcommand]|expression]
|
8
9
|
|
9
10
|
Without argument, print the list of available debugger commands.
|
10
11
|
|
@@ -21,8 +22,7 @@ subcommand. For example 'help info line' give help about the
|
|
21
22
|
info line command.
|
22
23
|
|
23
24
|
See also 'examine' and 'whatis'.
|
24
|
-
|
25
|
-
|
25
|
+
HELP
|
26
26
|
|
27
27
|
ALIASES = %w(?)
|
28
28
|
CATEGORIES = {
|
@@ -35,7 +35,6 @@ See also 'examine' and 'whatis'.
|
|
35
35
|
'stack' => 'Examining the call stack'
|
36
36
|
}
|
37
37
|
CATEGORY = 'support'
|
38
|
-
NAME = File.basename(__FILE__, '.rb')
|
39
38
|
NEED_STACK = false
|
40
39
|
SHORT_HELP = 'Print commands or give help for command(s)'
|
41
40
|
end
|
@@ -57,7 +56,7 @@ Type "help" followed by command name for full documentation.
|
|
57
56
|
end
|
58
57
|
|
59
58
|
# This method runs the command
|
60
|
-
def run(args)
|
59
|
+
def run(args)
|
61
60
|
if args.size > 1
|
62
61
|
cmd_name = args[1]
|
63
62
|
if cmd_name == '*'
|
@@ -124,23 +123,22 @@ end
|
|
124
123
|
if __FILE__ == $0
|
125
124
|
# Demo it.
|
126
125
|
require_relative '../mock'
|
127
|
-
|
128
|
-
dbgr, cmd = MockDebugger::setup(name)
|
126
|
+
dbgr, cmd = MockDebugger::setup
|
129
127
|
|
130
|
-
cmd.run %
|
128
|
+
cmd.run %W(cmd.name help)
|
131
129
|
puts '=' * 40
|
132
|
-
cmd.run %
|
130
|
+
cmd.run %W(cmd.name *)
|
133
131
|
puts '=' * 40
|
134
|
-
cmd.run %
|
132
|
+
cmd.run %W(cmd.name fdafsasfda)
|
135
133
|
puts '=' * 40
|
136
|
-
cmd.run %
|
134
|
+
cmd.run %W(cmd.name)
|
137
135
|
puts '=' * 40
|
138
|
-
cmd.run %
|
136
|
+
cmd.run %W(cmd.name support)
|
139
137
|
puts '=' * 40
|
140
|
-
cmd.run %
|
138
|
+
cmd.run %W(cmd.name support *)
|
141
139
|
|
142
140
|
puts '=' * 40
|
143
|
-
cmd.run %
|
141
|
+
cmd.run %W(cmd.name s.*)
|
144
142
|
puts '=' * 40
|
145
|
-
cmd.run %
|
143
|
+
cmd.run %W(cmd.name s<>)
|
146
144
|
end
|
data/processor/command/info.rb
CHANGED
@@ -4,25 +4,24 @@ require_relative 'base/submgr'
|
|
4
4
|
|
5
5
|
class Trepan::Command::InfoCommand < Trepan::SubcommandMgr
|
6
6
|
unless defined?(HELP)
|
7
|
-
|
8
|
-
|
7
|
+
NAME = File.basename(__FILE__, '.rb')
|
8
|
+
HELP = <<-HELP
|
9
|
+
Generic command for showing things about the program being debugged.
|
9
10
|
|
10
11
|
You can give unique prefix of the name of a subcommand to get
|
11
12
|
information about just that subcommand.
|
12
13
|
|
13
|
-
Type "
|
14
|
-
Type "help
|
15
|
-
|
14
|
+
Type "#{NAME}" for a list of "info" subcommands and what they do.
|
15
|
+
Type "help #{NAME} *" for just a list of "info" subcommands.
|
16
|
+
HELP
|
16
17
|
|
17
18
|
ALIASES = %w(i)
|
18
19
|
CATEGORY = 'status'
|
19
|
-
NAME = File.basename(__FILE__, '.rb')
|
20
20
|
SHORT_HELP = 'Information about debugged program and its environment'
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
if __FILE__ == $0
|
25
25
|
require_relative '../mock'
|
26
|
-
|
27
|
-
dbgr, cmd = MockDebugger::setup(name)
|
26
|
+
dbgr, cmd = MockDebugger::setup
|
28
27
|
end
|
data/processor/command/irb.rb
CHANGED
@@ -5,23 +5,24 @@ require_relative '../../app/irb'
|
|
5
5
|
class Trepan::Command::IRBCommand < Trepan::Command
|
6
6
|
|
7
7
|
unless defined?(HELP)
|
8
|
-
|
9
|
-
|
8
|
+
NAME = File.basename(__FILE__, '.rb')
|
9
|
+
HELP = <<-HELP
|
10
|
+
#{NAME} [-d]\tstarts an Interactive Ruby (IRB) session.
|
10
11
|
|
11
12
|
If -d is added you can get access to debugger frame the global variables
|
12
13
|
$trepan_frame and $trepan_cmdproc.
|
13
14
|
|
14
|
-
|
15
|
-
run the corresponding debugger commands.
|
15
|
+
#{NAME} is extended with methods 'cont', 'ne', and, 'q', 'step' which
|
16
|
+
run the corresponding debugger commands 'continue', 'next', 'exit' and 'step'.
|
16
17
|
|
17
|
-
To issue a debugger command, inside
|
18
|
+
To issue a debugger command, inside #{NAME} nested inside a debugger use
|
18
19
|
'dbgr'. For example:
|
19
20
|
|
20
|
-
dbgr
|
21
|
+
dbgr %w(info program)
|
21
22
|
dbgr('info', 'program') # Same as above
|
22
23
|
dbgr 'info program' # Single quoted string also works
|
23
24
|
|
24
|
-
But arguments have to be quoted because
|
25
|
+
But arguments have to be quoted because #{NAME} will evaluate them:
|
25
26
|
|
26
27
|
dbgr info program # wrong!
|
27
28
|
dbgr info, program # wrong!
|
@@ -29,16 +30,15 @@ But arguments have to be quoted because irb will evaluate them:
|
|
29
30
|
|
30
31
|
Here then is a loop to query VM stack values:
|
31
32
|
(-1..1).each {|i| dbgr(\"info reg sp \#{i}\")}
|
32
|
-
|
33
|
+
HELP
|
33
34
|
|
34
35
|
CATEGORY = 'support'
|
35
36
|
MAX_ARGS = 1 # Need at most this many
|
36
|
-
|
37
|
-
SHORT_HELP = 'Run interactive Ruby session irb as a command subshell'
|
37
|
+
SHORT_HELP = "Run #{NAME} as a command subshell"
|
38
38
|
end
|
39
39
|
|
40
40
|
# This method runs the command
|
41
|
-
def run(args)
|
41
|
+
def run(args)
|
42
42
|
add_debugging =
|
43
43
|
if args.size > 1
|
44
44
|
'-d' == args[1]
|
@@ -99,8 +99,7 @@ end
|
|
99
99
|
if __FILE__ == $0
|
100
100
|
require 'thread_frame'
|
101
101
|
require_relative '../mock'
|
102
|
-
|
103
|
-
dbgr, cmd = MockDebugger::setup(name)
|
102
|
+
dbgr, cmd = MockDebugger::setup
|
104
103
|
# Get an IRB session -- the hard way :-)
|
105
|
-
cmd.run([name]) if ARGV.size > 0
|
104
|
+
cmd.run([cmd.name]) if ARGV.size > 0
|
106
105
|
end
|
data/processor/command/kill.rb
CHANGED
@@ -3,26 +3,38 @@ require_relative 'base/cmd'
|
|
3
3
|
class Trepan::Command::KillCommand < Trepan::Command
|
4
4
|
|
5
5
|
unless defined?(HELP)
|
6
|
-
|
7
|
-
|
6
|
+
NAME = File.basename(__FILE__, '.rb')
|
7
|
+
HELP = <<-HELP
|
8
|
+
#{NAME} [signal-number|signal-name|unconditionally]
|
9
|
+
|
10
|
+
Kill execution of program being debugged.
|
8
11
|
|
9
12
|
Equivalent of Process.kill('KILL', Process.pid). This is an unmaskable
|
10
13
|
signal. When all else fails, e.g. in thread code, use this.
|
11
14
|
|
12
15
|
If 'unconditionally' is given, no questions are asked. Otherwise, if
|
13
|
-
we are in interactive mode, we'll prompt to make sure.
|
16
|
+
we are in interactive mode, we'll prompt to make sure.
|
17
|
+
|
18
|
+
Examples:
|
19
|
+
|
20
|
+
#{NAME}
|
21
|
+
#{NAME} unconditionally
|
22
|
+
#{NAME} KILL # same as above
|
23
|
+
#{NAME} kill # same as above
|
24
|
+
#{NAME} -9 # same as above
|
25
|
+
#{NAME} 9 # same as above
|
26
|
+
HELP
|
14
27
|
|
15
28
|
CATEGORY = 'running'
|
16
29
|
MAX_ARGS = 1 # Need at most this many
|
17
|
-
NAME = File.basename(__FILE__, '.rb')
|
18
30
|
SHORT_HELP = 'Send this process a POSIX signal (default "9" is "kill -9")'
|
19
31
|
end
|
20
32
|
|
21
33
|
# This method runs the command
|
22
|
-
def run(args)
|
34
|
+
def run(args)
|
23
35
|
if args.size > 1
|
24
36
|
sig = Integer(args[1]) rescue args[1]
|
25
|
-
unless sig.is_a?(Integer) || Signal.list.member?(sig)
|
37
|
+
unless sig.is_a?(Integer) || Signal.list.member?(sig.upcase)
|
26
38
|
errmsg("Signal name '#{sig}' is not a signal I know about.\n")
|
27
39
|
return false
|
28
40
|
end
|
@@ -48,11 +60,10 @@ end
|
|
48
60
|
|
49
61
|
if __FILE__ == $0
|
50
62
|
require_relative '../mock'
|
51
|
-
|
52
|
-
dbgr, cmd = MockDebugger::setup(name)
|
63
|
+
dbgr, cmd = MockDebugger::setup
|
53
64
|
%w(fooo 1 -1 HUP -9).each do |arg|
|
54
|
-
puts "#{name} #{arg}"
|
55
|
-
cmd.run([name, arg])
|
65
|
+
puts "#{cmd.name} #{arg}"
|
66
|
+
cmd.run([cmd.name, arg])
|
56
67
|
puts '=' * 40
|
57
68
|
end
|
58
69
|
end
|
data/processor/command/list.rb
CHANGED
@@ -5,16 +5,17 @@ require_relative 'base/cmd'
|
|
5
5
|
|
6
6
|
class Trepan::Command::ListCommand < Trepan::Command
|
7
7
|
unless defined?(HELP)
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
NAME = File.basename(__FILE__, '.rb')
|
9
|
+
HELP = <<-HELP
|
10
|
+
#{NAME}[>] [MODULE] [FIRST [NUM]]
|
11
|
+
#{NAME}[>] LOCATION [NUM]
|
11
12
|
|
12
|
-
|
13
|
+
#{NAME} source code.
|
13
14
|
|
14
15
|
Without arguments, prints lines centered around the current
|
15
|
-
line. If this is the first
|
16
|
+
line. If this is the first #{NAME} command issued since the debugger
|
16
17
|
command loop was entered, then the current line is the current
|
17
|
-
frame. If a subsequent
|
18
|
+
frame. If a subsequent #{NAME} command was issued with no intervening
|
18
19
|
frame changing, then that is start the line after we last one
|
19
20
|
previously shown.
|
20
21
|
|
@@ -25,7 +26,7 @@ The number of line to show is controled by the debugger listsize
|
|
25
26
|
setting. Use 'set listsize' or 'show listsize' to see or set the
|
26
27
|
value.
|
27
28
|
|
28
|
-
\"
|
29
|
+
\"#{NAME} -\" shows lines before a previous listing.
|
29
30
|
|
30
31
|
A LOCATION is a either
|
31
32
|
- number, e.g. 5,
|
@@ -47,22 +48,22 @@ just something that evaluates to a positive integer.
|
|
47
48
|
|
48
49
|
Some examples:
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
The output of the
|
51
|
+
#{NAME} 5 # List centered around line 5
|
52
|
+
#{NAME} 4+1 # Same as above.
|
53
|
+
#{NAME} 5> # List starting at line 5
|
54
|
+
#{NAME} foo.rb:5 # List centered around line 5 of foo.rb
|
55
|
+
#{NAME} foo.rb 5 # Same as above.
|
56
|
+
#{NAME} foo.rb:5> # List starting around line 5 of foo.rb
|
57
|
+
#{NAME} foo.rb 5 6 # list lines 5 and 6 of foo.rb
|
58
|
+
#{NAME} foo.rb 5 2 # Same as above, since 2 < 5.
|
59
|
+
#{NAME} foo.rb:5 2 # Same as above
|
60
|
+
#{NAME} FileUtils.cp # List lines around the FileUtils.cp function.
|
61
|
+
#{NAME} . # List lines centered from where we currently are stopped
|
62
|
+
#{NAME} - # List lines previous to those just shown
|
63
|
+
|
64
|
+
The output of the #{NAME} command give a line number, and some status
|
64
65
|
information about the line and the text of the line. Here is some
|
65
|
-
hypothetical
|
66
|
+
hypothetical #{NAME} output modeled roughly around line 251 of one
|
66
67
|
version of this code:
|
67
68
|
|
68
69
|
251 cmd.proc.frame_setup(tf)
|
@@ -74,12 +75,12 @@ version of this code:
|
|
74
75
|
Line 251 has nothing special about it. Line 252 is where we are
|
75
76
|
currently stopped. On line 253 there is a breakpoint 1 which is
|
76
77
|
enabled, while at line 255 there is an breakpoint 2 which is
|
77
|
-
disabled.
|
78
|
+
disabled.
|
79
|
+
HELP
|
78
80
|
|
79
|
-
ALIASES = %
|
81
|
+
ALIASES = %W(l #{NAME}> l>)
|
80
82
|
CATEGORY = 'files'
|
81
83
|
MAX_ARGS = 3
|
82
|
-
NAME = File.basename(__FILE__, '.rb')
|
83
84
|
SHORT_HELP = 'List source code'
|
84
85
|
end
|
85
86
|
|
@@ -256,8 +257,7 @@ if __FILE__ == $0
|
|
256
257
|
require_relative '../location'
|
257
258
|
require_relative '../mock'
|
258
259
|
require_relative '../frame'
|
259
|
-
|
260
|
-
dbgr, cmd = MockDebugger::setup(name)
|
260
|
+
dbgr, cmd = MockDebugger::setup
|
261
261
|
cmd.proc.send('frame_initialize')
|
262
262
|
LineCache::cache(__FILE__)
|
263
263
|
cmd.run(['list'])
|
@@ -296,19 +296,19 @@ if __FILE__ == $0
|
|
296
296
|
run_cmd(cmd, %w(list Columnize.columnize))
|
297
297
|
|
298
298
|
# Use Class/method name. 15 isn't in the function - should this be okay?
|
299
|
-
run_cmd(cmd, %
|
299
|
+
run_cmd(cmd, %W(#{cmd.name} Columnize.columnize 15))
|
300
300
|
|
301
301
|
# Start line and count, since 3 < 30
|
302
|
-
run_cmd(cmd, %
|
302
|
+
run_cmd(cmd, %W(#{cmd.name} Columnize.columnize 30 3))
|
303
303
|
|
304
304
|
# Start line finish line
|
305
|
-
run_cmd(cmd, %
|
305
|
+
run_cmd(cmd, %W(#{cmd.name} Columnize.columnize 40 50))
|
306
306
|
|
307
307
|
# puts '--' * 10
|
308
|
-
# cmd.run([
|
308
|
+
# cmd.run([cmd.name, os.path.abspath(__file__)+':3', '4'])
|
309
309
|
# puts '--' * 10
|
310
|
-
# cmd.run([
|
311
|
-
# cmd.run([
|
310
|
+
# cmd.run([cmd.name, os.path.abspath(__file__)+':3', '12-10'])
|
311
|
+
# cmd.run([cmd.name, 'os.path:5'])
|
312
312
|
|
313
313
|
require 'thread_frame'
|
314
314
|
tf = RubyVM::ThreadFrame.current
|
@@ -316,12 +316,12 @@ if __FILE__ == $0
|
|
316
316
|
brkpt_cmd = cmd.proc.instance_variable_get('@commands')['break']
|
317
317
|
brkpt_cmd.run(['break'])
|
318
318
|
line = __LINE__
|
319
|
-
run_cmd(cmd, [
|
319
|
+
run_cmd(cmd, [cmd.name, __LINE__.to_s])
|
320
320
|
|
321
321
|
disable_cmd = cmd.proc.instance_variable_get('@commands')['disable']
|
322
322
|
disable_cmd.run(['disable', '1'])
|
323
323
|
|
324
|
-
run_cmd(cmd, [
|
325
|
-
run_cmd(cmd, %
|
324
|
+
run_cmd(cmd, [cmd.name, line.to_s])
|
325
|
+
run_cmd(cmd, %W(#{cmd.name} run_cmd))
|
326
326
|
end
|
327
327
|
end
|