trepanning 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +465 -0
- data/NEWS +26 -1
- data/README.textile +1 -1
- data/app/cmd_parse.kpeg +2 -1
- data/app/cmd_parser.rb +30 -3
- data/app/core.rb +1 -1
- data/app/display.rb +39 -1
- data/app/frame.rb +1 -1
- data/app/irb.rb +42 -40
- data/app/options.rb +3 -2
- data/app/run.rb +21 -7
- data/app/util.rb +12 -2
- data/app/yarv.rb +0 -2
- data/bin/trepan +2 -3
- data/data/perldb.bindings +17 -0
- data/interface/script.rb +1 -1
- data/interface/server.rb +1 -1
- data/interface/user.rb +3 -1
- data/{interface/base_intf.rb → interface.rb} +1 -1
- data/io/input.rb +1 -3
- data/io/null_output.rb +1 -1
- data/io/string_array.rb +1 -2
- data/io/tcpclient.rb +1 -1
- data/io/tcpserver.rb +1 -1
- data/{io/base_io.rb → io.rb} +0 -0
- data/lib/trepanning.rb +2 -1
- data/processor/command/alias.rb +15 -4
- data/processor/command/backtrace.rb +2 -2
- data/processor/command/base/subcmd.rb +1 -5
- data/processor/command/base/submgr.rb +1 -1
- data/processor/command/base/subsubcmd.rb +1 -1
- data/processor/command/base/subsubmgr.rb +4 -4
- data/processor/command/break.rb +1 -1
- data/processor/command/complete.rb +1 -1
- data/processor/command/condition.rb +2 -2
- data/processor/command/continue.rb +1 -1
- data/processor/command/debug.rb +1 -1
- data/processor/command/delete.rb +10 -7
- data/processor/command/directory.rb +1 -1
- data/processor/command/disable.rb +25 -19
- data/processor/command/disassemble.rb +1 -1
- data/processor/command/display.rb +35 -28
- data/processor/command/down.rb +8 -8
- data/processor/command/edit.rb +1 -1
- data/processor/command/enable.rb +10 -12
- data/processor/command/eval.rb +1 -1
- data/processor/command/exit.rb +1 -1
- data/processor/command/finish.rb +1 -1
- data/processor/command/frame.rb +2 -2
- data/processor/command/help.rb +6 -8
- data/processor/command/info.rb +2 -0
- data/processor/command/info_subcmd/files.rb +17 -11
- data/processor/command/info_subcmd/frame.rb +0 -1
- data/processor/command/info_subcmd/locals.rb +6 -73
- data/processor/command/info_subcmd/source.rb +10 -4
- data/processor/command/info_subcmd/variables.rb +34 -0
- data/processor/command/info_subcmd/variables_subcmd/.gitignore +1 -0
- data/processor/command/info_subcmd/variables_subcmd/class.rb +40 -0
- data/processor/command/info_subcmd/variables_subcmd/constant.rb +41 -0
- data/processor/command/info_subcmd/{globals.rb → variables_subcmd/globals.rb} +21 -16
- data/processor/command/info_subcmd/variables_subcmd/instance.rb +41 -0
- data/processor/command/info_subcmd/variables_subcmd/locals.rb +99 -0
- data/processor/command/kill.rb +9 -8
- data/processor/command/list.rb +9 -107
- data/processor/command/macro.rb +27 -9
- data/processor/command/next.rb +1 -1
- data/processor/command/nocache.rb +2 -2
- data/processor/command/parsetree.rb +1 -1
- data/processor/command/pp.rb +1 -1
- data/processor/command/pr.rb +1 -1
- data/processor/command/ps.rb +1 -1
- data/processor/command/quit.rb +18 -7
- data/processor/command/raise.rb +1 -1
- data/processor/command/reload.rb +10 -10
- data/processor/command/restart.rb +1 -1
- data/processor/command/save.rb +1 -1
- data/processor/command/server.rb +1 -1
- data/processor/command/set_subcmd/auto.rb +7 -1
- data/processor/command/set_subcmd/different.rb +5 -4
- data/processor/command/set_subcmd/substitute_subcmd/eval.rb +2 -2
- data/processor/command/set_subcmd/trace.rb +5 -4
- data/processor/command/set_subcmd/trace_subcmd/print.rb +4 -3
- data/processor/command/shell.rb +5 -3
- data/processor/command/show_subcmd/{alias.rb → aliases.rb} +2 -2
- data/processor/command/show_subcmd/auto_subcmd/eval.rb +2 -7
- data/processor/command/show_subcmd/trace_subcmd/print.rb +3 -3
- data/processor/command/show_subcmd/version.rb +24 -0
- data/processor/command/source.rb +1 -1
- data/processor/command/step.rb +1 -1
- data/processor/command/tbreak.rb +1 -1
- data/processor/command/unalias.rb +11 -6
- data/processor/command/undisplay.rb +14 -10
- data/processor/command/up.rb +12 -13
- data/processor/command/watchg.rb +1 -1
- data/processor/{command/base/cmd.rb → command.rb} +3 -2
- data/processor/display.rb +34 -0
- data/processor/frame.rb +2 -2
- data/processor/help.rb +6 -4
- data/processor/hook.rb +95 -96
- data/processor/list.rb +146 -0
- data/processor/location.rb +26 -0
- data/processor/mock.rb +4 -7
- data/processor/msg.rb +54 -42
- data/processor/running.rb +6 -3
- data/processor/subcmd.rb +16 -41
- data/processor/validate.rb +6 -9
- data/{processor/main.rb → processor.rb} +11 -40
- data/sample/rocky-trepan-colors.rb +0 -1
- data/test/data/enable.cmd +1 -1
- data/test/data/trace.cmd +6 -0
- data/test/data/trace.right +39 -0
- data/test/example/gcd.rb +0 -1
- data/test/functional/test-next.rb +1 -1
- data/test/integration/helper.rb +4 -0
- data/test/integration/test-trace.rb +18 -0
- data/test/unit/cmd-helper.rb +4 -4
- data/test/unit/test-app-cmd_parse.rb +1 -1
- data/test/unit/test-app-display.rb +22 -0
- data/test/unit/test-app-options.rb +14 -10
- data/test/unit/test-app-run.rb +7 -1
- data/test/unit/test-base-subcmd.rb +1 -1
- data/test/unit/test-cmd-kill.rb +11 -4
- data/test/unit/test-cmd-parse_list_cmd.rb +1 -1
- data/test/unit/{test-base-cmd.rb → test-command.rb} +1 -1
- data/test/unit/test-proc-eval.rb +1 -2
- data/test/unit/test-proc-frame.rb +1 -2
- data/test/unit/test-proc-list.rb +52 -0
- data/test/unit/test-proc-load_cmds.rb +1 -1
- data/test/unit/test-proc-location.rb +11 -4
- data/test/unit/test-proc-main.rb +1 -1
- data/test/unit/test-proc-validate.rb +1 -2
- data/test/unit/test-subcmd-help.rb +1 -1
- data/trepanning.gemspec +1 -1
- metadata +26 -12
@@ -1,11 +1,10 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
-
|
4
|
-
require_relative '../base/subcmd'
|
5
|
-
require_relative '../../../app/frame'
|
3
|
+
require_relative 'locals'
|
6
4
|
|
7
|
-
class Trepan::Subcommand::
|
8
|
-
|
5
|
+
class Trepan::Subcommand::InfoVariablesGlobals <
|
6
|
+
Trepan::Subcommand::InfoVariablesLocals
|
7
|
+
Trepan::Util.suppress_warnings {
|
9
8
|
Trepanning::Subcommand.set_name_prefix(__FILE__, self)
|
10
9
|
HELP = <<-EOH
|
11
10
|
#{CMD}
|
@@ -18,14 +17,18 @@ EOH
|
|
18
17
|
SHORT_HELP = 'Show global variables'
|
19
18
|
MIN_ARGS = 0
|
20
19
|
MAX_ARGS = 1
|
21
|
-
MIN_ABBREV = 'gl'.size
|
22
20
|
NEED_STACK = true
|
21
|
+
}
|
22
|
+
|
23
|
+
def get_names
|
24
|
+
global_variables
|
23
25
|
end
|
24
26
|
|
25
27
|
def run(args)
|
26
|
-
if args.size ==
|
28
|
+
if args.size == 2
|
27
29
|
if 0 == 'names'.index(args[-1].downcase)
|
28
|
-
|
30
|
+
names = get_names()
|
31
|
+
if names.empty?
|
29
32
|
msg "No global variables defined."
|
30
33
|
else
|
31
34
|
section "Global variable names:"
|
@@ -36,16 +39,17 @@ EOH
|
|
36
39
|
msg mess
|
37
40
|
end
|
38
41
|
else
|
39
|
-
errmsg("unrecognized argument #{args[
|
42
|
+
errmsg("unrecognized argument: #{args[-1]}")
|
40
43
|
end
|
41
|
-
elsif args.size ==
|
42
|
-
|
44
|
+
elsif args.size == 1
|
45
|
+
names = get_names
|
46
|
+
if names.empty?
|
43
47
|
msg "No global variables defined."
|
44
48
|
else
|
45
49
|
section "Global variables:"
|
46
|
-
|
47
|
-
s = @proc.debug_eval(var_name)
|
48
|
-
msg("#{var_name} = #{s.inspect}")
|
50
|
+
names.sort.each do |var_name|
|
51
|
+
s = @proc.debug_eval(var_name.to_s)
|
52
|
+
msg("#{var_name} = #{s.inspect}", :code=>true)
|
49
53
|
end
|
50
54
|
end
|
51
55
|
else
|
@@ -56,8 +60,9 @@ end
|
|
56
60
|
|
57
61
|
if __FILE__ == $0
|
58
62
|
# Demo it.
|
59
|
-
require_relative '
|
60
|
-
cmd = MockDebugger::
|
63
|
+
require_relative '../../../mock'
|
64
|
+
cmd = MockDebugger::subsub_setup(Trepan::Subcommand::InfoVariablesGlobals,
|
65
|
+
false)
|
61
66
|
cmd.run(cmd.prefix)
|
62
67
|
cmd.run(cmd.prefix + ['name'])
|
63
68
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
require_relative 'locals'
|
4
|
+
|
5
|
+
class Trepan::Subcommand::InfoVariablesInstance <
|
6
|
+
Trepan::Subcommand::InfoVariablesLocals
|
7
|
+
Trepan::Util.suppress_warnings {
|
8
|
+
Trepanning::Subcommand.set_name_prefix(__FILE__, self)
|
9
|
+
HELP = <<-EOH
|
10
|
+
#{CMD}
|
11
|
+
#{CMD} [names]
|
12
|
+
|
13
|
+
Show instance variables of the current stack frame.
|
14
|
+
Normally for each which show both the name and value. If you just
|
15
|
+
want a list of names add parameter 'names'.
|
16
|
+
EOH
|
17
|
+
SHORT_HELP = 'Show instance variables of the current stack frame'
|
18
|
+
MIN_ARGS = 0
|
19
|
+
MAX_ARGS = 1
|
20
|
+
MIN_ABBREV = 'iv'.size
|
21
|
+
NEED_STACK = true
|
22
|
+
}
|
23
|
+
|
24
|
+
def get_names
|
25
|
+
@proc.debug_eval('self.instance_variables')
|
26
|
+
end
|
27
|
+
|
28
|
+
def run(args)
|
29
|
+
run_for_type(args, 'instance', @proc.debug_eval('self'))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if __FILE__ == $0
|
34
|
+
# Demo it.
|
35
|
+
require_relative '../../mock'
|
36
|
+
cmd =
|
37
|
+
MockDebugger::subsub_setup(Trepan::Subcommand::InfoVariables,
|
38
|
+
Trepan::Subcommand::InfoVariablesInstance)
|
39
|
+
cmd.run(cmd.prefix)
|
40
|
+
cmd.run(cmd.prefix + ['name'])
|
41
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
require 'columnize'
|
4
|
+
require_relative '../../base/subsubcmd'
|
5
|
+
require_relative '../../../../app/frame'
|
6
|
+
require_relative '../../../../app/util'
|
7
|
+
|
8
|
+
class Trepan::Subcommand::InfoVariablesLocals < Trepan::SubSubcommand
|
9
|
+
Trepan::Util.suppress_warnings {
|
10
|
+
Trepanning::Subcommand.set_name_prefix(__FILE__, self)
|
11
|
+
HELP = <<-EOH
|
12
|
+
#{CMD}
|
13
|
+
#{CMD} [names]
|
14
|
+
|
15
|
+
Show local variables including parameters of the current stack frame.
|
16
|
+
Normally for each which show both the name and value. If you just
|
17
|
+
want a list of names add parameter 'names'.
|
18
|
+
EOH
|
19
|
+
SHORT_HELP = 'Show local variables of the current stack frame'
|
20
|
+
MIN_ARGS = 0
|
21
|
+
MAX_ARGS = 1
|
22
|
+
MIN_ABBREV = 'lo'.size
|
23
|
+
NEED_STACK = true
|
24
|
+
}
|
25
|
+
|
26
|
+
def complete(prefix)
|
27
|
+
['name']
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_names
|
31
|
+
iseq = @proc.frame.iseq
|
32
|
+
0.upto(iseq.local_size-2).map do
|
33
|
+
|i|
|
34
|
+
iseq.local_name(i)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def run_for_type(args, type, klass=nil)
|
39
|
+
suffix = klass ? " for #{klass.to_s}" : '' rescue ''
|
40
|
+
if args.size == 2
|
41
|
+
if 0 == 'names'.index(args[-1].downcase)
|
42
|
+
if 'CFUNC' == @proc.frame.type
|
43
|
+
errmsg("info #{type} names not supported for C frames")
|
44
|
+
else
|
45
|
+
if names.empty?
|
46
|
+
msg "No #{type} variables defined."
|
47
|
+
else
|
48
|
+
section "#{type.capitalize} variable names#{suffix}:"
|
49
|
+
width = settings[:maxwidth]
|
50
|
+
mess = Columnize::columnize(names,
|
51
|
+
@proc.settings[:maxwidth], ' ',
|
52
|
+
false, true, ' ' * 2).chomp
|
53
|
+
msg mess
|
54
|
+
end
|
55
|
+
end
|
56
|
+
else
|
57
|
+
errmsg("unrecognized argument: #{args[-1]}")
|
58
|
+
end
|
59
|
+
elsif args.size == 1
|
60
|
+
if 'CFUNC' == @proc.frame.type
|
61
|
+
argc = @proc.frame.argc
|
62
|
+
if argc > 0
|
63
|
+
1.upto(argc).each do |i|
|
64
|
+
msg "#{i}: #{@proc.frame.sp(argc-i+3).inspect}"
|
65
|
+
end
|
66
|
+
else
|
67
|
+
msg("No parameters in C call; showing other C locals is not supported.")
|
68
|
+
end
|
69
|
+
else
|
70
|
+
if names.empty?
|
71
|
+
msg "No #{type} variables defined#{suffix}."
|
72
|
+
else
|
73
|
+
section "#{type.capitalize} variables#{suffix}:"
|
74
|
+
names.each do |var_name|
|
75
|
+
var_value =
|
76
|
+
@proc.safe_rep(@proc.debug_eval_no_errmsg(var_name).inspect)
|
77
|
+
msg("#{var_name} = #{var_value}", :code => true)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
else
|
82
|
+
errmsg("Wrong number of arguments #{args.size}")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
def run(args)
|
86
|
+
run_for_type(args, 'local', @proc.debug_eval('self'))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
if __FILE__ == $0
|
91
|
+
# Demo it.
|
92
|
+
require_relative '../../../mock'
|
93
|
+
require_relative '../variables'
|
94
|
+
cmd = MockDebugger::subsub_setup(Trepan::SubSubcommand::InfoVariables,
|
95
|
+
Trepan::SubSubcommand::InfoVariablesLocals
|
96
|
+
)
|
97
|
+
cmd.run([])
|
98
|
+
cmd.run(['name'])
|
99
|
+
end
|
data/processor/command/kill.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
-
require_relative '
|
2
|
+
require_relative '../command'
|
3
3
|
require_relative '../../app/complete'
|
4
4
|
class Trepan::Command::KillCommand < Trepan::Command
|
5
5
|
|
@@ -25,7 +25,7 @@ Examples:
|
|
25
25
|
#{NAME} kill # same as above
|
26
26
|
#{NAME} -9 # same as above
|
27
27
|
#{NAME} 9 # same as above
|
28
|
-
#{NAME}! 9 #
|
28
|
+
#{NAME}! 9 # above, but unconditional
|
29
29
|
HELP
|
30
30
|
|
31
31
|
ALIASES = %w(kill!)
|
@@ -35,9 +35,10 @@ Examples:
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def complete(prefix)
|
38
|
-
completions = Signal.list.keys +
|
38
|
+
completions = Signal.list.keys + Signal.list.keys.map{|k| k.downcase} +
|
39
39
|
Signal.list.values.map{|i| i.to_s} +
|
40
|
-
Signal.list.values.map{|i| (-i).to_s}
|
40
|
+
Signal.list.values.map{|i| (-i).to_s} +
|
41
|
+
['unconditionally']
|
41
42
|
Trepan::Complete.complete_token(completions, prefix)
|
42
43
|
end
|
43
44
|
|
@@ -59,10 +60,10 @@ Examples:
|
|
59
60
|
end
|
60
61
|
end
|
61
62
|
begin
|
62
|
-
@proc.intf.finalize
|
63
|
+
@proc.intf.finalize if 'KILL' == sig || Signal.list['KILL'] == sig
|
63
64
|
Process.kill(sig, Process.pid)
|
64
|
-
rescue Errno::ESRCH
|
65
|
-
errmsg "Unable to send kill #{sig} to process #{Process.pid}"
|
65
|
+
rescue Errno::ESRCH, Errno::EINVAL, Errno::EPERM, RangeError
|
66
|
+
errmsg "Unable to send kill #{sig} to process #{Process.pid}: #{$!}"
|
66
67
|
end
|
67
68
|
end
|
68
69
|
end
|
@@ -70,7 +71,7 @@ end
|
|
70
71
|
if __FILE__ == $0
|
71
72
|
require_relative '../mock'
|
72
73
|
dbgr, cmd = MockDebugger::setup
|
73
|
-
%w(fooo 1 -1 HUP -9).each do |arg|
|
74
|
+
%w(fooo 100 1 -1 HUP -9).each do |arg|
|
74
75
|
puts "#{cmd.name} #{arg}"
|
75
76
|
cmd.run([cmd.name, arg])
|
76
77
|
puts '=' * 40
|
data/processor/command/list.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
require 'linecache'
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
4
|
+
require_relative '../command'
|
5
|
+
require_relative '../list'
|
6
6
|
|
7
7
|
class Trepan::Command::ListCommand < Trepan::Command
|
8
8
|
unless defined?(HELP)
|
@@ -41,8 +41,9 @@ A LOCATION is a either
|
|
41
41
|
If the location form is used with a subsequent parameter, the
|
42
42
|
parameter is the starting line number. When there two numbers are
|
43
43
|
given, the last number value is treated as a stopping line unless it
|
44
|
-
is less than the start line
|
45
|
-
number of lines to list instead.
|
44
|
+
is positive and less than the start line. In this case, it is taken to
|
45
|
+
mean the number of lines to list instead. If last is negative, we start
|
46
|
+
that many lines back from first and list to first.
|
46
47
|
|
47
48
|
Wherever a number is expected, it does not need to be a constant --
|
48
49
|
just something that evaluates to a positive integer.
|
@@ -58,6 +59,7 @@ Some examples:
|
|
58
59
|
#{NAME} foo.rb 5 6 # list lines 5 and 6 of foo.rb
|
59
60
|
#{NAME} foo.rb 5 2 # Same as above, since 2 < 5.
|
60
61
|
#{NAME} foo.rb:5 2 # Same as above
|
62
|
+
#{NAME} foo.rb 15 -5 # List lines 10..15 of foo
|
61
63
|
#{NAME} FileUtils.cp # List lines around the FileUtils.cp function.
|
62
64
|
#{NAME} . # List lines centered from where we currently are stopped
|
63
65
|
#{NAME} . 3 # List 3 lines starting from where we currently are stopped
|
@@ -81,110 +83,12 @@ enabled, while at line 255 there is an breakpoint 2 which is
|
|
81
83
|
disabled.
|
82
84
|
HELP
|
83
85
|
|
84
|
-
ALIASES = %W(l #{NAME}> l>)
|
86
|
+
ALIASES = %W(l #{NAME}> l> cat)
|
85
87
|
CATEGORY = 'files'
|
86
88
|
MAX_ARGS = 3
|
87
89
|
SHORT_HELP = 'List source code'
|
88
90
|
end
|
89
91
|
|
90
|
-
include Trepan::CmdParser
|
91
|
-
|
92
|
-
# If last is less than first, assume last is a count rather than an
|
93
|
-
# end line number.
|
94
|
-
def adjust_last(first, last)
|
95
|
-
last < first ? first + last - 1 : last
|
96
|
-
end
|
97
|
-
|
98
|
-
def frame_filename
|
99
|
-
frame = @proc.frame
|
100
|
-
|
101
|
-
container = @proc.frame_container(frame, false)
|
102
|
-
|
103
|
-
# FIXME: put into a helper routine
|
104
|
-
# See also duplicate code in print_location
|
105
|
-
if container[0] != 'file'
|
106
|
-
try_container = container
|
107
|
-
while try_container[0] != 'file' && frame.prev do
|
108
|
-
frame = frame.prev
|
109
|
-
try_container = @proc.frame_container(frame, false)
|
110
|
-
end
|
111
|
-
container = try_container if try_container[0] == 'file'
|
112
|
-
end
|
113
|
-
|
114
|
-
return container[1]
|
115
|
-
end
|
116
|
-
|
117
|
-
|
118
|
-
# What a f*cking mess. Necessitated I suppose because we want to
|
119
|
-
# allow somewhat flexible parsing with either module names, files or none
|
120
|
-
# and optional line counts or end-line numbers.
|
121
|
-
|
122
|
-
# Parses arguments for the "list" command and returns the tuple:
|
123
|
-
# filename, start, last
|
124
|
-
# or sets these to nil if there was some problem.
|
125
|
-
def parse_list_cmd(arg_str, listsize, center_correction)
|
126
|
-
|
127
|
-
iseq = nil
|
128
|
-
if arg_str.empty?
|
129
|
-
filename = frame_filename
|
130
|
-
first = [1, @proc.frame_line - center_correction].max
|
131
|
-
else
|
132
|
-
list_cmd_parse = parse_list(arg_str,
|
133
|
-
:file_exists_proc => @proc.file_exists_proc)
|
134
|
-
last = list_cmd_parse.num
|
135
|
-
position = list_cmd_parse.position
|
136
|
-
|
137
|
-
if position.is_a?(String)
|
138
|
-
if position == '-'
|
139
|
-
return no_frame_msg unless @proc.line_no
|
140
|
-
first = [1, @proc.line_no - 2*listsize - 1].max
|
141
|
-
elsif position == '.'
|
142
|
-
return no_frame_msg unless @proc.line_no
|
143
|
-
if (second = list_cmd_parse.num)
|
144
|
-
first = @proc.frame_line
|
145
|
-
last = adjust_last(first, second)
|
146
|
-
else
|
147
|
-
first = [1, @proc.frame_line - center_correction].max
|
148
|
-
last = first + listsize - 1
|
149
|
-
end
|
150
|
-
end
|
151
|
-
filename = frame_filename
|
152
|
-
else
|
153
|
-
meth, filename, offset, offset_type = @proc.parse_position(position)
|
154
|
-
iseq = meth.iseq if meth
|
155
|
-
return unless filename
|
156
|
-
if offset_type == :line
|
157
|
-
first = offset
|
158
|
-
elsif meth
|
159
|
-
iseq, first, vm_offset =
|
160
|
-
@proc.position_to_line_and_offset(meth.iseq, filename,
|
161
|
-
position, offset_type)
|
162
|
-
return [nil] * 3 unless first
|
163
|
-
elsif !offset
|
164
|
-
# Have just a filename. Go with line 1
|
165
|
-
first = 1
|
166
|
-
else
|
167
|
-
errmsg "Dunno what to do here"
|
168
|
-
return [nil] * 3
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
if last
|
174
|
-
last = adjust_last(first, last)
|
175
|
-
else
|
176
|
-
first = [1, first - center_correction].max
|
177
|
-
last = first + listsize - 1 unless last
|
178
|
-
end
|
179
|
-
LineCache::cache(filename) unless LineCache::cached?(filename)
|
180
|
-
return iseq, filename, first, last
|
181
|
-
end
|
182
|
-
|
183
|
-
def no_frame_msg
|
184
|
-
errmsg("No Ruby program loaded.")
|
185
|
-
return nil, nil, nil
|
186
|
-
end
|
187
|
-
|
188
92
|
def run(args)
|
189
93
|
if args.empty? and not frame
|
190
94
|
errmsg("No Ruby program loaded.")
|
@@ -199,7 +103,7 @@ disabled.
|
|
199
103
|
end
|
200
104
|
|
201
105
|
iseq, filename, first, last =
|
202
|
-
parse_list_cmd(@proc.cmd_argstr, listsize, center_correction)
|
106
|
+
@proc.parse_list_cmd(@proc.cmd_argstr, listsize, center_correction)
|
203
107
|
return unless filename
|
204
108
|
container = iseq ? iseq.source_container : ['file', filename]
|
205
109
|
breaklist = @proc.brkpts.line_breaks(container)
|
@@ -258,8 +162,6 @@ end
|
|
258
162
|
|
259
163
|
if __FILE__ == $0
|
260
164
|
if !(ARGV.size == 1 && ARGV[0] == 'noload')
|
261
|
-
ISEQS__ = {}
|
262
|
-
SCRIPT_ISEQS__ = {}
|
263
165
|
ARGV[0..-1] = ['noload']
|
264
166
|
load(__FILE__)
|
265
167
|
else
|
@@ -339,6 +241,6 @@ if __FILE__ == $0
|
|
339
241
|
run_cmd2(cmd, [cmd.name, line.to_s])
|
340
242
|
run_cmd2(cmd, %W(#{cmd.name} run_cmd2))
|
341
243
|
run_cmd2(cmd, %W(#{cmd.name} run_cmd2))
|
342
|
-
run_cmd2(cmd, %W(#{cmd.name} @
|
244
|
+
run_cmd2(cmd, %W(#{cmd.name} @0))
|
343
245
|
end
|
344
246
|
end
|
data/processor/command/macro.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
-
require_relative '
|
3
|
+
require_relative '../command'
|
4
4
|
require_relative '../eval'
|
5
5
|
class Trepan::Command::MacroCommand < Trepan::Command
|
6
6
|
|
@@ -10,25 +10,43 @@ class Trepan::Command::MacroCommand < Trepan::Command
|
|
10
10
|
#{NAME} MACRO-NAME PROC-OBJECT
|
11
11
|
|
12
12
|
Define MACRO-NAME as a debugger macro. Debugger macros get a list of
|
13
|
-
arguments.
|
13
|
+
arguments. Debugger macros get a list of arguments which you supply
|
14
|
+
without parenthesis or commas. See below for an example.
|
14
15
|
|
15
|
-
The macro should return either a String or an
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
The macro (really a Ruby Proc) should return either a String or an
|
17
|
+
Array of Strings. The string in both cases are strings of debugger
|
18
|
+
commands. If the return is a String, that gets tokenized by a simple
|
19
|
+
String#split . Note that macro processing is done right after
|
20
|
+
splitting on ;; so if the macro returns a string containing ;; this
|
21
|
+
will not be handled on the string returned.
|
20
22
|
|
21
23
|
If instead, Array of Strings is returned, then the first string is
|
22
|
-
|
24
|
+
shifted from the array and executed. The remaining strings are pushed
|
23
25
|
onto the command queue. In contrast to the first string, subsequent
|
24
26
|
strings can contain other macros, and ;; in those strings will be
|
25
27
|
split into separate commands.
|
26
28
|
|
27
|
-
Here is an example. The below creates a macro called
|
29
|
+
Here is an example. The below creates a macro called fin+ which
|
28
30
|
issues two commands 'finish' followed by 'step':
|
29
31
|
|
30
32
|
macro fin+ Proc.new{|*args| %w(finish step)}
|
31
33
|
|
34
|
+
If you wanted to parameterize the argument of the 'finish' command
|
35
|
+
you could do that this way:
|
36
|
+
|
37
|
+
macro fin+ Proc.new{|*args| ['finish \#{args[0]}' 'step']}
|
38
|
+
|
39
|
+
Invoking with
|
40
|
+
fin+ 3
|
41
|
+
|
42
|
+
would expand to ["finish 3", "step"]
|
43
|
+
|
44
|
+
If you were to add another parameter for 'step', the note that the
|
45
|
+
invocation might be
|
46
|
+
fin+ 3 2
|
47
|
+
|
48
|
+
rather than 'fin+(3,2)' or 'fin+ 3, 2'.
|
49
|
+
|
32
50
|
Here is another example using arguments. I use the following to debug
|
33
51
|
a debugger command:
|
34
52
|
|
data/processor/command/next.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
-
require_relative '
|
2
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
require_relative '../command'
|
4
4
|
class Trepan::Command::NoCacheCommand < Trepan::Command
|
5
5
|
|
6
6
|
unless defined?(HELP)
|
data/processor/command/pp.rb
CHANGED
data/processor/command/pr.rb
CHANGED
data/processor/command/ps.rb
CHANGED
data/processor/command/quit.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
-
require_relative '
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
require_relative '../command'
|
3
3
|
class Trepan::Command::QuitCommand < Trepan::Command
|
4
4
|
|
5
5
|
unless defined?(HELP)
|
@@ -16,7 +16,7 @@ to the OS. If no exit code is given, 0 is used.
|
|
16
16
|
|
17
17
|
Examples:
|
18
18
|
#{NAME} # quit prompting if we are interactive
|
19
|
-
#{NAME}
|
19
|
+
#{NAME} unconditionally # quit without prompting
|
20
20
|
#{NAME}! # same as above
|
21
21
|
#{NAME} 0 # same as "quit"
|
22
22
|
#{NAME}! 1 # unconditional quit setting exit code 1
|
@@ -36,7 +36,7 @@ See also the commands "exit" and "kill".
|
|
36
36
|
# This method runs the command
|
37
37
|
def run(args)
|
38
38
|
unconditional =
|
39
|
-
if args.size > 1 && args[1] == 'unconditionally'
|
39
|
+
if args.size > 1 && args[-1] == 'unconditionally'
|
40
40
|
args.shift
|
41
41
|
true
|
42
42
|
elsif args[0][-1] == '!'
|
@@ -48,8 +48,17 @@ See also the commands "exit" and "kill".
|
|
48
48
|
msg('Quit not confirmed.')
|
49
49
|
return
|
50
50
|
end
|
51
|
-
|
52
|
-
|
51
|
+
|
52
|
+
if (args.size > 1)
|
53
|
+
if args[1] =~ /\d+/
|
54
|
+
exitrc = args[1].to_i;
|
55
|
+
else
|
56
|
+
errmsg "Bad an Integer return type \"#{args[1]}\"";
|
57
|
+
return;
|
58
|
+
end
|
59
|
+
else
|
60
|
+
exitrc = 0
|
61
|
+
end
|
53
62
|
# No graceful way to stop threads...
|
54
63
|
@proc.finalize
|
55
64
|
@proc.dbgr.intf[-1].finalize
|
@@ -60,6 +69,8 @@ end
|
|
60
69
|
if __FILE__ == $0
|
61
70
|
require_relative '../mock'
|
62
71
|
dbgr, cmd = MockDebugger::setup
|
63
|
-
fork { cmd.run([cmd.name]) }
|
72
|
+
Process.fork { cmd.run([cmd.name]) } if
|
73
|
+
Process.respond_to?(:fork)
|
74
|
+
cmd.run([cmd.name, 'foo'])
|
64
75
|
cmd.run([cmd.name, '5'])
|
65
76
|
end
|
data/processor/command/raise.rb
CHANGED
data/processor/command/reload.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
3
|
require_relative 'base/submgr'
|
4
|
+
require_relative '../../app/util'
|
4
5
|
|
5
6
|
class Trepan::Command::ReloadCommand < Trepan::SubcommandMgr
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
$VERBOSE = old_verbose
|
7
|
+
Trepan::Util.suppress_warnings {
|
8
|
+
NAME = File.basename(__FILE__, '.rb')
|
9
|
+
ALIASES = %w(rel)
|
10
|
+
HELP = 'Reload information'
|
11
|
+
CATEGORY = 'data'
|
12
|
+
NEED_STACK = false
|
13
|
+
SHORT_HELP = 'Reload information'
|
14
|
+
}
|
15
|
+
|
16
16
|
def initialize(proc)
|
17
17
|
super
|
18
18
|
end
|
data/processor/command/save.rb
CHANGED
data/processor/command/server.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
3
|
require 'optparse'
|
4
|
-
require_relative '
|
4
|
+
require_relative '../command'
|
5
5
|
require_relative '../../app/default'
|
6
6
|
require_relative '../../interface/server' # server interface (remote debugging)
|
7
7
|
class Trepan::Command::ServerCommand < Trepan::Command
|