trepanning 0.1.0 → 0.1.1
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/.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
|