trepanning 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/ChangeLog +1279 -235
- data/Makefile +13 -0
- data/NEWS +30 -0
- data/Rakefile +50 -14
- data/app/.gitignore +1 -0
- data/app/breakpoint.rb +7 -2
- data/app/brkptmgr.rb +12 -0
- data/app/cmd_parse.citrus +167 -0
- data/app/cmd_parse.kpeg +221 -0
- data/app/cmd_parse.rb +201 -0
- data/app/cmd_parser.rb +1914 -0
- data/app/complete.rb +79 -0
- data/app/condition.rb +1 -1
- data/app/core.rb +7 -11
- data/app/default.rb +1 -1
- data/app/disassemble.rb +3 -2
- data/app/file.rb +12 -36
- data/app/frame.rb +3 -2
- data/app/irb.rb +9 -5
- data/app/iseq.rb +46 -0
- data/app/options.rb +6 -30
- data/app/run.rb +5 -2
- data/app/util.rb +1 -2
- data/app/yarv.rb +11 -1
- data/bin/.gitignore +1 -0
- data/bin/trepan +6 -6
- data/data/.gitignore +1 -0
- data/interface/.gitignore +1 -0
- data/interface/base_intf.rb +9 -5
- data/interface/comcodes.rb +10 -8
- data/interface/user.rb +76 -17
- data/io/.gitignore +1 -0
- data/io/input.rb +39 -15
- data/io/tcpclient.rb +7 -1
- data/io/tcpfns.rb +5 -3
- data/io/tcpserver.rb +13 -10
- data/lib/.gitignore +1 -0
- data/lib/trepanning.rb +50 -13
- data/processor/.gitignore +1 -0
- data/processor/Makefile +7 -0
- data/processor/breakpoint.rb +7 -2
- data/processor/command/.gitignore +1 -0
- data/processor/command/Makefile +7 -0
- data/processor/command/alias.rb +2 -2
- data/processor/command/backtrace.rb +4 -0
- data/processor/command/base/cmd.rb +45 -2
- data/processor/command/base/subcmd.rb +4 -2
- data/processor/command/base/submgr.rb +23 -19
- data/processor/command/base/subsubcmd.rb +23 -1
- data/processor/command/base/subsubmgr.rb +13 -0
- data/processor/command/break.rb +34 -29
- data/processor/command/complete.rb +37 -0
- data/processor/command/condition.rb +2 -0
- data/processor/command/continue.rb +15 -18
- data/processor/command/disassemble.rb +5 -0
- data/processor/command/down.rb +1 -1
- data/processor/command/eval.rb +70 -0
- data/processor/command/exit.rb +4 -1
- data/processor/command/finish.rb +6 -4
- data/processor/command/frame.rb +6 -3
- data/processor/command/help.rb +97 -54
- data/processor/command/help/.gitignore +1 -0
- data/processor/command/help/README +10 -0
- data/processor/command/help/command.txt +48 -0
- data/processor/command/help/filename.txt +40 -0
- data/processor/command/help/location.txt +37 -0
- data/processor/command/info_subcmd/.gitignore +1 -0
- data/processor/command/info_subcmd/breakpoints.rb +9 -9
- data/processor/command/info_subcmd/{file.rb → files.rb} +92 -27
- data/processor/command/info_subcmd/frame.rb +41 -15
- data/processor/command/info_subcmd/iseq.rb +39 -17
- data/processor/command/info_subcmd/program.rb +2 -8
- data/processor/command/info_subcmd/registers.rb +12 -10
- data/processor/command/info_subcmd/registers_subcmd/.gitignore +1 -0
- data/processor/command/info_subcmd/ruby.rb +60 -0
- data/processor/command/irb.rb +26 -3
- data/processor/command/kill.rb +21 -10
- data/processor/command/list.rb +1 -1
- data/processor/command/macro.rb +37 -23
- data/processor/command/pr.rb +1 -1
- data/processor/command/reload.rb +4 -0
- data/processor/command/reload_subcmd/.gitignore +1 -0
- data/processor/command/restart.rb +9 -9
- data/processor/command/save.rb +29 -36
- data/processor/command/set_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/confirm.rb +23 -0
- data/processor/command/set_subcmd/debug_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/different.rb +2 -0
- data/processor/command/set_subcmd/events.rb +2 -0
- data/processor/command/set_subcmd/max.rb +9 -12
- data/processor/command/set_subcmd/max_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/substitute_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/trace.rb +7 -13
- data/processor/command/set_subcmd/trace_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/trace_subcmd/buffer.rb +12 -27
- data/processor/command/set_subcmd/trace_subcmd/print.rb +10 -8
- data/processor/command/set_subcmd/trace_subcmd/var.rb +6 -10
- data/processor/command/show.rb +12 -1
- data/processor/command/show_subcmd/.gitignore +1 -0
- data/processor/command/show_subcmd/alias.rb +11 -15
- data/processor/command/show_subcmd/auto_subcmd/.gitignore +1 -0
- data/processor/command/show_subcmd/basename.rb +1 -9
- data/processor/command/show_subcmd/confirm.rb +25 -0
- data/processor/command/show_subcmd/debug_subcmd/.gitignore +1 -0
- data/processor/command/show_subcmd/macro.rb +32 -14
- data/processor/command/show_subcmd/max_subcmd/.gitignore +1 -0
- data/processor/command/show_subcmd/trace_subcmd/.gitignore +1 -0
- data/processor/command/show_subcmd/trace_subcmd/buffer.rb +11 -31
- data/processor/command/show_subcmd/trace_subcmd/print.rb +4 -20
- data/processor/command/source.rb +7 -1
- data/processor/command/up.rb +7 -4
- data/processor/default.rb +3 -1
- data/processor/eval.rb +13 -0
- data/processor/eventbuf.rb +3 -2
- data/processor/frame.rb +19 -0
- data/processor/help.rb +20 -0
- data/processor/load_cmds.rb +143 -24
- data/processor/location.rb +61 -10
- data/processor/main.rb +30 -11
- data/processor/mock.rb +5 -3
- data/processor/msg.rb +17 -0
- data/processor/running.rb +1 -1
- data/processor/subcmd.rb +3 -2
- data/processor/validate.rb +173 -185
- data/sample/.gitignore +1 -0
- data/sample/list-terminal-colors.rb +139 -0
- data/sample/rocky-dot-trepanrc +14 -0
- data/sample/rocky-trepan-colors.rb +47 -0
- data/test/Makefile +7 -0
- data/test/data/.gitignore +1 -0
- data/test/data/debugger-stop.cmd +3 -0
- data/test/data/debugger-stop.right +5 -0
- data/test/data/fname-with-blank.right +0 -3
- data/test/data/quit.right +0 -1
- data/test/data/quit2.cmd +6 -0
- data/test/data/quit2.right +3 -0
- data/test/data/testing.cmd +1 -0
- data/test/example/.gitignore +1 -0
- data/test/example/debugger-stop.rb +14 -0
- data/test/functional/.gitignore +2 -0
- data/test/functional/fn_helper.rb +7 -9
- data/test/functional/test-break-long.rb +7 -7
- data/test/functional/test-break.rb +7 -7
- data/test/functional/test-condition.rb +4 -4
- data/test/functional/test-delete.rb +6 -5
- data/test/functional/test-eval.rb +115 -0
- data/test/functional/test-raise.rb +1 -1
- data/test/functional/test-return.rb +1 -1
- data/test/integration/.gitignore +2 -0
- data/test/integration/helper.rb +6 -3
- data/test/integration/test-debugger-stop.rb +22 -0
- data/test/integration/test-quit.rb +8 -0
- data/test/unit/.gitignore +1 -0
- data/test/unit/Makefile +7 -0
- data/test/unit/test-app-brkpt.rb +0 -1
- data/test/unit/test-app-cmd_parse.rb +107 -0
- data/test/unit/test-app-cmd_parser.rb +22 -0
- data/test/unit/test-app-complete.rb +38 -0
- data/test/unit/test-app-condition.rb +20 -0
- data/test/unit/test-app-iseq.rb +31 -0
- data/test/unit/test-app-options.rb +9 -1
- data/test/unit/test-app-util.rb +0 -1
- data/test/unit/test-base-cmd.rb +46 -0
- data/test/unit/test-base-subcmd.rb +11 -2
- data/test/unit/test-base-submgr.rb +23 -0
- data/test/unit/test-base-subsubcmd.rb +20 -0
- data/test/unit/test-cmd-break.rb +22 -23
- data/test/unit/test-cmd-help.rb +4 -0
- data/test/unit/test-completion.rb +43 -0
- data/test/unit/test-io-tcpclient.rb +3 -2
- data/test/unit/test-proc-load_cmds.rb +10 -1
- data/test/unit/test-proc-location.rb +39 -0
- data/test/unit/test-proc-main.rb +1 -1
- data/test/unit/test-proc-validate.rb +47 -31
- data/trepanning.gemspec +45 -0
- metadata +247 -179
- data/app/core.rb-consider +0 -198
- data/test/functional/tmp/b3.rb +0 -5
- data/test/functional/tmp/immediate-bug1.rb +0 -9
@@ -0,0 +1 @@
|
|
1
|
+
/*~
|
data/processor/Makefile
ADDED
data/processor/breakpoint.rb
CHANGED
@@ -17,6 +17,10 @@ class Trepan
|
|
17
17
|
@brkpt = nil
|
18
18
|
end
|
19
19
|
|
20
|
+
def breakpoint_finalize
|
21
|
+
@brkpts.finalize
|
22
|
+
end
|
23
|
+
|
20
24
|
def breakpoint?
|
21
25
|
@brkpt = @brkpts.find(@frame.iseq, @frame.pc_offset, @frame.binding)
|
22
26
|
@brkpts.delete_by_brkpt(@brkpt) if @brkpt && @brkpt.temp?
|
@@ -71,13 +75,14 @@ class Trepan
|
|
71
75
|
@brkpts.add(found_iseq, offset, :temp => temp)
|
72
76
|
end
|
73
77
|
|
74
|
-
def breakpoint_offset(offset, iseq, temp=false)
|
78
|
+
def breakpoint_offset(offset, iseq, condition, negate, temp=false)
|
75
79
|
# FIXME: handle breakpoint conditions.
|
76
80
|
unless iseq.offsetlines.keys.member?(offset)
|
77
81
|
errmsg("Offset #{offset} not found in #{iseq.name} for breakpoint.")
|
78
82
|
return nil
|
79
83
|
end
|
80
|
-
@brkpts.add(iseq, offset, :temp => temp, :
|
84
|
+
@brkpts.add(iseq, offset, :temp => temp, :condition => condition,
|
85
|
+
:negate => negate, :type => 'offset')
|
81
86
|
end
|
82
87
|
|
83
88
|
# Delete a breakpoint given its breakpoint number.
|
@@ -0,0 +1 @@
|
|
1
|
+
/*~
|
data/processor/command/alias.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
2
|
require_relative 'base/cmd'
|
3
3
|
|
4
4
|
class Trepan::Command::AliasCommand < Trepan::Command
|
@@ -10,7 +10,7 @@ class Trepan::Command::AliasCommand < Trepan::Command
|
|
10
10
|
|
11
11
|
Add an alias for a COMMAND
|
12
12
|
|
13
|
-
See also 'unalias'.
|
13
|
+
See also 'unalias' and 'show #{NAME}'.
|
14
14
|
HELP
|
15
15
|
|
16
16
|
CATEGORY = 'support'
|
@@ -4,6 +4,7 @@
|
|
4
4
|
# Note: don't end classname with Command (capital C) since main
|
5
5
|
# will think this a command name like QuitCommand
|
6
6
|
require 'columnize'
|
7
|
+
require_relative '../../../app/complete'
|
7
8
|
|
8
9
|
class Trepan
|
9
10
|
class Command
|
@@ -59,8 +60,8 @@ class Trepan
|
|
59
60
|
end
|
60
61
|
|
61
62
|
# Convenience short-hand for @dbgr.intf[-1].msg_nocr
|
62
|
-
def msg_nocr(msg)
|
63
|
-
@proc.msg_nocr(msg, opts
|
63
|
+
def msg_nocr(msg, opts={})
|
64
|
+
@proc.msg_nocr(msg, opts)
|
64
65
|
end
|
65
66
|
|
66
67
|
def my_const(name)
|
@@ -101,5 +102,47 @@ class Trepan
|
|
101
102
|
end
|
102
103
|
my_const(help_constant_sym)
|
103
104
|
end
|
105
|
+
|
106
|
+
# Define a method called 'complete' on the singleton class.
|
107
|
+
def self.completion(ary)
|
108
|
+
self.send(:define_method,
|
109
|
+
:complete,
|
110
|
+
Proc.new {|prefix|
|
111
|
+
Trepan::Complete.complete_token(ary, prefix) })
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
if __FILE__ == $0
|
116
|
+
class Trepan
|
117
|
+
class CmdProcessor
|
118
|
+
def initialize(dbgr)
|
119
|
+
end
|
120
|
+
def confirm(message, default)
|
121
|
+
p ['confirm: ', message, default]
|
122
|
+
end
|
123
|
+
def errmsg(message, opts)
|
124
|
+
p ['err:', message, opts]
|
125
|
+
end
|
126
|
+
def msg(message, opts)
|
127
|
+
p [message, opts]
|
128
|
+
end
|
129
|
+
def msg_nocr(message, opts)
|
130
|
+
p ['nocr: ', message, opts]
|
131
|
+
end
|
132
|
+
def section(message, opts)
|
133
|
+
p ['section: ', message, opts]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
class Command::Test < Trepan::Command
|
137
|
+
NAME = 'test'
|
138
|
+
CATEGORY = 'testcategory'
|
139
|
+
completion %w(a aa ab ba aac)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
proc = Trepan::CmdProcessor.new(nil)
|
143
|
+
cmd = Trepan::Command::Test.new(proc)
|
144
|
+
%w(confirm errmsg msg msg_nocr section).each do |meth|
|
145
|
+
cmd.send(meth, 'test', nil)
|
104
146
|
end
|
147
|
+
p cmd.complete('aa')
|
105
148
|
end
|
@@ -159,10 +159,11 @@ class Trepan
|
|
159
159
|
def summary_help(subcmd_name)
|
160
160
|
msg_nocr("%-12s: %s" % [subcmd_name, my_const(:SHORT_HELP)])
|
161
161
|
end
|
162
|
-
|
163
162
|
end
|
164
163
|
|
165
164
|
class SetBoolSubcommand < Subcommand
|
165
|
+
completion %w(on off)
|
166
|
+
|
166
167
|
def run(args)
|
167
168
|
run_set_bool(args)
|
168
169
|
end
|
@@ -200,7 +201,8 @@ module Trepanning
|
|
200
201
|
dirname = File.basename(File.dirname(File.expand_path(__file__)))
|
201
202
|
name = File.basename(__file__, '.rb')
|
202
203
|
klass.const_set('NAME', name)
|
203
|
-
klass.const_set('PREFIX', %W(#{dirname[0...-'_subcmd'.size]} #{name}))
|
204
|
+
prefix = klass.const_set('PREFIX', %W(#{dirname[0...-'_subcmd'.size]} #{name}))
|
205
|
+
klass.const_set('CMD', prefix.join(' '))
|
204
206
|
end
|
205
207
|
end
|
206
208
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
3
|
require_relative 'cmd'
|
4
4
|
require_relative '../../subcmd'
|
5
5
|
require_relative '../../help'
|
6
|
+
require_relative '../../../app/complete'
|
6
7
|
|
7
8
|
class Trepan::SubcommandMgr < Trepan::Command
|
8
9
|
|
@@ -17,7 +18,7 @@ class Trepan::SubcommandMgr < Trepan::Command
|
|
17
18
|
NEED_STACK = false
|
18
19
|
end
|
19
20
|
|
20
|
-
attr_accessor :subcmds #
|
21
|
+
attr_accessor :subcmds # Trepan::Subcmd
|
21
22
|
attr_reader :name # Name of command
|
22
23
|
attr_reader :last_args # Last arguments seen
|
23
24
|
|
@@ -75,13 +76,12 @@ class Trepan::SubcommandMgr < Trepan::Command
|
|
75
76
|
end
|
76
77
|
subcmd_names.each do |name|
|
77
78
|
next unless Trepan::SubSubcommand.constants.member?(name.to_sym)
|
78
|
-
subcmd_class =
|
79
|
+
subcmd_class = Trepan::SubSubcommand.const_get(name)
|
79
80
|
begin
|
80
|
-
cmd =
|
81
|
-
rescue
|
82
|
-
puts "Subcmd #{name} is bad"
|
81
|
+
cmd = subcmd_class.send(:new, self, parent)
|
82
|
+
rescue Exception => exc
|
83
|
+
puts "Subcmd #{name} in #{parent.name.inspect} is bad: #{exc}"
|
83
84
|
end
|
84
|
-
cmd_name = cmd.name
|
85
85
|
@subcmds.add(cmd)
|
86
86
|
end
|
87
87
|
end
|
@@ -151,7 +151,18 @@ class Trepan::SubcommandMgr < Trepan::Command
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
154
|
-
|
154
|
+
# Return an Array of subcommands that can start with +arg+. If none
|
155
|
+
# found we just return +arg+.
|
156
|
+
# FIXME: Not used any more?
|
157
|
+
def complete(prefix)
|
158
|
+
Trepan::Complete.complete_token(@subcmds.subcmds.keys, prefix)
|
159
|
+
end
|
160
|
+
|
161
|
+
def complete_token_with_next(prefix)
|
162
|
+
Trepan::Complete.complete_token_with_next(@subcmds.subcmds, prefix)
|
163
|
+
end
|
164
|
+
|
165
|
+
def run(args) # nodoc
|
155
166
|
@last_args = args
|
156
167
|
if args.size < 2 || args.size == 2 && args[-1] == '*'
|
157
168
|
summary_list(obj_const(self, :NAME), @subcmds)
|
@@ -173,15 +184,8 @@ end
|
|
173
184
|
if __FILE__ == $0
|
174
185
|
# Demo it.
|
175
186
|
require_relative '../../mock'
|
176
|
-
dbgr = MockDebugger::
|
177
|
-
|
178
|
-
cmd
|
179
|
-
|
180
|
-
puts cmd.help(%w(help set))
|
181
|
-
puts '=' * 40
|
182
|
-
# require_relative '../../../lib/trepanning)
|
183
|
-
# Trepan.debug
|
184
|
-
puts cmd.help(%w(help set *))
|
185
|
-
puts '=' * 40
|
186
|
-
puts cmd.help(%w(help set d.*))
|
187
|
+
dbgr, cmd = MockDebugger::setup('show')
|
188
|
+
p cmd.complete('d')
|
189
|
+
p cmd.subcmds.lookup('ar').prefix
|
190
|
+
p cmd.subcmds.lookup('a')
|
187
191
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
3
|
# A base class for debugger subcommands of subcommands.
|
4
4
|
#
|
5
5
|
# Note: don't end classname with Command (capital C as in SubCommand),
|
@@ -62,6 +62,7 @@ class Trepan
|
|
62
62
|
end
|
63
63
|
|
64
64
|
class SetBoolSubSubcommand < SubSubcommand
|
65
|
+
completion %w(on off)
|
65
66
|
def run(args)
|
66
67
|
run_set_bool(args)
|
67
68
|
end
|
@@ -85,6 +86,27 @@ class Trepan
|
|
85
86
|
end
|
86
87
|
end
|
87
88
|
|
89
|
+
module Trepanning
|
90
|
+
module SubSubcommand
|
91
|
+
module_function
|
92
|
+
def set_name_prefix(__file__, klass)
|
93
|
+
full_dirname = File.dirname(File.expand_path(__file__))
|
94
|
+
full_parent_dirname = File.expand_path(File.join(full_dirname, '..'))
|
95
|
+
dirname = File.basename(full_dirname)
|
96
|
+
parent_dirname = File.basename(full_parent_dirname)
|
97
|
+
name = File.basename(__file__, '.rb')
|
98
|
+
klass.const_set('NAME', name)
|
99
|
+
|
100
|
+
short_dirname = dirname[0...-'_subcmd'.size]
|
101
|
+
short_parent_dirname = parent_dirname[0...-'_subcmd'.size]
|
102
|
+
prefix = klass.const_set('PREFIX', %W(#{short_parent_dirname}
|
103
|
+
#{short_dirname} #{name}))
|
104
|
+
klass.const_set('CMD', prefix.join(' '))
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
|
88
110
|
if __FILE__ == $0
|
89
111
|
# Demo it.
|
90
112
|
require_relative '../../mock'
|
@@ -144,6 +144,19 @@ class Trepan::SubSubcommandMgr < Trepan::Subcommand
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
+
# Return an Array of subcommands that can start with +arg+. If none
|
148
|
+
# found we just return +arg+.
|
149
|
+
def complete(prefix)
|
150
|
+
prior = self.prefix.join('').size
|
151
|
+
last_args = @subcmds.list.map{|str| str[prior..-1]}
|
152
|
+
Trepan::Complete.complete_token(last_args, prefix)
|
153
|
+
end
|
154
|
+
|
155
|
+
def complete_token_with_next(prefix)
|
156
|
+
Trepan::Complete.complete_token_with_next(@subcmds.subcmds, prefix,
|
157
|
+
self.prefix.join(''))
|
158
|
+
end
|
159
|
+
|
147
160
|
def run(args)
|
148
161
|
args = @parent.last_args if args.size == 0
|
149
162
|
if args.size < 3 || args.size == 3 && args[-1] == '*'
|
data/processor/command/break.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
2
|
require_relative 'base/cmd'
|
3
3
|
require_relative '../breakpoint'
|
4
4
|
require_relative '../../app/breakpoint'
|
@@ -7,24 +7,24 @@ class Trepan::Command::BreakCommand < Trepan::Command
|
|
7
7
|
unless defined?(HELP)
|
8
8
|
NAME = File.basename(__FILE__, '.rb')
|
9
9
|
HELP = <<-HELP
|
10
|
-
#{NAME}
|
11
|
-
#{NAME}
|
10
|
+
#{NAME}
|
11
|
+
#{NAME} LOCATION [ {if|unless} CONDITION ]
|
12
12
|
|
13
|
-
Set a breakpoint.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
With method name, a breakpoint it set at the beginning of the method.
|
19
|
-
current instruction sequence. Currently you can add a module name in
|
20
|
-
front of the method name, like FileUtils.cp, but not a class name like
|
21
|
-
Dir.pwd.
|
13
|
+
Set a breakpoint. In the second form where CONDITIOn is given, the
|
14
|
+
condition is evaluated in the context of the position. We stop only If
|
15
|
+
CONDITION evalutes to non-false/nil and the "if" form used, or it is
|
16
|
+
false and the "unless" form used.\
|
22
17
|
|
23
18
|
Examples:
|
24
19
|
#{NAME}
|
25
|
-
#{NAME} 10
|
26
|
-
#{NAME}
|
20
|
+
#{NAME} 10 # set breakpoint on line 10
|
21
|
+
#{NAME} 10 if 1 == a # like above but only if a is equal to 1
|
22
|
+
#{NAME} 10 unless 1 == a # like above but only if a is equal to 1
|
23
|
+
#{NAME} me.rb:10
|
24
|
+
#{NAME} @20 # set breakpoint VM Instruction Sequence offset 20
|
27
25
|
#{NAME} Kernel.pp # Set a breakpoint at the beginning of Kernel.pp
|
26
|
+
|
27
|
+
See also condition, continue and "help location".
|
28
28
|
HELP
|
29
29
|
|
30
30
|
ALIASES = %w(b)
|
@@ -40,17 +40,12 @@ Examples:
|
|
40
40
|
# usage is "break" which means break right here
|
41
41
|
# FIXME: should handle condition
|
42
42
|
bp = @proc.breakpoint_offset(@proc.frame.pc_offset,
|
43
|
-
@proc.frame.iseq)
|
43
|
+
@proc.frame.iseq, 'true', false)
|
44
44
|
else
|
45
|
-
|
46
|
-
@proc.breakpoint_position(
|
47
|
-
return false unless
|
48
|
-
bp =
|
49
|
-
if use_offset
|
50
|
-
@proc.breakpoint_offset(position, iseq)
|
51
|
-
else
|
52
|
-
@proc.breakpoint_line(position, iseq)
|
53
|
-
end
|
45
|
+
iseq, line_number, vm_offset, condition, negate =
|
46
|
+
@proc.breakpoint_position(@proc.cmd_argstr, true)
|
47
|
+
return false unless iseq && vm_offset
|
48
|
+
bp = @proc.breakpoint_offset(vm_offset, iseq, condition, negate)
|
54
49
|
end
|
55
50
|
if bp
|
56
51
|
bp.condition = condition
|
@@ -78,15 +73,25 @@ end
|
|
78
73
|
if __FILE__ == $0
|
79
74
|
require_relative '../mock'
|
80
75
|
dbgr, cmd = MockDebugger::setup
|
81
|
-
|
82
|
-
|
76
|
+
# require_relative '../../lib/trepanning'
|
77
|
+
def run_cmd(cmd, args)
|
78
|
+
cmd.proc.instance_variable_set('@cmd_argstr', args[1..-1].join(' '))
|
79
|
+
cmd.run(args)
|
80
|
+
end
|
81
|
+
|
82
|
+
run_cmd(cmd, [cmd.name])
|
83
|
+
run_cmd(cmd, [cmd.name, __LINE__.to_s])
|
83
84
|
require 'thread_frame'
|
84
85
|
tf = RubyVM::ThreadFrame.current
|
85
86
|
pc_offset = tf.pc_offset
|
86
|
-
cmd
|
87
|
+
run_cmd(cmd, [cmd.name, "@#{pc_offset}"])
|
87
88
|
def foo
|
88
89
|
5
|
89
90
|
end
|
90
|
-
cmd
|
91
|
-
cmd
|
91
|
+
run_cmd(cmd, [cmd.name, 'foo', (__LINE__-2).to_s])
|
92
|
+
run_cmd(cmd, [cmd.name, 'foo'])
|
93
|
+
run_cmd(cmd, [cmd.name, "MockDebugger::setup"])
|
94
|
+
require 'irb'
|
95
|
+
run_cmd(cmd, [cmd.name, "IRB.start"])
|
96
|
+
run_cmd(cmd, [cmd.name, 'foo93'])
|
92
97
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
require_relative 'base/cmd'
|
3
|
+
require_relative '../load_cmds'
|
4
|
+
class Trepan::Command::CompleteCommand < Trepan::Command
|
5
|
+
|
6
|
+
unless defined?(HELP)
|
7
|
+
NAME = File.basename(__FILE__, '.rb')
|
8
|
+
HELP = <<-HELP
|
9
|
+
#{NAME} COMMAND-PREFIX
|
10
|
+
|
11
|
+
List the completions for the rest of the line as a command.
|
12
|
+
HELP
|
13
|
+
CATEGORY = 'support'
|
14
|
+
NEED_STACK = false
|
15
|
+
SHORT_HELP = 'List the completions for the rest of the line as a command'
|
16
|
+
end
|
17
|
+
|
18
|
+
# This method runs the command
|
19
|
+
def run(args) # :nodoc
|
20
|
+
last_arg = @proc.cmd_argstr.end_with?(' ') ? '' : args[-1]
|
21
|
+
@proc.complete(@proc.cmd_argstr, last_arg).each do |match|
|
22
|
+
msg match
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if __FILE__ == $0
|
28
|
+
# Demo it.
|
29
|
+
require_relative '../mock'
|
30
|
+
dbgr, cmd = MockDebugger::setup
|
31
|
+
%w(d b bt).each do |prefix|
|
32
|
+
cmd.run [cmd.name, prefix]
|
33
|
+
puts '=' * 40
|
34
|
+
end
|
35
|
+
cmd.run %w(#{cmd.name} fdafsasfda)
|
36
|
+
puts '=' * 40
|
37
|
+
end
|