trepanning 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +237 -0
- data/NEWS +8 -0
- data/Rakefile +3 -2
- data/app/breakpoint.rb +8 -8
- data/app/brkptmgr.rb +86 -85
- data/app/client.rb +60 -0
- data/app/core.rb-consider +198 -0
- data/app/default.rb +17 -7
- data/app/disassemble.rb +12 -2
- data/app/options.rb +51 -20
- data/app/yarv.rb +183 -0
- data/bin/trepan +15 -9
- data/data/custom_require.rb +44 -0
- data/data/irbrc +41 -0
- data/data/prelude.rb +38 -0
- data/interface/base_intf.rb +10 -4
- data/interface/client.rb +79 -0
- data/interface/comcodes.rb +18 -0
- data/interface/server.rb +142 -0
- data/io/base_io.rb +57 -3
- data/io/tcpclient.rb +122 -0
- data/io/tcpfns.rb +31 -0
- data/io/tcpserver.rb +137 -0
- data/lib/trepanning.rb +57 -28
- data/processor/command/base/cmd.rb +10 -6
- data/processor/command/base/subcmd.rb +13 -1
- data/processor/command/directory.rb +15 -8
- data/processor/command/disassemble.rb +3 -2
- data/processor/command/help.rb +71 -19
- data/processor/command/info_subcmd/args.rb +2 -3
- data/processor/command/info_subcmd/breakpoints.rb +2 -3
- data/processor/command/info_subcmd/file.rb +2 -3
- data/processor/command/info_subcmd/frame.rb +2 -3
- data/processor/command/info_subcmd/iseq.rb +4 -5
- data/processor/command/info_subcmd/locals.rb +2 -3
- data/processor/command/info_subcmd/program.rb +2 -3
- data/processor/command/info_subcmd/registers.rb +2 -3
- data/processor/command/info_subcmd/return.rb +2 -3
- data/processor/command/info_subcmd/thread.rb +2 -3
- data/processor/command/list.rb +10 -6
- data/processor/command/reload.rb +1 -1
- data/processor/command/reload_subcmd/command.rb +29 -16
- data/processor/command/server.rb +70 -0
- data/processor/command/set_subcmd/auto.rb +2 -3
- data/processor/command/set_subcmd/basename.rb +2 -3
- data/processor/command/set_subcmd/debug.rb +2 -3
- data/processor/command/set_subcmd/different.rb +2 -3
- data/processor/command/set_subcmd/events.rb +2 -3
- data/processor/command/set_subcmd/hidelevel.rb +6 -7
- data/processor/command/set_subcmd/highlight.rb +32 -0
- data/processor/command/set_subcmd/max.rb +2 -3
- data/processor/command/set_subcmd/return.rb +2 -3
- data/processor/command/set_subcmd/sp.rb +2 -3
- data/processor/command/set_subcmd/substitute.rb +2 -3
- data/processor/command/set_subcmd/timer.rb +2 -3
- data/processor/command/set_subcmd/trace.rb +3 -4
- data/processor/command/show_subcmd/alias.rb +3 -3
- data/processor/command/show_subcmd/args.rb +2 -3
- data/processor/command/show_subcmd/auto.rb +1 -2
- data/processor/command/show_subcmd/basename.rb +2 -3
- data/processor/command/show_subcmd/debug.rb +1 -2
- data/processor/command/show_subcmd/different.rb +2 -1
- data/processor/command/show_subcmd/events.rb +2 -2
- data/processor/command/show_subcmd/hidelevel.rb +2 -3
- data/processor/command/show_subcmd/highlight.rb +23 -0
- data/processor/command/show_subcmd/macro.rb +2 -1
- data/processor/command/show_subcmd/max.rb +2 -3
- data/processor/command/show_subcmd/trace.rb +2 -3
- data/processor/command/source.rb +78 -28
- data/processor/default.rb +3 -2
- data/processor/load_cmds.rb +39 -19
- data/processor/location.rb +11 -7
- data/processor/main.rb +31 -15
- data/processor/mock.rb +22 -7
- data/processor/msg.rb +24 -8
- data/test/data/fname-with-blank.right +3 -0
- data/test/data/quit.right +2 -0
- data/test/functional/test-break-long.rb +87 -0
- data/test/functional/tmp/b3.rb +5 -0
- data/test/functional/tmp/immediate-bug1.rb +9 -0
- data/test/integration/helper.rb +14 -11
- data/test/integration/test-fname-with-blank.rb +5 -1
- data/test/integration/test-quit.rb +6 -2
- data/test/unit/cmd-helper.rb +9 -4
- data/test/unit/mock-helper.rb +9 -0
- data/test/unit/test-app-brkpt.rb +4 -4
- data/test/unit/test-app-brkptmgr.rb +2 -2
- data/test/unit/test-app-file.rb +0 -1
- data/test/unit/test-app-options.rb +26 -5
- data/test/unit/test-base-subcmd.rb +0 -1
- data/test/unit/test-cmd-alias.rb +0 -1
- data/test/unit/test-cmd-break.rb +0 -4
- data/test/unit/test-cmd-endisable.rb +1 -3
- data/test/unit/test-cmd-help.rb +0 -1
- data/test/unit/test-cmd-kill.rb +4 -5
- data/test/unit/test-cmd-quit.rb +4 -7
- data/test/unit/test-cmd-source.rb +33 -0
- data/test/unit/test-cmd-step.rb +0 -2
- data/test/unit/test-io-tcp.rb +32 -0
- data/test/unit/test-io-tcpclient.rb +53 -0
- data/test/unit/test-io-tcpserver.rb +49 -0
- data/test/unit/test-proc-main.rb +2 -2
- metadata +195 -175
- data/processor/command/stepi.rb +0 -63
- data/test/functional/tmp/b1.rb +0 -5
- data/test/functional/tmp/s1.rb +0 -9
- data/test/functional/tmp/t2.rb +0 -6
- data/test/integration/try-test-enable.rb +0 -11
data/app/client.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
require_relative 'default' # default debugger settings
|
4
|
+
require_relative '../interface/comcodes' # communication codes
|
5
|
+
|
6
|
+
module Trepanning
|
7
|
+
include Trepanning::RemoteCommunication
|
8
|
+
def start_client(options)
|
9
|
+
puts "Client option given"
|
10
|
+
dbgr = Trepan.new(:client => true,
|
11
|
+
:cmdfiles => [],
|
12
|
+
:initial_dir => options[:chdir],
|
13
|
+
:nx => true,
|
14
|
+
:host => options[:host],
|
15
|
+
:port => options[:port]
|
16
|
+
)
|
17
|
+
intf = dbgr.intf[-1]
|
18
|
+
while true
|
19
|
+
begin
|
20
|
+
control_code, line = intf.read_remote
|
21
|
+
rescue EOFError, Errno::EPIPE
|
22
|
+
puts "Remote debugged process closed connection"
|
23
|
+
break
|
24
|
+
end
|
25
|
+
# p [control_code, line]
|
26
|
+
case control_code
|
27
|
+
when PRINT
|
28
|
+
print line
|
29
|
+
when CONFIRM_TRUE
|
30
|
+
response = intf.confirm(line, true)
|
31
|
+
intf.write_remote(CONFIRM_REPLY, response ? 'Y' : 'N')
|
32
|
+
when CONFIRM_FALSE
|
33
|
+
response = intf.confirm(line, true)
|
34
|
+
intf.write_remote(CONFIRM_REPLY, response ? 'Y' : 'N')
|
35
|
+
when PROMPT
|
36
|
+
# require 'trepanning'
|
37
|
+
# debugger
|
38
|
+
begin
|
39
|
+
command = intf.read_command(line)
|
40
|
+
rescue EOFError
|
41
|
+
puts "user-side EOF. Quitting..."
|
42
|
+
break
|
43
|
+
end
|
44
|
+
begin
|
45
|
+
intf.write_remote(COMMAND, command)
|
46
|
+
rescue Errno::EPIPE
|
47
|
+
puts "Remote debugged process died"
|
48
|
+
break
|
49
|
+
end
|
50
|
+
when QUIT
|
51
|
+
break
|
52
|
+
when RESTART
|
53
|
+
break
|
54
|
+
else
|
55
|
+
$stderr.puts "** Unknown control code: #{control_code}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
module_function :start_client
|
60
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'thread_frame'
|
3
|
+
require 'trace'
|
4
|
+
# require_relative '../../rb-trace/app/trace'
|
5
|
+
require_relative '../processor/main'
|
6
|
+
class Debugger
|
7
|
+
# This class contains the Debugger core routines, such as an event
|
8
|
+
# processor which is responsible of handling what to do when an event is
|
9
|
+
# triggered.
|
10
|
+
#
|
11
|
+
# See also 'rdbgr' the top-level Debugger class and command-line routine
|
12
|
+
# which ultimately will call this.
|
13
|
+
|
14
|
+
class Core
|
15
|
+
attr_accessor :async_events # bitmask of asyncronous events - used all
|
16
|
+
# the time
|
17
|
+
attr_reader :dbgr # Debugger instance
|
18
|
+
attr_reader :event # String - event which triggering event
|
19
|
+
# processor
|
20
|
+
attr_reader :event_proc # Proc of method event_processor
|
21
|
+
attr_accessor :exception # Return exception to pass back. A 'raise'
|
22
|
+
# command can set this.
|
23
|
+
attr_reader :frame # ThreadFrame instance
|
24
|
+
attr_reader :hook_arg # 'arg' passed from trace hook
|
25
|
+
attr_accessor :mutex # mutex to lock out other threads from
|
26
|
+
# entering debugger while we are in it.
|
27
|
+
attr_accessor :processor # Debugger::CmdProc instance
|
28
|
+
attr_reader :settings # Hash of things you can configure
|
29
|
+
attr_accessor :step_count # Fixnum. Negative means no tracing,
|
30
|
+
# 0 means stop on next event, 1 means
|
31
|
+
# ignore one event. Step events gives the
|
32
|
+
# kind of things to count as a step.
|
33
|
+
attr_accessor :step_events # bitmask of events - used only when
|
34
|
+
# we are stepping
|
35
|
+
attr_accessor :unmaskable_events
|
36
|
+
|
37
|
+
include Trace
|
38
|
+
|
39
|
+
unless defined?(CORE_DEFAULT_SETTINGS)
|
40
|
+
# Synchronous events
|
41
|
+
STEPPING_EVENT_MASK =
|
42
|
+
LINE_EVENT_MASK | CLASS_EVENT_MASK | CALL_EVENT_MASK |
|
43
|
+
RETURN_EVENT_MASK | C_CALL_EVENT_MASK | C_RETURN_EVENT_MASK |
|
44
|
+
INSN_EVENT_MASK | BRKPT_EVENT_MASK
|
45
|
+
|
46
|
+
ASYNC_EVENT_MASK =
|
47
|
+
RAISE_EVENT_MASK | VM_EVENT_MASK | SWITCH_EVENT_MASK
|
48
|
+
|
49
|
+
CORE_DEFAULT_SETTINGS = {
|
50
|
+
:cmdproc_opts => {},
|
51
|
+
:debug_core_events => false,
|
52
|
+
:hook_name => :event_processor, # or :old_event_processor
|
53
|
+
:step_count => 0, # Stop at next event
|
54
|
+
:async_events => ASYNC_EVENT_MASK,
|
55
|
+
|
56
|
+
# FIXME:
|
57
|
+
# Somewhere inside the VM we allow I guess nested tracing which is messing
|
58
|
+
# up ThreadFrame pointers and information. When this is fixed we can do the below.
|
59
|
+
# Until then we need to at least remove C calls and returns and possibly other
|
60
|
+
# events as well.
|
61
|
+
# :step_events =>
|
62
|
+
# (DEFAULT_EVENT_MASK | INSN_EVENT_MASK)
|
63
|
+
|
64
|
+
:step_events =>
|
65
|
+
(DEFAULT_EVENT_MASK | INSN_EVENT_MASK) &
|
66
|
+
~(C_CALL_EVENT_MASK | C_RETURN_EVENT_MASK)
|
67
|
+
}
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
def initialize(debugger, settings={})
|
72
|
+
@dbgr = debugger
|
73
|
+
@exception = nil
|
74
|
+
@mutex = Mutex.new
|
75
|
+
@settings = CORE_DEFAULT_SETTINGS.merge(settings)
|
76
|
+
|
77
|
+
@step_count = @settings[:step_count]
|
78
|
+
@step_events = @settings[:step_events]
|
79
|
+
@async_events = @settings[:async_events]
|
80
|
+
@debug_events = @settings[:debug_core_events]
|
81
|
+
|
82
|
+
hook_name = @settings[:hook_name]
|
83
|
+
@event_proc = self.method(hook_name).to_proc
|
84
|
+
@processor = CmdProcessor.new(self, @settings[:cmdproc_opts])
|
85
|
+
@unmaskable_events = %w(brkpt raise switch vm)
|
86
|
+
end
|
87
|
+
|
88
|
+
def step_events_list
|
89
|
+
if 0 == @step_events
|
90
|
+
return nil
|
91
|
+
else
|
92
|
+
Trace.bitmask2events(@step_events).join(', ')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# A trace-hook processor with the interface a trace hook should have.
|
97
|
+
def event_processor(event, frame, arg=nil)
|
98
|
+
|
99
|
+
return_exception = nil
|
100
|
+
# FIXME: check for breakpoints or other unmaskable events.
|
101
|
+
# For now there are none.
|
102
|
+
|
103
|
+
@mutex.synchronize do
|
104
|
+
@frame = frame
|
105
|
+
while @frame.type == 'IFUNC'
|
106
|
+
@frame = @frame.prev
|
107
|
+
end
|
108
|
+
|
109
|
+
if @step_count > 0
|
110
|
+
@step_count -= 1
|
111
|
+
break
|
112
|
+
elsif @step_count < 0 && ! @unmaskable_events.member?(event)
|
113
|
+
break
|
114
|
+
end
|
115
|
+
|
116
|
+
@event = event
|
117
|
+
@hook_arg = arg
|
118
|
+
|
119
|
+
### debug:
|
120
|
+
### puts "#{frame.source_container[1]}:#{frame.source_location[0]}:in `#{frame.method}' #{event}" # if %w(line).member?(event)
|
121
|
+
@processor.process_commands(@frame)
|
122
|
+
|
123
|
+
# FIXME: There should be a Trace.event_mask which should return the first
|
124
|
+
# mask that matches the given trace hook.
|
125
|
+
if @step_count < 0
|
126
|
+
# If we are continuing, no need to stop at stepping events.
|
127
|
+
Trace.event_masks[0] &= ~STEPPING_EVENT_MASK
|
128
|
+
else
|
129
|
+
# Set to trace only those events we are interested in.
|
130
|
+
|
131
|
+
# Don't step/trace into Ruby routines called from here in the code
|
132
|
+
# below (e.g. "trace_hooks").
|
133
|
+
th = Thread.current
|
134
|
+
exec_event_tracing_old = th.exec_event_tracing
|
135
|
+
th.exec_event_tracing = true
|
136
|
+
|
137
|
+
# FIXME: this doesn't work. Bug in rb-trace?
|
138
|
+
# Trace.event_masks[0] = @step_events | @async_events
|
139
|
+
RubyVM::TraceHook::trace_hooks[0].event_mask =
|
140
|
+
@step_events | @async_events
|
141
|
+
th.exec_event_tracing = exec_event_tracing_old
|
142
|
+
end
|
143
|
+
|
144
|
+
# Nil out variables just in case...
|
145
|
+
|
146
|
+
return_exception = @exception
|
147
|
+
@frame = @event = @arg = @exception = nil
|
148
|
+
|
149
|
+
end
|
150
|
+
return return_exception
|
151
|
+
end
|
152
|
+
|
153
|
+
# A Ruby 1.8-style event processor. We don't use file, line, id, bind.
|
154
|
+
def old_event_processor(event, file, line, id, bind, klass)
|
155
|
+
event_processor(event, RubyVM::ThreadFrame.current.prev)
|
156
|
+
end
|
157
|
+
|
158
|
+
# Call this from inside the program you want to get a synchronous
|
159
|
+
# call to the debugger. set prev_count to the number of levels
|
160
|
+
# *before* the caller you want to skip.
|
161
|
+
def debugger(prev_count=0)
|
162
|
+
while @frame && @frame.type == 'IFUNC'
|
163
|
+
@frame = @frame.prev
|
164
|
+
end
|
165
|
+
frame = RubyVM::ThreadFrame.current.prev(prev_count+1)
|
166
|
+
@step_count = 0 # Make event processor stop
|
167
|
+
event_processor('debugger-call', frame)
|
168
|
+
end
|
169
|
+
|
170
|
+
# A trace-hook processor for 'trace var'
|
171
|
+
def trace_var_processor(val)
|
172
|
+
frame = RubyVM::ThreadFrame.current.prev
|
173
|
+
if 'CFUNC' == frame.type
|
174
|
+
# Don't need the C call that got us here.
|
175
|
+
prev = frame.prev
|
176
|
+
frame = frame.prev if prev
|
177
|
+
end
|
178
|
+
|
179
|
+
# Stop future tracing into the debugger
|
180
|
+
Thread.current.tracing = true
|
181
|
+
|
182
|
+
@step_count = 0 # Make event processor stop
|
183
|
+
event_processor('trace-var', frame)
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
end
|
188
|
+
if __FILE__ == $0
|
189
|
+
require_relative '../lib/trepan'
|
190
|
+
dbg = Debugger.new()
|
191
|
+
if ARGV.size > 0
|
192
|
+
def foo(dbg)
|
193
|
+
p 'foo here'
|
194
|
+
dbg.debugger(:immediate=>true)
|
195
|
+
end
|
196
|
+
foo(dbg)
|
197
|
+
end
|
198
|
+
end
|
data/app/default.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
2
|
# A place for the default settings
|
3
|
-
|
4
|
-
# get quite large.
|
5
|
-
module Trepanning
|
3
|
+
class Trepan
|
6
4
|
|
7
5
|
# I am not sure if we need to sets of hashes, but we'll start out
|
8
6
|
# that way.
|
@@ -14,16 +12,28 @@ module Trepanning
|
|
14
12
|
:delete_restore => true, # Delete restore profile after reading?
|
15
13
|
:initial_dir => nil, # If --cd option was given, we save it here.
|
16
14
|
:nx => false, # Don't run user startup file (e.g. .trepanrc)
|
15
|
+
|
16
|
+
# Default values used only when 'server' or 'client'
|
17
|
+
# (out-of-process debugging)
|
18
|
+
:port => 1955,
|
19
|
+
:host => 'localhost',
|
20
|
+
|
17
21
|
:restart_argv => RubyVM::OS_ARGV,
|
18
22
|
# Command run when "restart" is given.
|
19
|
-
:restore_profile => nil
|
23
|
+
:restore_profile => nil, # Profile used to set/restore debugger state
|
24
|
+
:server => false, # Out-of-process debugging?
|
20
25
|
} unless defined?(DEFAULT_SETTINGS)
|
21
26
|
|
22
27
|
# Default settings for Trepan run from the command line.
|
23
28
|
DEFAULT_CMDLINE_SETTINGS = {
|
24
29
|
:cmdfiles => [], # Initialization command files to run
|
30
|
+
:client => false, # Attach to out-of-process program?
|
25
31
|
:nx => false, # Don't run user startup file (e.g. .trepanrc)
|
26
32
|
:output => nil,
|
33
|
+
:port => DEFAULT_SETTINGS[:port],
|
34
|
+
:host => DEFAULT_SETTINGS[:host],
|
35
|
+
:server => false, # Out-of-process debugging?
|
36
|
+
# Note that at most one of :server or :client can be true.
|
27
37
|
} unless defined?(DEFAULT_CMDLINE_SETTINGS)
|
28
38
|
|
29
39
|
DEFAULT_DEBUG_STR_SETTINGS = {
|
@@ -49,7 +59,7 @@ end
|
|
49
59
|
if __FILE__ == $0
|
50
60
|
# Show it:
|
51
61
|
require 'pp'
|
52
|
-
PP.pp(
|
62
|
+
PP.pp(Trepan::DEFAULT_SETTINGS)
|
53
63
|
puts '=' * 30
|
54
|
-
PP.pp(
|
64
|
+
PP.pp(Trepan::DEFAULT_CMDLINE_SETTINGS)
|
55
65
|
end
|
data/app/disassemble.rb
CHANGED
@@ -7,7 +7,13 @@
|
|
7
7
|
class Trepan
|
8
8
|
module Disassemble
|
9
9
|
def mark_disassembly(disassembly_str, iseq_equal, pc_offset,
|
10
|
-
brkpt_offsets=[], max_width=80)
|
10
|
+
brkpt_offsets=[], max_width=80, highlight=nil)
|
11
|
+
|
12
|
+
if highlight
|
13
|
+
require_relative '../app/yarv'
|
14
|
+
highlighter = CodeRay::Duo[:yarv, :term]
|
15
|
+
end
|
16
|
+
|
11
17
|
dis_array = disassembly_str.split(/\n/)
|
12
18
|
dis_array.map do |line|
|
13
19
|
if line =~ /^(.*?)(\s+)(\(\s+\d+\))?$/
|
@@ -37,7 +43,11 @@ class Trepan
|
|
37
43
|
if (shrink_amount > 0) && line_padding.size > shrink_amount
|
38
44
|
line_padding = ' ' * (line_padding.size - shrink_amount)
|
39
45
|
end
|
40
|
-
|
46
|
+
if highlight && prefix != ''
|
47
|
+
prefix + highlighter.encode(line_begin + line_padding + line_end)
|
48
|
+
else
|
49
|
+
prefix + line_begin + line_padding + line_end
|
50
|
+
end
|
41
51
|
end
|
42
52
|
end
|
43
53
|
module_function :mark_disassembly
|
data/app/options.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
-
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
3
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
4
4
|
#=== Summary
|
5
5
|
# Parses command-line options.
|
6
6
|
#=== Options
|
@@ -26,17 +26,17 @@
|
|
26
26
|
# Show invocation help and exit.
|
27
27
|
|
28
28
|
require 'optparse'
|
29
|
-
|
29
|
+
class Trepan
|
30
30
|
require_relative 'default'
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
Trepan::VERSION = '0.1.0'
|
33
|
+
Trepan::PROGRAM = 'trepan'
|
34
34
|
|
35
|
-
def show_version
|
36
|
-
"#{PROGRAM} version #{VERSION}"
|
35
|
+
def self.show_version
|
36
|
+
"#{PROGRAM}, version #{VERSION}"
|
37
37
|
end
|
38
38
|
|
39
|
-
def copy_default_options
|
39
|
+
def self.copy_default_options
|
40
40
|
options = {}
|
41
41
|
DEFAULT_CMDLINE_SETTINGS.each do |key, value|
|
42
42
|
begin
|
@@ -48,18 +48,26 @@ module Trepanning
|
|
48
48
|
options
|
49
49
|
end
|
50
50
|
|
51
|
-
def setup_options(options, stdout=$stdout, stderr=$stderr)
|
51
|
+
def self.setup_options(options, stdout=$stdout, stderr=$stderr)
|
52
52
|
OptionParser.new do |opts|
|
53
53
|
opts.banner = <<EOB
|
54
54
|
#{show_version}
|
55
55
|
Usage: #{PROGRAM} [options] <script.rb> -- <script.rb parameters>
|
56
56
|
EOB
|
57
|
-
opts.on('--
|
58
|
-
"
|
57
|
+
opts.on('--client',
|
58
|
+
"Connect to out-of-process program") do
|
59
|
+
if options[:server]
|
60
|
+
stderr.puts "--server option previously given. --client option ignored."
|
61
|
+
else
|
62
|
+
options[:client] = true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
opts.on('-c', '--command FILE', String,
|
66
|
+
"Execute debugger commands from FILE") do |cmdfile|
|
59
67
|
if File.readable?(cmdfile)
|
60
68
|
options[:cmdfiles] << cmdfile
|
61
69
|
elsif File.exists?(cmdfile)
|
62
|
-
stderr.puts "Command file '#{cmdfile}' is not readable."
|
70
|
+
stderr.puts "Command file '#{cmdfile}' is not readable. Option ignored."
|
63
71
|
else
|
64
72
|
stderr.puts "Command file '#{cmdfile}' does not exist."
|
65
73
|
end
|
@@ -82,6 +90,18 @@ EOB
|
|
82
90
|
stderr.puts "\"#{dir}\" is not a directory. Option --cd ignored."
|
83
91
|
end
|
84
92
|
end
|
93
|
+
opts.on("-h", "--host NAME", String,
|
94
|
+
"Host or IP used in TCP connections for --server or --client. " +
|
95
|
+
"Default is #{DEFAULT_SETTINGS[:host].inspect}.") do
|
96
|
+
|name_or_ip|
|
97
|
+
options[:host] = name_or_ip
|
98
|
+
end
|
99
|
+
opts.on("-p", "--port NUMBER", Integer,
|
100
|
+
"Port number used in TCP connections for --server or --client. " +
|
101
|
+
"Default is #{DEFAULT_SETTINGS[:port]}.") do
|
102
|
+
|num|
|
103
|
+
options[:port] = num
|
104
|
+
end
|
85
105
|
opts.on("--restore PROFILE", String,
|
86
106
|
"Restore debugger state using PROFILE") do |profile|
|
87
107
|
if File.readable?(profile)
|
@@ -89,11 +109,23 @@ EOB
|
|
89
109
|
stderr.puts "Debugger command file #{profile} is not readable. --restore option ignored."
|
90
110
|
end
|
91
111
|
end
|
92
|
-
opts.
|
112
|
+
opts.on('--server',
|
113
|
+
"Set up for out-of-process debugging") do
|
114
|
+
if options[:client]
|
115
|
+
stderr.puts "--client option previously given. --server option ignored."
|
116
|
+
else
|
117
|
+
options[:server] = true
|
118
|
+
end
|
119
|
+
end
|
120
|
+
opts.on('--[no-]highlight',
|
121
|
+
"Set output for terminal highlighting") do |v|
|
122
|
+
options[:highlight] = ((v) ? :term : nil)
|
123
|
+
end
|
124
|
+
opts.on_tail("-?", "--help", "Show this message") do
|
93
125
|
options[:help] = true
|
94
126
|
stdout.puts opts
|
95
127
|
end
|
96
|
-
opts.on_tail("--version",
|
128
|
+
opts.on_tail("-v", "--version",
|
97
129
|
"print the version") do
|
98
130
|
options[:version] = true
|
99
131
|
stdout.puts show_version
|
@@ -103,20 +135,19 @@ EOB
|
|
103
135
|
end
|
104
136
|
|
105
137
|
if __FILE__ == $0
|
106
|
-
include Rbdbgr
|
107
138
|
opts = {}
|
108
139
|
options ={}
|
109
140
|
[%w(--help), %w(--version)].each do |o|
|
110
|
-
options = copy_default_options
|
111
|
-
opts = setup_options(options)
|
141
|
+
options = Trepan::copy_default_options
|
142
|
+
opts = Trepan::setup_options(options)
|
112
143
|
rest = opts.parse o
|
113
|
-
|
144
|
+
p options
|
114
145
|
puts '=' * 10
|
115
146
|
end
|
116
147
|
rest = opts.parse! ARGV
|
117
|
-
puts opts
|
148
|
+
puts opts
|
118
149
|
puts '=' * 10
|
119
|
-
|
150
|
+
p options
|
120
151
|
puts '=' * 10
|
121
|
-
|
152
|
+
p Trepan::DEFAULT_CMDLINE_SETTINGS
|
122
153
|
end
|