rbx-trepanning 0.0.1-universal-rubinius
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +376 -0
- data/LICENSE +25 -0
- data/NEWS +2 -0
- data/README.textile +28 -0
- data/Rakefile +165 -0
- data/THANKS +14 -0
- data/app/breakpoint.rb +218 -0
- data/app/breakpoint.rbc +3564 -0
- data/app/brkptmgr.rb +138 -0
- data/app/brkptmgr.rbc +2827 -0
- data/app/default.rb +61 -0
- data/app/default.rbc +1011 -0
- data/app/display.rb +35 -0
- data/app/display.rbc +968 -0
- data/app/frame.rb +98 -0
- data/app/frame.rbc +1808 -0
- data/app/irb.rb +112 -0
- data/app/irb.rbc +2111 -0
- data/app/iseq.rb +95 -0
- data/app/iseq.rbc +1801 -0
- data/app/method.rb +173 -0
- data/app/method.rbc +2492 -0
- data/app/mock.rb +13 -0
- data/app/mock.rbc +398 -0
- data/app/options.rb +123 -0
- data/app/options.rbc +2183 -0
- data/app/run.rb +86 -0
- data/app/run.rbc +1244 -0
- data/app/util.rb +49 -0
- data/app/util.rbc +1144 -0
- data/app/validate.rb +30 -0
- data/app/validate.rbc +676 -0
- data/bin/trepan.compiled.rbc +1043 -0
- data/bin/trepanx +63 -0
- data/bin/trepanx.compiled.rbc +985 -0
- data/interface/base_intf.rb +95 -0
- data/interface/base_intf.rbc +1742 -0
- data/interface/script.rb +104 -0
- data/interface/script.rbc +1642 -0
- data/interface/user.rb +91 -0
- data/interface/user.rbc +1418 -0
- data/io/base_io.rb +94 -0
- data/io/base_io.rbc +1404 -0
- data/io/input.rb +112 -0
- data/io/input.rbc +1979 -0
- data/io/null_output.rb +42 -0
- data/io/null_output.rbc +730 -0
- data/io/string_array.rb +156 -0
- data/io/string_array.rbc +2466 -0
- data/lib/trepanning.rb +398 -0
- data/lib/trepanning.rbc +6661 -0
- data/processor/breakpoint.rb +161 -0
- data/processor/command/alias.rb +55 -0
- data/processor/command/backtrace.rb +46 -0
- data/processor/command/base/cmd.rb +124 -0
- data/processor/command/base/subcmd.rb +213 -0
- data/processor/command/base/submgr.rb +179 -0
- data/processor/command/base/subsubcmd.rb +103 -0
- data/processor/command/base/subsubmgr.rb +184 -0
- data/processor/command/break.rb +100 -0
- data/processor/command/continue.rb +82 -0
- data/processor/command/delete.rb +30 -0
- data/processor/command/directory.rb +43 -0
- data/processor/command/disassemble.rb +103 -0
- data/processor/command/down.rb +54 -0
- data/processor/command/eval.rb +31 -0
- data/processor/command/exit.rb +58 -0
- data/processor/command/finish.rb +78 -0
- data/processor/command/frame.rb +89 -0
- data/processor/command/help.rb +146 -0
- data/processor/command/info.rb +28 -0
- data/processor/command/info_subcmd/breakpoints.rb +75 -0
- data/processor/command/info_subcmd/file.rb +153 -0
- data/processor/command/info_subcmd/method.rb +71 -0
- data/processor/command/info_subcmd/program.rb +59 -0
- data/processor/command/info_subcmd/variables.rb +40 -0
- data/processor/command/irb.rb +96 -0
- data/processor/command/kill.rb +70 -0
- data/processor/command/list.rb +296 -0
- data/processor/command/next.rb +66 -0
- data/processor/command/nexti.rb +59 -0
- data/processor/command/pr.rb +38 -0
- data/processor/command/ps.rb +40 -0
- data/processor/command/restart.rb +60 -0
- data/processor/command/set.rb +47 -0
- data/processor/command/set_subcmd/auto.rb +28 -0
- data/processor/command/set_subcmd/auto_subcmd/dis.rb +33 -0
- data/processor/command/set_subcmd/auto_subcmd/eval.rb +54 -0
- data/processor/command/set_subcmd/auto_subcmd/irb.rb +34 -0
- data/processor/command/set_subcmd/auto_subcmd/list.rb +34 -0
- data/processor/command/set_subcmd/basename.rb +26 -0
- data/processor/command/set_subcmd/debug.rb +27 -0
- data/processor/command/set_subcmd/debug_subcmd/dbgr.rb +36 -0
- data/processor/command/set_subcmd/debug_subcmd/skip.rb +23 -0
- data/processor/command/set_subcmd/debug_subcmd/step.rb +23 -0
- data/processor/command/set_subcmd/different.rb +60 -0
- data/processor/command/set_subcmd/hidelevel.rb +63 -0
- data/processor/command/set_subcmd/kernelstep.rb +61 -0
- data/processor/command/set_subcmd/max.rb +29 -0
- data/processor/command/set_subcmd/max_subcmd/list.rb +49 -0
- data/processor/command/set_subcmd/max_subcmd/stack.rb +50 -0
- data/processor/command/set_subcmd/max_subcmd/string.rb +54 -0
- data/processor/command/set_subcmd/max_subcmd/width.rb +49 -0
- data/processor/command/set_subcmd/substitute.rb +25 -0
- data/processor/command/set_subcmd/substitute_subcmd/path.rb +56 -0
- data/processor/command/set_subcmd/trace.rb +37 -0
- data/processor/command/set_subcmd/trace_subcmd/print.rb +57 -0
- data/processor/command/show.rb +27 -0
- data/processor/command/show_subcmd/alias.rb +43 -0
- data/processor/command/show_subcmd/args.rb +26 -0
- data/processor/command/show_subcmd/auto.rb +28 -0
- data/processor/command/show_subcmd/auto_subcmd/dis.rb +37 -0
- data/processor/command/show_subcmd/auto_subcmd/eval.rb +28 -0
- data/processor/command/show_subcmd/auto_subcmd/irb.rb +23 -0
- data/processor/command/show_subcmd/auto_subcmd/list.rb +22 -0
- data/processor/command/show_subcmd/basename.rb +22 -0
- data/processor/command/show_subcmd/debug.rb +27 -0
- data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +21 -0
- data/processor/command/show_subcmd/debug_subcmd/skip.rb +22 -0
- data/processor/command/show_subcmd/debug_subcmd/step.rb +22 -0
- data/processor/command/show_subcmd/different.rb +27 -0
- data/processor/command/show_subcmd/hidelevel.rb +42 -0
- data/processor/command/show_subcmd/kernelstep.rb +37 -0
- data/processor/command/show_subcmd/max.rb +30 -0
- data/processor/command/show_subcmd/max_subcmd/list.rb +38 -0
- data/processor/command/show_subcmd/max_subcmd/stack.rb +36 -0
- data/processor/command/show_subcmd/max_subcmd/string.rb +42 -0
- data/processor/command/show_subcmd/max_subcmd/width.rb +37 -0
- data/processor/command/show_subcmd/trace.rb +29 -0
- data/processor/command/show_subcmd/trace_subcmd/print.rb +38 -0
- data/processor/command/source.rb +83 -0
- data/processor/command/step.rb +41 -0
- data/processor/command/tbreak.rb +19 -0
- data/processor/command/unalias.rb +44 -0
- data/processor/command/up.rb +87 -0
- data/processor/default.rb +56 -0
- data/processor/disassemble.rb +32 -0
- data/processor/eval.rb +96 -0
- data/processor/frame.rb +211 -0
- data/processor/help.rb +72 -0
- data/processor/hook.rb +133 -0
- data/processor/load_cmds.rb +101 -0
- data/processor/location.rb +128 -0
- data/processor/main.rb +394 -0
- data/processor/mock.rb +137 -0
- data/processor/msg.rb +28 -0
- data/processor/running.rb +230 -0
- data/processor/stepping.rb +115 -0
- data/processor/subcmd.rb +160 -0
- data/processor/validate.rb +355 -0
- data/test/data/enable.right +36 -0
- data/test/data/fname-with-blank.cmd +6 -0
- data/test/data/fname-with-blank.right +1 -0
- data/test/data/quit-Xdebug.right +3 -0
- data/test/data/quit.cmd +5 -0
- data/test/data/quit.right +0 -0
- data/test/example/fname with blank.rb +1 -0
- data/test/example/gcd-xx.rb +18 -0
- data/test/example/gcd.rb +19 -0
- data/test/example/gcd1.rb +24 -0
- data/test/example/null.rb +1 -0
- data/test/example/thread1.rb +3 -0
- data/test/functional/fn_helper.rb +112 -0
- data/test/functional/test-break-name.rb +52 -0
- data/test/functional/test-break.rb +51 -0
- data/test/functional/test-finish.rb +70 -0
- data/test/functional/test-fn_helper.rb +43 -0
- data/test/functional/test-list.rb +55 -0
- data/test/functional/test-next-bug.rb +49 -0
- data/test/functional/test-next.rb +101 -0
- data/test/functional/test-step.rb +272 -0
- data/test/functional/test-step2.rb +35 -0
- data/test/functional/test-tbreak.rb +41 -0
- data/test/integration/file-diff.rb +89 -0
- data/test/integration/helper.rb +78 -0
- data/test/integration/test-fname-with-blank.rb +12 -0
- data/test/integration/test-quit.rb +25 -0
- data/test/unit/cmd-helper.rb +46 -0
- data/test/unit/test-app-brkpt.rb +30 -0
- data/test/unit/test-app-brkptmgr.rb +51 -0
- data/test/unit/test-app-iseq.rb +49 -0
- data/test/unit/test-app-method.rb +54 -0
- data/test/unit/test-app-options.rb +61 -0
- data/test/unit/test-app-run.rb +16 -0
- data/test/unit/test-app-util.rb +28 -0
- data/test/unit/test-app-validate.rb +18 -0
- data/test/unit/test-base-subcmd.rb +61 -0
- data/test/unit/test-bin-trepanx.rb +48 -0
- data/test/unit/test-cmd-alias.rb +49 -0
- data/test/unit/test-cmd-break.rb +23 -0
- data/test/unit/test-cmd-exit.rb +27 -0
- data/test/unit/test-cmd-help.rb +101 -0
- data/test/unit/test-cmd-kill.rb +48 -0
- data/test/unit/test-intf-user.rb +46 -0
- data/test/unit/test-io-input.rb +27 -0
- data/test/unit/test-proc-eval.rb +37 -0
- data/test/unit/test-proc-frame.rb +79 -0
- data/test/unit/test-proc-help.rb +16 -0
- data/test/unit/test-proc-hook.rb +30 -0
- data/test/unit/test-proc-load_cmds.rb +41 -0
- data/test/unit/test-proc-location.rb +48 -0
- data/test/unit/test-proc-main.rb +96 -0
- data/test/unit/test-proc-validate.rb +91 -0
- data/test/unit/test-subcmd-help.rb +51 -0
- metadata +337 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'rubygems'; require 'require_relative'
|
2
|
+
require_relative '../base/subcmd'
|
3
|
+
|
4
|
+
class Trepan::Subcommand::InfoBreakpoints < Trepan::Subcommand
|
5
|
+
HELP = <<-EOH
|
6
|
+
info breakpoints [num1 ...] [verbose]
|
7
|
+
|
8
|
+
Show status of user-settable breakpoints. If no breakpoint numbers are
|
9
|
+
given, the show all breakpoints. Otherwise only those breakpoints
|
10
|
+
listed are shown and the order given. If VERBOSE is given, more
|
11
|
+
information provided about each breakpoint.
|
12
|
+
|
13
|
+
The "Disp" column contains one of "keep", "del", the disposition of
|
14
|
+
the breakpoint after it gets hit.
|
15
|
+
|
16
|
+
The "enb" column indicates whether the breakpoint is enabled.
|
17
|
+
|
18
|
+
The "Where" column indicates where the breakpoint is located.
|
19
|
+
EOH
|
20
|
+
MIN_ABBREV = 'br'.size
|
21
|
+
NAME = File.basename(__FILE__, '.rb')
|
22
|
+
PREFIX = %w(info breakpoints)
|
23
|
+
SHORT_HELP = 'Status of user-settable breakpoints'
|
24
|
+
|
25
|
+
def run(args)
|
26
|
+
# FIXME: Originally was
|
27
|
+
# section "Breakpoints"
|
28
|
+
# Add section?
|
29
|
+
|
30
|
+
show_all =
|
31
|
+
if args.size > 2
|
32
|
+
opts = {
|
33
|
+
:msg_on_error =>
|
34
|
+
"An '#{PREFIX.join(' ')}' argument must eval to a breakpoint between 1..#{@proc.brkpts.max}.",
|
35
|
+
:min_value => 1,
|
36
|
+
:max_value => @proc.brkpts.max
|
37
|
+
}
|
38
|
+
bp_nums = @proc.get_int_list(args[2..-1])
|
39
|
+
false
|
40
|
+
else
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
44
|
+
bpmgr = @proc.brkpts
|
45
|
+
if bpmgr.empty? && @proc.dbgr.deferred_breakpoints.empty?
|
46
|
+
msg('No breakpoints.')
|
47
|
+
else
|
48
|
+
# There's at least one
|
49
|
+
bpmgr.list.each do |bp|
|
50
|
+
msg "%3d: %s" % [bp.id, bp.describe]
|
51
|
+
end
|
52
|
+
msg('Deferred breakpoints...')
|
53
|
+
@proc.dbgr.deferred_breakpoints.each_with_index do |bp, i|
|
54
|
+
if bp
|
55
|
+
msg "%3d: %s" % [i+1, bp.describe]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if __FILE__ == $0
|
63
|
+
# Demo it.
|
64
|
+
require_relative '../../mock'
|
65
|
+
name = File.basename(__FILE__, '.rb')
|
66
|
+
dbgr, cmd = MockDebugger::setup('info')
|
67
|
+
subcommand = Trepan::Subcommand::InfoBreakpoints.new(cmd)
|
68
|
+
|
69
|
+
puts '-' * 20
|
70
|
+
subcommand.run(%w(info break))
|
71
|
+
puts '-' * 20
|
72
|
+
subcommand.summary_help(name)
|
73
|
+
puts
|
74
|
+
puts '-' * 20
|
75
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
require 'rubygems'; require 'require_relative'
|
4
|
+
require 'linecache'
|
5
|
+
require_relative '../base/subcmd'
|
6
|
+
|
7
|
+
class Trepan::Subcommand::InfoFile < Trepan::Subcommand
|
8
|
+
unless defined?(HELP)
|
9
|
+
DEFAULT_FILE_ARGS = %w(size sha1)
|
10
|
+
|
11
|
+
HELP =
|
12
|
+
"info file [{FILENAME|.} [all | brkpts | sha1 | size | stat]]
|
13
|
+
|
14
|
+
Show information about the current file. If no filename is given and
|
15
|
+
the program is running then the current file associated with the
|
16
|
+
current stack entry is used. Sub options which can be shown about a file are:
|
17
|
+
|
18
|
+
brkpts -- Line numbers where there are statement boundaries.
|
19
|
+
These lines can be used in breakpoint commands.
|
20
|
+
sha1 -- A SHA1 hash of the source text. This may be useful in comparing
|
21
|
+
source code.
|
22
|
+
size -- The number of lines in the file.
|
23
|
+
stat -- File.stat information
|
24
|
+
|
25
|
+
all -- All of the above information.
|
26
|
+
|
27
|
+
If no sub-options are given #{DEFAULT_FILE_ARGS.join(' ')} are assumed.
|
28
|
+
"
|
29
|
+
MIN_ABBREV = 'fi'.size # Note we have "info frame"
|
30
|
+
NAME = File.basename(__FILE__, '.rb')
|
31
|
+
NEED_STACK = false
|
32
|
+
PREFIX = %w(info file)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get file information
|
36
|
+
def run(args)
|
37
|
+
return if args.size < 2
|
38
|
+
args << '.' if 2 == args.size
|
39
|
+
filename =
|
40
|
+
if '.' == args[2]
|
41
|
+
if not @proc.frame
|
42
|
+
errmsg("No frame - no default file.")
|
43
|
+
return false
|
44
|
+
nil
|
45
|
+
else
|
46
|
+
File.expand_path(@proc.frame.file)
|
47
|
+
end
|
48
|
+
else
|
49
|
+
args[2]
|
50
|
+
end
|
51
|
+
args += DEFAULT_FILE_ARGS if args.size == 3
|
52
|
+
|
53
|
+
m = filename + ' is'
|
54
|
+
canonic_name = LineCache::map_file(filename)
|
55
|
+
if LineCache::cached?(canonic_name)
|
56
|
+
m += " cached in debugger"
|
57
|
+
if canonic_name != filename
|
58
|
+
m += (' as:' + canonic_name)
|
59
|
+
end
|
60
|
+
m += '.'
|
61
|
+
msg(m)
|
62
|
+
# elsif !(matches = find_scripts(filename)).empty?
|
63
|
+
# if (matches.size > 1)
|
64
|
+
# msg("Multiple files found:")
|
65
|
+
# matches.each { |filename| msg("\t%s" % filename) }
|
66
|
+
# return
|
67
|
+
# else
|
68
|
+
# msg('File "%s" just now cached.' % filename)
|
69
|
+
# LineCache::cache(matches[0])
|
70
|
+
# LineCache::remap_file(matches[0], filename)
|
71
|
+
# canonic_name = matches[0]
|
72
|
+
# end
|
73
|
+
else
|
74
|
+
msg(m + ' not cached in debugger.')
|
75
|
+
return
|
76
|
+
end
|
77
|
+
seen = {}
|
78
|
+
args[3..-1].each do |arg|
|
79
|
+
processed_arg = false
|
80
|
+
|
81
|
+
if %w(all size).member?(arg)
|
82
|
+
unless seen[:size]
|
83
|
+
max_line = LineCache::size(canonic_name)
|
84
|
+
msg "File has %d lines." % max_line if max_line
|
85
|
+
end
|
86
|
+
processed_arg = seen[:size] = true
|
87
|
+
end
|
88
|
+
|
89
|
+
if %w(all sha1).member?(arg)
|
90
|
+
unless seen[:sha1]
|
91
|
+
msg("SHA1 is %s." % LineCache::sha1(canonic_name))
|
92
|
+
end
|
93
|
+
processed_arg = seen[:sha1] = true
|
94
|
+
end
|
95
|
+
|
96
|
+
if %w(all brkpts).member?(arg)
|
97
|
+
unless seen[:brkpts]
|
98
|
+
msg("Possible breakpoint line numbers:")
|
99
|
+
lines = LineCache::trace_line_numbers(canonic_name)
|
100
|
+
fmt_lines = columnize_numbers(lines)
|
101
|
+
msg(fmt_lines)
|
102
|
+
end
|
103
|
+
processed_arg = seen[:brkpts] = true
|
104
|
+
end
|
105
|
+
|
106
|
+
# if %w(all iseq).member?(arg)
|
107
|
+
# unless seen[:iseq]
|
108
|
+
# if SCRIPT_ISEQS__.member?(canonic_name)
|
109
|
+
# msg("File contains instruction sequences:")
|
110
|
+
# SCRIPT_ISEQS__[canonic_name].each do |iseq|
|
111
|
+
# msg("\t %s %s" % [iseq, iseq.name.inspect])
|
112
|
+
# end
|
113
|
+
# else
|
114
|
+
# msg("Instruction sequences not recorded; there may be some, though.")
|
115
|
+
# end
|
116
|
+
# end
|
117
|
+
# processed_arg = seen[:iseq] = true
|
118
|
+
# end
|
119
|
+
|
120
|
+
if %w(all stat).member?(arg)
|
121
|
+
unless seen[:stat]
|
122
|
+
msg("Stat info:\n\t%s." % LineCache::stat(canonic_name).inspect)
|
123
|
+
end
|
124
|
+
processed_arg = seen[:stat] = true
|
125
|
+
end
|
126
|
+
|
127
|
+
if not processed_arg
|
128
|
+
errmsg("I don't understand sub-option \"%s\"." % arg)
|
129
|
+
end
|
130
|
+
end unless args.empty?
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
if __FILE__ == $0
|
135
|
+
require_relative '../../mock'
|
136
|
+
require_relative '../../subcmd'
|
137
|
+
name = File.basename(__FILE__, '.rb')
|
138
|
+
# FIXME: DRY the below code
|
139
|
+
dbgr, cmd = MockDebugger::setup('info')
|
140
|
+
subcommand = Trepan::Subcommand::InfoFile.new(cmd)
|
141
|
+
testcmdMgr = Trepan::Subcmd.new(subcommand)
|
142
|
+
LineCache::cache(__FILE__)
|
143
|
+
|
144
|
+
[%w(info file nothere),
|
145
|
+
%w(info file .),
|
146
|
+
%w(info file),
|
147
|
+
%w(info file file.rb),
|
148
|
+
%w(info file . all),
|
149
|
+
%w(info file . lines size sha1 sha1)].each do |args|
|
150
|
+
subcommand.run(args)
|
151
|
+
puts '-' * 40
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
require 'rubygems'; require 'require_relative'
|
4
|
+
require_relative '../base/subcmd'
|
5
|
+
|
6
|
+
class Trepan::Subcommand::InfoMethod < Trepan::Subcommand
|
7
|
+
unless defined?(HELP)
|
8
|
+
HELP =
|
9
|
+
'info [METHOD|.]
|
10
|
+
|
11
|
+
Show information about a method.
|
12
|
+
|
13
|
+
Examples:
|
14
|
+
info method
|
15
|
+
info method .
|
16
|
+
info method require_relative
|
17
|
+
'
|
18
|
+
MIN_ABBREV = 'me'.size
|
19
|
+
NAME = File.basename(__FILE__, '.rb')
|
20
|
+
NEED_STACK = true
|
21
|
+
PREFIX = %w(info method)
|
22
|
+
SHORT_HELP = 'Information about a (compiled) method'
|
23
|
+
end
|
24
|
+
|
25
|
+
def run(args)
|
26
|
+
if args.size <= 2
|
27
|
+
method_name = '.'
|
28
|
+
else
|
29
|
+
method_name = args[2]
|
30
|
+
end
|
31
|
+
if '.' == method_name
|
32
|
+
meth = @proc.frame.method
|
33
|
+
# elsif ...
|
34
|
+
# # FIXME: do something if there is more than one
|
35
|
+
else
|
36
|
+
meth = nil
|
37
|
+
end
|
38
|
+
|
39
|
+
if meth
|
40
|
+
msg("Method #{meth.name}():")
|
41
|
+
%w(arity child_methods describe
|
42
|
+
file first_line lines local_count
|
43
|
+
required_args splat stack_size total_args
|
44
|
+
).each do |field|
|
45
|
+
msg " %-15s: %s" % [field, meth.send(field).inspect]
|
46
|
+
end
|
47
|
+
else
|
48
|
+
mess = "Can't find method"
|
49
|
+
mess += " for #{args.join(' ')}" unless args.empty?
|
50
|
+
errmsg mess
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
if __FILE__ == $0
|
57
|
+
# Demo it.
|
58
|
+
|
59
|
+
require_relative '../../mock'
|
60
|
+
require_relative '../../subcmd'
|
61
|
+
name = File.basename(__FILE__, '.rb')
|
62
|
+
|
63
|
+
# FIXME: DRY the below code
|
64
|
+
dbgr, cmd = MockDebugger::setup('info')
|
65
|
+
subcommand = Trepan::Subcommand::InfoMethod.new(cmd)
|
66
|
+
testcmdMgr = Trepan::Subcmd.new(subcommand)
|
67
|
+
|
68
|
+
subcommand.run([name])
|
69
|
+
name = File.basename(__FILE__, '.rb')
|
70
|
+
subcommand.summary_help(name)
|
71
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
require 'rubygems'; require 'require_relative'
|
4
|
+
require_relative '../base/subcmd'
|
5
|
+
|
6
|
+
class Trepan::Subcommand::InfoProgram < Trepan::Subcommand
|
7
|
+
unless defined?(HELP)
|
8
|
+
HELP = 'Information about debugged program and its environment'
|
9
|
+
MIN_ABBREV = 'pr'.size
|
10
|
+
NAME = File.basename(__FILE__, '.rb')
|
11
|
+
NEED_STACK = true
|
12
|
+
PREFIX = %w(info program)
|
13
|
+
end
|
14
|
+
|
15
|
+
def run(args)
|
16
|
+
frame = @proc.frame
|
17
|
+
## m = 'Program stop event: %s' % @proc.core.event
|
18
|
+
m = ''
|
19
|
+
m += "Frame index #{@proc.frame_index}, " if @proc.frame_index != 0
|
20
|
+
m +=
|
21
|
+
if frame.method
|
22
|
+
"PC offset %d of method: %s" %
|
23
|
+
[frame.next_ip, frame.method.name]
|
24
|
+
else
|
25
|
+
## '.'
|
26
|
+
end
|
27
|
+
msg m
|
28
|
+
# if 'return' == @proc.core.event
|
29
|
+
# msg 'R=> %s' % @proc.frame.sp(1).inspect
|
30
|
+
# elsif 'raise' == @proc.core.event
|
31
|
+
# msg @proc.core.hook_arg.inspect if @proc.core.hook_arg
|
32
|
+
# end
|
33
|
+
|
34
|
+
if @proc.brkpt && @proc.brkpt.event == :Breakpoint
|
35
|
+
msg('It stopped at %sbreakpoint %d.' %
|
36
|
+
[@proc.brkpt.temp? ? 'temporary ' : '',
|
37
|
+
@proc.brkpt.id])
|
38
|
+
else
|
39
|
+
msg("Program stopped at a #{@proc.event} event.")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
if __FILE__ == $0
|
46
|
+
# Demo it.
|
47
|
+
require_relative '../../mock'
|
48
|
+
name = File.basename(__FILE__, '.rb')
|
49
|
+
|
50
|
+
# FIXME: DRY the below code
|
51
|
+
dbgr, cmd = MockDebugger::setup('info')
|
52
|
+
subcommand = Trepan::Subcommand::InfoProgram.new(cmd)
|
53
|
+
testcmdMgr = Trepan::Subcmd.new(subcommand)
|
54
|
+
|
55
|
+
subcommand.run_show_bool
|
56
|
+
name = File.basename(__FILE__, '.rb')
|
57
|
+
subcommand.summary_help(name)
|
58
|
+
puts
|
59
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'; require 'require_relative'
|
2
|
+
require_relative '../base/subcmd'
|
3
|
+
|
4
|
+
class Trepan::Command::InfoVariables < Trepan::Subcommand
|
5
|
+
MIN_ABBREV = 'var'.size
|
6
|
+
NAME = File.basename(__FILE__, '.rb')
|
7
|
+
NEED_STACK = true
|
8
|
+
PREFIX = %w(info variables)
|
9
|
+
SHORT_HELP = 'Display the value of a variable or variables'
|
10
|
+
HELP = <<-HELP
|
11
|
+
Show debugger variables and user created variables. By default,
|
12
|
+
shows all variables.
|
13
|
+
|
14
|
+
The optional argument is which variable specifically to show the value of.
|
15
|
+
HELP
|
16
|
+
|
17
|
+
def run(args)
|
18
|
+
if args.size == 2
|
19
|
+
@proc.dbgr.variables.each do |name, val|
|
20
|
+
msg "var '#{name}' = #{val.inspect}"
|
21
|
+
end
|
22
|
+
|
23
|
+
if @proc.dbgr.user_variables > 0
|
24
|
+
section "User variables"
|
25
|
+
(0...@proc.dbgr.user_variables).each do |i|
|
26
|
+
str = "$d#{i}"
|
27
|
+
val = Rubinius::Globals[str.to_sym]
|
28
|
+
msg "var #{str} = #{val.inspect}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
var = args[2]
|
33
|
+
if @proc.dbgr.variables.key?(var)
|
34
|
+
msg "var '#{var}' = #{variables[var].inspect}"
|
35
|
+
else
|
36
|
+
msg "No variable set named '#{var}'"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
require 'irb'
|
3
|
+
require 'rubygems'; require 'require_relative'
|
4
|
+
require_relative 'base/cmd'
|
5
|
+
require_relative '../../app/irb'
|
6
|
+
class Trepan::Command::IRBCommand < Trepan::Command
|
7
|
+
|
8
|
+
unless defined?(HELP)
|
9
|
+
NAME = File.basename(__FILE__, '.rb')
|
10
|
+
HELP = <<-HELP
|
11
|
+
#{NAME} [-d]\tstarts an Interactive Ruby (IRB) session.
|
12
|
+
|
13
|
+
If -d is added you can get access to debugger frame the global variables
|
14
|
+
$trepanx_frame and $trepanx_cmdproc.
|
15
|
+
|
16
|
+
#{NAME} is extended with methods 'cont', 'ne', and, 'q', 'step' which
|
17
|
+
run the corresponding debugger commands 'continue', 'next', 'exit' and 'step'.
|
18
|
+
|
19
|
+
To issue a debugger command, inside #{NAME} nested inside a debugger use
|
20
|
+
'dbgr'. For example:
|
21
|
+
|
22
|
+
dbgr %w(info program)
|
23
|
+
dbgr('info', 'program') # Same as above
|
24
|
+
dbgr 'info program' # Single quoted string also works
|
25
|
+
|
26
|
+
But arguments have to be quoted because #{NAME} will evaluate them:
|
27
|
+
|
28
|
+
dbgr info program # wrong!
|
29
|
+
dbgr info, program # wrong!
|
30
|
+
dbgr(info, program) # What I say 3 times is wrong!
|
31
|
+
|
32
|
+
Here then is a loop to query VM stack values:
|
33
|
+
(-1..1).each {|i| dbgr(\"info reg sp \#{i}\")}
|
34
|
+
HELP
|
35
|
+
|
36
|
+
CATEGORY = 'support'
|
37
|
+
MAX_ARGS = 1 # Need at most this many
|
38
|
+
SHORT_HELP = "Run #{NAME} as a command subshell"
|
39
|
+
end
|
40
|
+
|
41
|
+
# This method runs the command
|
42
|
+
def run(args) # :nodoc
|
43
|
+
add_debugging =
|
44
|
+
if args.size > 1
|
45
|
+
'-d' == args[1]
|
46
|
+
else
|
47
|
+
false
|
48
|
+
end
|
49
|
+
|
50
|
+
# unless @state.interface.kind_of?(LocalInterface)
|
51
|
+
# print "Command is available only in local mode.\n"
|
52
|
+
# throw :debug_error
|
53
|
+
# end
|
54
|
+
|
55
|
+
save_trap = trap('SIGINT') do
|
56
|
+
throw :IRB_EXIT, :cont if $trepanx_in_irb
|
57
|
+
end
|
58
|
+
|
59
|
+
$trepanx = @proc.dbgr
|
60
|
+
if add_debugging
|
61
|
+
$trepanx_cmdproc = @proc
|
62
|
+
$trepanx_frame = @proc.frame
|
63
|
+
end
|
64
|
+
$trepanx_in_irb = true
|
65
|
+
$trepanx_irb_statements = nil
|
66
|
+
$trepanx_command = nil
|
67
|
+
|
68
|
+
conf = {:BACK_TRACE_LIMIT => settings[:maxstack]}
|
69
|
+
cont = IRB.start_session(@proc.frame.binding, @proc, conf).to_s
|
70
|
+
trap('SIGINT', save_trap) # Restore old trap
|
71
|
+
|
72
|
+
back_trace_limit = IRB.CurrentContext.back_trace_limit
|
73
|
+
if settings[:maxstack] != back_trace_limit
|
74
|
+
msg("\nSetting debugger's BACK_TRACE_LIMIT (%d) to match irb's last setting (%d)" %
|
75
|
+
[settings[:maxstack], back_trace_limit])
|
76
|
+
settings[:maxstack]= IRB.CurrentContext.back_trace_limit
|
77
|
+
end
|
78
|
+
|
79
|
+
if %w(continue finish next ext step).member?(cont)
|
80
|
+
@proc.commands[cont].run([cont]) # (1, {})
|
81
|
+
else
|
82
|
+
@proc.print_location
|
83
|
+
end
|
84
|
+
ensure
|
85
|
+
$trepanx_in_irb = false
|
86
|
+
# restore old trap if any
|
87
|
+
trap('SIGINT', save_trap) if save_trap
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if __FILE__ == $0
|
92
|
+
require_relative '../mock'
|
93
|
+
dbgr, cmd = MockDebugger::setup
|
94
|
+
# Get an IRB session -- the hard way :-)
|
95
|
+
cmd.run([cmd.name]) if ARGV.size > 0
|
96
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
require 'rubygems'; require 'require_relative'
|
3
|
+
require_relative 'base/cmd'
|
4
|
+
class Trepan::Command::KillCommand < Trepan::Command
|
5
|
+
|
6
|
+
unless defined?(HELP)
|
7
|
+
NAME = File.basename(__FILE__, '.rb')
|
8
|
+
HELP = <<-HELP
|
9
|
+
#{NAME} [signal-number|signal-name|unconditionally]
|
10
|
+
|
11
|
+
Kill execution of program being debugged.
|
12
|
+
|
13
|
+
Equivalent of Process.kill('KILL', Process.pid). This is an unmaskable
|
14
|
+
signal. When all else fails, e.g. in thread code, use this.
|
15
|
+
|
16
|
+
If 'unconditionally' is given, no questions are asked. Otherwise, if
|
17
|
+
we are in interactive mode, we'll prompt to make sure.
|
18
|
+
|
19
|
+
Examples:
|
20
|
+
|
21
|
+
#{NAME}
|
22
|
+
#{NAME} unconditionally
|
23
|
+
#{NAME} KILL # same as above
|
24
|
+
#{NAME} kill # same as above
|
25
|
+
#{NAME} -9 # same as above
|
26
|
+
#{NAME} 9 # same as above
|
27
|
+
HELP
|
28
|
+
|
29
|
+
CATEGORY = 'running'
|
30
|
+
MAX_ARGS = 1 # Need at most this many
|
31
|
+
SHORT_HELP = 'Send this process a POSIX signal (default "9" is "kill -9")'
|
32
|
+
end
|
33
|
+
|
34
|
+
# This method runs the command
|
35
|
+
def run(args) # :nodoc
|
36
|
+
if args.size > 1
|
37
|
+
sig = Integer(args[1]) rescue args[1]
|
38
|
+
unless sig.is_a?(Integer) || Signal.list.member?(sig.upcase)
|
39
|
+
errmsg("Signal name '#{sig}' is not a signal I know about.\n")
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
# FIXME: reinstate
|
43
|
+
# if 'KILL' == sig || Signal['KILL'] == sig
|
44
|
+
# @proc.intf.finalize
|
45
|
+
# end
|
46
|
+
else
|
47
|
+
if not confirm('Really kill?', false)
|
48
|
+
msg('Kill not confirmed.')
|
49
|
+
return
|
50
|
+
else
|
51
|
+
sig = 'KILL'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
begin
|
55
|
+
Process.kill(sig, Process.pid)
|
56
|
+
rescue Errno::ESRCH
|
57
|
+
errmsg "Unable to send kill #{sig} to process #{Process.pid}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if __FILE__ == $0
|
63
|
+
require_relative '../mock'
|
64
|
+
dbgr, cmd = MockDebugger::setup
|
65
|
+
%w(fooo 1 -1 HUP -9).each do |arg|
|
66
|
+
puts "#{cmd.name} #{arg}"
|
67
|
+
cmd.run([cmd.name, arg])
|
68
|
+
puts '=' * 40
|
69
|
+
end
|
70
|
+
end
|