ruby-debug 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +6 -0
- data/bin/rdebug +11 -1
- data/cli/ruby-debug.rb +1 -1
- data/cli/ruby-debug/command.rb +58 -7
- data/cli/ruby-debug/commands/eval.rb +8 -1
- data/cli/ruby-debug/commands/frame.rb +2 -2
- data/cli/ruby-debug/commands/irb.rb +29 -5
- data/cli/ruby-debug/commands/list.rb +15 -0
- data/cli/ruby-debug/commands/settings.rb +8 -8
- data/cli/ruby-debug/commands/stepping.rb +2 -2
- metadata +3 -3
data/CHANGES
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
0.9.3
|
2
|
+
- Fixed if..elsif..end stepping.
|
3
|
+
- From irb session Ctrl-C or 'cont' command continues execution without showing the debugger prompt.
|
4
|
+
- Added Debugger.settings method to programatically modify command settings.
|
5
|
+
- Added Kernel#breakpoint as alias to Kernel#debugger is the former is not already defined.
|
6
|
+
|
1
7
|
0.9.2
|
2
8
|
- Fixed file comparison in Windows platform.
|
3
9
|
- Added setter methods to Breakpoint properties
|
data/bin/rdebug
CHANGED
@@ -8,9 +8,11 @@ require 'ruby-debug'
|
|
8
8
|
options = OpenStruct.new(
|
9
9
|
'server' => false,
|
10
10
|
'client' => false,
|
11
|
+
'debug_module'=> 'debug',
|
11
12
|
'host' => nil,
|
12
13
|
'port' => Debugger::PORT,
|
13
14
|
'cport' => Debugger::PORT + 1,
|
15
|
+
'control' => true,
|
14
16
|
'wait' => false,
|
15
17
|
'nostop' => false,
|
16
18
|
'post_mortem' => false,
|
@@ -32,6 +34,7 @@ EOB
|
|
32
34
|
opts.on("-h", "--host HOST", "Host name used for remote debugging") {|options.host|}
|
33
35
|
opts.on("-p", "--port PORT", Integer, "Port used for remote debugging") {|options.port|}
|
34
36
|
opts.on("--cport PORT", Integer, "Port used for contol commands") {|options.cport|}
|
37
|
+
opts.on("--no-control", "Do not automatically start control thread") {options.control = false}
|
35
38
|
opts.on("-x", "--trace", "turn on line tracing") {options.tracing = true}
|
36
39
|
opts.on("-n", "--nostop", "Do not stop when stript is loaded") {options.nostop = true}
|
37
40
|
opts.on("-m", "--post-mortem", "Activate post-mortem mode") {options.post_mortem = true}
|
@@ -44,6 +47,13 @@ EOB
|
|
44
47
|
exit
|
45
48
|
end
|
46
49
|
end
|
50
|
+
opts.on("-r", "--require debug", String,
|
51
|
+
"Compatibility with Ruby-distributed debug module") do |options.debug_module|
|
52
|
+
if options.debug_module != 'debug'
|
53
|
+
puts "Use '-r' option only with 'debug' (You supplied '#{options.debug_module}'). " +
|
54
|
+
"This option is ignored."
|
55
|
+
end
|
56
|
+
end
|
47
57
|
opts.on("--keep-frame-binding", "Keep frame bindings") {options.frame_bind = true}
|
48
58
|
opts.on("--emacs", "Activates emacs mode") {ENV['EMACS'] = '1'}
|
49
59
|
opts.separator ""
|
@@ -110,7 +120,7 @@ else
|
|
110
120
|
# activate debugger
|
111
121
|
Debugger.start
|
112
122
|
# start control thread
|
113
|
-
Debugger.start_control(options.host, options.cport)
|
123
|
+
Debugger.start_control(options.host, options.cport) if options.control
|
114
124
|
|
115
125
|
# load initrc script
|
116
126
|
load_initrc.call
|
data/cli/ruby-debug.rb
CHANGED
@@ -64,7 +64,7 @@ module Debugger
|
|
64
64
|
end
|
65
65
|
alias start_server start_remote
|
66
66
|
|
67
|
-
def start_control(host = nil, ctrl_port = PORT + 1)
|
67
|
+
def start_control(host = nil, ctrl_port = PORT + 1) # :nodoc:
|
68
68
|
raise "Debugger is not started" unless started?
|
69
69
|
return if @control_thread
|
70
70
|
@control_thread = DebugThread.new do
|
data/cli/ruby-debug/command.rb
CHANGED
@@ -42,16 +42,50 @@ module Debugger
|
|
42
42
|
def options
|
43
43
|
@options ||= {}
|
44
44
|
end
|
45
|
+
|
46
|
+
def settings_map
|
47
|
+
@@settings_map ||= {}
|
48
|
+
end
|
49
|
+
private :settings_map
|
45
50
|
|
46
|
-
def
|
47
|
-
|
51
|
+
def settings
|
52
|
+
unless @settings
|
53
|
+
@settings = Object.new
|
54
|
+
map = settings_map
|
55
|
+
class << @settings; self end.send(:define_method, :[]) do |name|
|
56
|
+
raise "No such setting #{name}" unless map.has_key?(name)
|
57
|
+
map[name][:getter].call
|
58
|
+
end
|
59
|
+
class << @settings; self end.send(:define_method, :[]=) do |name, value|
|
60
|
+
raise "No such setting #{name}" unless map.has_key?(name)
|
61
|
+
map[name][:setter].call(value)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
@settings
|
65
|
+
end
|
66
|
+
|
67
|
+
def register_setting_var(name, default)
|
68
|
+
var_name = "@@#{name}"
|
69
|
+
class_variable_set(var_name, default)
|
70
|
+
register_setting_get(name) { class_variable_get(var_name) }
|
71
|
+
register_setting_set(name) { |value| class_variable_set(var_name, value) }
|
72
|
+
end
|
73
|
+
|
74
|
+
def register_setting_get(name, &block)
|
75
|
+
settings_map[name] ||= {}
|
76
|
+
settings_map[name][:getter] = block
|
77
|
+
end
|
78
|
+
|
79
|
+
def register_setting_set(name, &block)
|
80
|
+
settings_map[name] ||= {}
|
81
|
+
settings_map[name][:setter] = block
|
48
82
|
end
|
49
83
|
end
|
50
84
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
85
|
+
register_setting_var(:stack_trace_on_error, false)
|
86
|
+
register_setting_var(:frame_full_path, true)
|
87
|
+
register_setting_var(:frame_class_names, false)
|
88
|
+
register_setting_var(:force_stepping, false)
|
55
89
|
|
56
90
|
def initialize(state)
|
57
91
|
@state = state
|
@@ -75,7 +109,7 @@ module Debugger
|
|
75
109
|
begin
|
76
110
|
val = eval(str, b)
|
77
111
|
rescue StandardError, ScriptError => e
|
78
|
-
if
|
112
|
+
if Command.settings[:stack_trace_on_error]
|
79
113
|
at = eval("caller(1)", b)
|
80
114
|
print "%s:%s\n", at.shift, e.to_s.sub(/\(eval\):1:(in `.*?':)?/, '')
|
81
115
|
for i in at
|
@@ -110,4 +144,21 @@ module Debugger
|
|
110
144
|
end
|
111
145
|
|
112
146
|
Command.load_commands
|
147
|
+
|
148
|
+
# Returns setting object.
|
149
|
+
# Use Debugger.settings[] and Debugger.settings[]= methods to query and set
|
150
|
+
# debugger settings. These settings are available:
|
151
|
+
#
|
152
|
+
# - :autolist - automatically calls 'list' command on breakpoint
|
153
|
+
# - :autoeval - evaluates input in the current binding if it's not recognized as a debugger command
|
154
|
+
# - :autoirb - automatically calls 'irb' command on breakpoint
|
155
|
+
# - :stack_trace_on_error - shows full stack trace if eval command results with an exception
|
156
|
+
# - :frame_full_path - displays full paths when showing frame stack
|
157
|
+
# - :frame_class_names - displays method's class name when showing frame stack
|
158
|
+
# - :reload_source_on_change - makes 'list' command to always display up-to-date source code
|
159
|
+
# - :force_stepping - stepping command asways move to the new line
|
160
|
+
#
|
161
|
+
def self.settings
|
162
|
+
Command.settings
|
163
|
+
end
|
113
164
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Debugger
|
2
|
-
module EvalFunctions
|
2
|
+
module EvalFunctions # :nodoc:
|
3
3
|
def run_with_binding
|
4
4
|
binding = @state.context ? get_binding : TOPLEVEL_BINDING
|
5
5
|
$__dbg_interface = @state.interface
|
@@ -23,6 +23,13 @@ module Debugger
|
|
23
23
|
|
24
24
|
include EvalFunctions
|
25
25
|
|
26
|
+
register_setting_get(:autoeval) do
|
27
|
+
EvalCommand.unknown
|
28
|
+
end
|
29
|
+
register_setting_set(:autoeval) do |value|
|
30
|
+
EvalCommand.unknown = value
|
31
|
+
end
|
32
|
+
|
26
33
|
def match(input)
|
27
34
|
@input = input
|
28
35
|
super
|
@@ -47,12 +47,12 @@ module Debugger
|
|
47
47
|
method = ""
|
48
48
|
if id
|
49
49
|
method << " in '"
|
50
|
-
method << "#{klass}." if Command.
|
50
|
+
method << "#{klass}." if Command.settings[:frame_class_names] && klass
|
51
51
|
method << id.id2name
|
52
52
|
method << "'"
|
53
53
|
end
|
54
54
|
|
55
|
-
unless Command.
|
55
|
+
unless Command.settings[:frame_full_path]
|
56
56
|
path_components = file.split(/[\\\/]/)
|
57
57
|
if path_components.size > 3
|
58
58
|
path_components[0...-3] = '...'
|
@@ -1,5 +1,15 @@
|
|
1
1
|
require 'irb'
|
2
|
+
|
2
3
|
module IRB # :nodoc:
|
4
|
+
module ExtendCommand # :nodoc:
|
5
|
+
class Continue # :nodoc:
|
6
|
+
def self.execute(conf)
|
7
|
+
throw :IRB_EXIT, :cont
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
ExtendCommandBundle.def_extend_command "cont", :Continue
|
12
|
+
|
3
13
|
def self.start_session(binding)
|
4
14
|
unless @__initialized
|
5
15
|
args = ARGV
|
@@ -16,10 +26,6 @@ module IRB # :nodoc:
|
|
16
26
|
@CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
|
17
27
|
@CONF[:MAIN_CONTEXT] = irb.context
|
18
28
|
|
19
|
-
# trap("SIGINT") do
|
20
|
-
# irb.signal_handle
|
21
|
-
# end
|
22
|
-
|
23
29
|
catch(:IRB_EXIT) do
|
24
30
|
irb.eval_input
|
25
31
|
end
|
@@ -28,6 +34,14 @@ end
|
|
28
34
|
|
29
35
|
module Debugger
|
30
36
|
class IRBCommand < Command # :nodoc:
|
37
|
+
|
38
|
+
register_setting_get(:autoirb) do
|
39
|
+
IRBCommand.always_run
|
40
|
+
end
|
41
|
+
register_setting_set(:autoirb) do |value|
|
42
|
+
IRBCommand.always_run = value
|
43
|
+
end
|
44
|
+
|
31
45
|
def regexp
|
32
46
|
/^irb$/
|
33
47
|
end
|
@@ -37,7 +51,17 @@ module Debugger
|
|
37
51
|
print "Command is available only in local mode.\n"
|
38
52
|
throw :debug_error
|
39
53
|
end
|
40
|
-
|
54
|
+
|
55
|
+
save_trap = trap("SIGINT") do
|
56
|
+
throw :IRB_EXIT, :cont if $debug_in_irb
|
57
|
+
end
|
58
|
+
|
59
|
+
$debug_in_irb = true
|
60
|
+
cont = IRB.start_session(get_binding)
|
61
|
+
@state.proceed if cont == :cont
|
62
|
+
ensure
|
63
|
+
$debug_in_irb = false
|
64
|
+
trap("SIGINT", save_trap) if save_trap
|
41
65
|
end
|
42
66
|
|
43
67
|
class << self
|
@@ -1,5 +1,13 @@
|
|
1
1
|
module Debugger
|
2
2
|
class ListCommand < Command # :nodoc:
|
3
|
+
|
4
|
+
register_setting_get(:autolist) do
|
5
|
+
ListCommand.always_run
|
6
|
+
end
|
7
|
+
register_setting_set(:autolist) do |value|
|
8
|
+
ListCommand.always_run = value
|
9
|
+
end
|
10
|
+
|
3
11
|
def regexp
|
4
12
|
/^\s*l(?:ist)?(?:\s*([-=])|\s+(.+))?$/
|
5
13
|
end
|
@@ -68,6 +76,13 @@ module Debugger
|
|
68
76
|
|
69
77
|
class ReloadCommand < Command # :nodoc:
|
70
78
|
self.control = true
|
79
|
+
|
80
|
+
register_setting_get(:reload_source_on_change) do
|
81
|
+
Debugger.reload_source_on_change
|
82
|
+
end
|
83
|
+
register_setting_set(:reload_source_on_change) do |value|
|
84
|
+
Debugger.reload_source_on_change = value
|
85
|
+
end
|
71
86
|
|
72
87
|
def regexp
|
73
88
|
/^\s*r(?:eload)?$/
|
@@ -9,28 +9,28 @@ module Debugger
|
|
9
9
|
def execute
|
10
10
|
case @match[1]
|
11
11
|
when /^(no)?autolist$/
|
12
|
-
|
12
|
+
Command.settings[:autolist] = $1.nil?
|
13
13
|
print "autolist is #{$1.nil? ? 'on' : 'off'}.\n"
|
14
14
|
when /^(no)?autoeval$/
|
15
|
-
|
15
|
+
Command.settings[:autoeval] = $1.nil?
|
16
16
|
print "autoeval is #{$1.nil? ? 'on' : 'off'}.\n"
|
17
17
|
when /^(no)?trace$/
|
18
|
-
|
18
|
+
Command.settings[:stack_trace_on_error] = $1.nil?
|
19
19
|
print "Displaying stack trace is #{$1.nil? ? 'on' : 'off'}.\n"
|
20
20
|
when /^(no)?framefullpath$/
|
21
|
-
|
21
|
+
Command.settings[:frame_full_path] = $1.nil?
|
22
22
|
print "Displaying frame's full file names is #{$1.nil? ? 'on' : 'off'}.\n"
|
23
23
|
when /^(no)?frameclassname$/
|
24
|
-
|
24
|
+
Command.settings[:frame_class_names] = $1.nil?
|
25
25
|
print "Displaying frame's original class name is #{$1.nil? ? 'on' : 'off'}.\n"
|
26
26
|
when /^(no)?autoreload$/
|
27
|
-
|
27
|
+
Command.settings[:reload_source_on_change] = $1.nil?
|
28
28
|
print "autoreload is #{$1.nil? ? 'on' : 'off'}.\n"
|
29
29
|
when /^(no)?autoirb$/
|
30
|
-
|
30
|
+
Command.settings[:autoirb] = $1.nil?
|
31
31
|
print "autoirb is #{$1.nil? ? 'on' : 'off'}.\n"
|
32
32
|
when /^(no)?forcestep$/
|
33
|
-
|
33
|
+
self.class.settings[:force_stepping] = $1.nil?
|
34
34
|
print "force-stepping is #{$1.nil? ? 'on' : 'off'}.\n"
|
35
35
|
else
|
36
36
|
print "Unknown setting.\n"
|
@@ -7,7 +7,7 @@ module Debugger
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def execute
|
10
|
-
force = @match[1] == '+' || (@match[1].nil? &&
|
10
|
+
force = @match[1] == '+' || (@match[1].nil? && Command.settings[:force_stepping])
|
11
11
|
steps = @match[2] ? @match[2].to_i : 1
|
12
12
|
@state.context.step_over steps, @state.frame_pos, force
|
13
13
|
@state.proceed
|
@@ -35,7 +35,7 @@ module Debugger
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def execute
|
38
|
-
force = @match[1] == '+' || (@match[1].nil? &&
|
38
|
+
force = @match[1] == '+' || (@match[1].nil? && Command.settings[:force_stepping])
|
39
39
|
steps = @match[2] ? @match[2].to_i : 1
|
40
40
|
@state.context.step(steps, force)
|
41
41
|
@state.proceed
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-debug
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.9.
|
7
|
-
date: 2007-04-
|
6
|
+
version: 0.9.3
|
7
|
+
date: 2007-04-27 20:32:40 -04:00
|
8
8
|
summary: Command line interface (CLI) for ruby-debug-base
|
9
9
|
require_paths:
|
10
10
|
- cli
|
@@ -78,5 +78,5 @@ dependencies:
|
|
78
78
|
requirements:
|
79
79
|
- - "="
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 0.9.
|
81
|
+
version: 0.9.3
|
82
82
|
version:
|