ruby-debug 0.10.3 → 0.10.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +15 -0
- data/ChangeLog +461 -104
- data/Rakefile +69 -13
- data/VERSION +3 -0
- data/bin/rdebug +2 -1
- data/cli/ruby-debug.rb +8 -5
- data/cli/ruby-debug/command.rb +43 -4
- data/cli/ruby-debug/commands/breakpoints.rb +3 -1
- data/cli/ruby-debug/commands/catchpoint.rb +5 -3
- data/cli/ruby-debug/commands/{continue.RB.save → continue.RB} +0 -0
- data/cli/ruby-debug/commands/eval.rb +4 -1
- data/cli/ruby-debug/commands/frame.rb +11 -10
- data/cli/ruby-debug/commands/help.rb +5 -0
- data/cli/ruby-debug/commands/info.rb +6 -3
- data/cli/ruby-debug/commands/irb.rb +115 -12
- data/cli/ruby-debug/commands/kill.rb +50 -0
- data/cli/ruby-debug/commands/list.rb +3 -3
- data/cli/ruby-debug/commands/quit.rb +12 -6
- data/cli/ruby-debug/commands/raise.RB +41 -0
- data/cli/ruby-debug/commands/show.rb +26 -28
- data/cli/ruby-debug/helper.rb +5 -0
- data/cli/ruby-debug/interface.rb +53 -25
- data/cli/ruby-debug/processor.RB +484 -0
- data/cli/ruby-debug/processor.rb +140 -56
- data/rdbg.rb +0 -0
- data/runner.sh +7 -0
- data/test/base/base.rb +0 -0
- data/test/base/binding.rb +0 -0
- data/test/base/catchpoint.rb +0 -0
- data/test/base/reload_bug.rb +8 -0
- data/test/brkpt-class-bug.rb +8 -0
- data/test/cli/commands/unit/regexp.rb +11 -0
- data/test/config.yaml +8 -0
- data/test/data/annotate.cmd +1 -1
- data/test/data/annotate.right +3 -3
- data/test/data/break_bad.cmd +1 -1
- data/test/data/break_bad.right +1 -1
- data/test/data/break_loop_bug.right +1 -1
- data/test/data/breakpoints.cmd +1 -1
- data/test/data/breakpoints.right +3 -3
- data/test/data/brkpt-class-bug.cmd +9 -0
- data/test/data/brkpt-class-bug.right +18 -0
- data/test/data/catch.right +2 -0
- data/test/data/condition.cmd +1 -0
- data/test/data/condition.right +5 -3
- data/test/data/ctrl.right +2 -2
- data/test/data/display.right +1 -1
- data/test/data/emacs_basic.right +2 -2
- data/test/data/except-bug1.cmd +7 -0
- data/test/data/except-bug1.right +13 -0
- data/test/data/file-with-space.cmd +7 -0
- data/test/data/file-with-space.right +9 -0
- data/test/data/finish.right +1 -1
- data/test/data/frame.cmd +7 -1
- data/test/data/frame.right +12 -1
- data/test/data/info-var.right +1 -1
- data/test/data/info.cmd +1 -0
- data/test/data/info.right +21 -2
- data/test/data/list.right +1 -1
- data/test/data/method.right +1 -1
- data/test/data/post-mortem.right +5 -4
- data/test/data/save.right +1 -1
- data/test/data/setshow.cmd +0 -10
- data/test/data/setshow.right +0 -17
- data/test/dollar-0.rb +0 -0
- data/test/except-bug1.rb +4 -0
- data/test/file with space.rb +1 -0
- data/test/gcd-dbg.rb +0 -0
- data/test/helper.rb +7 -1
- data/test/pm-base.rb +0 -0
- data/test/pm.rb +1 -1
- data/test/raise.rb +0 -0
- data/test/rdebug-save.1 +7 -0
- data/test/tdebug.rb +2 -2
- data/test/test-annotate.rb +0 -0
- data/test/test-break-bad.rb +0 -0
- data/test/test-breakpoints.rb +0 -0
- data/test/test-brkpt-class-bug.rb +26 -0
- data/test/test-catch.rb +1 -1
- data/test/test-condition.rb +1 -1
- data/test/test-ctrl.rb +1 -0
- data/test/test-display.rb +0 -0
- data/test/test-dollar-0.rb +0 -0
- data/test/test-edit.rb +0 -0
- data/test/test-emacs-basic.rb +0 -0
- data/test/test-enable.rb +0 -0
- data/test/test-except-bug1.rb +31 -0
- data/test/test-file-with-space.rb +30 -0
- data/test/test-finish.rb +0 -0
- data/test/test-frame.rb +0 -0
- data/test/test-help.rb +0 -0
- data/test/test-hist.rb +0 -0
- data/test/test-info-thread.rb +0 -0
- data/test/test-info-var.rb +0 -0
- data/test/test-info.rb +0 -0
- data/test/test-init.rb +7 -1
- data/test/test-list.rb +0 -0
- data/test/test-method.rb +0 -0
- data/test/test-output.rb +0 -0
- data/test/test-pm.rb +0 -0
- data/test/test-quit.rb +0 -0
- data/test/test-raise.rb +1 -1
- data/test/test-save.rb +7 -1
- data/test/test-setshow.rb +0 -0
- data/test/test-source.rb +0 -0
- data/test/test-stepping.rb +0 -0
- data/test/test-trace.rb +0 -0
- metadata +211 -180
data/Rakefile
CHANGED
@@ -6,17 +6,37 @@ require 'rake/rdoctask'
|
|
6
6
|
require 'rake/testtask'
|
7
7
|
|
8
8
|
SO_NAME = "ruby_debug.so"
|
9
|
+
ROOT_DIR = File.dirname(__FILE__)
|
10
|
+
VERSION_FILE = ROOT_DIR + '/VERSION'
|
11
|
+
|
12
|
+
def make_version_file
|
13
|
+
ruby_debug_version = open("ext/ruby_debug.c").
|
14
|
+
grep(/^#define DEBUG_VERSION/).first[/"(.+)"/,1]
|
15
|
+
File.open(VERSION_FILE, 'w') do |f|
|
16
|
+
f.write(
|
17
|
+
"# This file was created automatically from data in ext/ruby_debug.c via:
|
18
|
+
# rake :make_version_file.
|
19
|
+
#{ruby_debug_version}
|
20
|
+
")
|
21
|
+
end
|
22
|
+
end
|
9
23
|
|
10
|
-
|
11
|
-
|
12
|
-
|
24
|
+
make_version_file unless File.exist?(VERSION_FILE)
|
25
|
+
ruby_debug_version = nil
|
26
|
+
open(VERSION_FILE).each do |line|
|
27
|
+
next if line =~ /^#/
|
28
|
+
ruby_debug_version = line.chomp
|
29
|
+
break
|
13
30
|
end
|
14
31
|
|
32
|
+
|
33
|
+
# ------- Default Package ----------
|
15
34
|
COMMON_FILES = FileList[
|
16
35
|
'AUTHORS',
|
17
36
|
'CHANGES',
|
18
37
|
'LICENSE',
|
19
38
|
'README',
|
39
|
+
'VERSION',
|
20
40
|
'Rakefile',
|
21
41
|
]
|
22
42
|
|
@@ -29,17 +49,23 @@ CLI_FILES = COMMON_FILES + FileList[
|
|
29
49
|
'ChangeLog',
|
30
50
|
'bin/*',
|
31
51
|
'doc/rdebug.1',
|
52
|
+
'test/rdebug-save.1',
|
32
53
|
'test/**/data/*.cmd',
|
33
54
|
'test/**/data/*.right',
|
55
|
+
'test/config.yaml',
|
34
56
|
'test/**/*.rb',
|
35
57
|
'rdbg.rb',
|
58
|
+
'runner.sh',
|
36
59
|
CLI_TEST_FILE_LIST
|
37
60
|
]
|
38
61
|
|
39
62
|
BASE_TEST_FILE_LIST = %w(
|
40
63
|
test/base/base.rb
|
41
64
|
test/base/binding.rb
|
42
|
-
test/base/catchpoint.rb
|
65
|
+
test/base/catchpoint.rb
|
66
|
+
test/base/reload_bug.rb
|
67
|
+
)
|
68
|
+
|
43
69
|
BASE_FILES = COMMON_FILES + FileList[
|
44
70
|
'ext/breakpoint.c',
|
45
71
|
'ext/extconf.rb',
|
@@ -51,9 +77,12 @@ BASE_FILES = COMMON_FILES + FileList[
|
|
51
77
|
]
|
52
78
|
|
53
79
|
desc "Test everything."
|
54
|
-
|
80
|
+
ext = File.join(ROOT_DIR, 'ext')
|
81
|
+
test_and_args = File.exist?(ext) ? {:test => :test_base} : [:test]
|
82
|
+
task test_and_args do
|
55
83
|
Rake::TestTask.new(:test) do |t|
|
56
|
-
t.libs
|
84
|
+
t.libs += %W(#{ROOT_DIR}/lib #{ROOT_DIR}/cli)
|
85
|
+
t.libs << ext if File.exist?(ext)
|
57
86
|
t.test_files = CLI_TEST_FILE_LIST
|
58
87
|
t.verbose = true
|
59
88
|
end
|
@@ -62,7 +91,7 @@ end
|
|
62
91
|
desc "Test ruby-debug-base."
|
63
92
|
task :test_base => :lib do
|
64
93
|
Rake::TestTask.new(:test_base) do |t|
|
65
|
-
t.libs
|
94
|
+
t.libs += ['./ext', './lib']
|
66
95
|
t.test_files = FileList[BASE_TEST_FILE_LIST]
|
67
96
|
t.verbose = true
|
68
97
|
end
|
@@ -88,9 +117,9 @@ end
|
|
88
117
|
|
89
118
|
desc "Create a GNU-style ChangeLog via svn2cl"
|
90
119
|
task :ChangeLog do
|
91
|
-
system(
|
92
|
-
system("svn2cl --authors=svn2cl_usermap
|
93
|
-
system("svn2cl --authors=svn2cl_usermap
|
120
|
+
system('svn2cl --authors=svn2cl_usermap http://ruby-debug.rubyforge.org/svn/trunk')
|
121
|
+
system("svn2cl --authors=svn2cl_usermap http://ruby-debug.rubyforge.org/svn/trunk/ext -o ext/ChangeLog")
|
122
|
+
system("svn2cl --authors=svn2cl_usermap http://ruby-debug.rubyforge.org/svn/trunk/lib -o lib/ChangeLog")
|
94
123
|
end
|
95
124
|
|
96
125
|
# Base GEM Specification
|
@@ -106,7 +135,7 @@ provides support that front-ends can build on. It provides breakpoint
|
|
106
135
|
handling, bindings for stack frames among other things.
|
107
136
|
EOF
|
108
137
|
|
109
|
-
spec.version =
|
138
|
+
spec.version = ruby_debug_version
|
110
139
|
|
111
140
|
spec.author = "Kent Sibilev"
|
112
141
|
spec.email = "ksibilev@yahoo.com"
|
@@ -136,7 +165,7 @@ cli_spec = Gem::Specification.new do |spec|
|
|
136
165
|
A generic command line interface for ruby-debug.
|
137
166
|
EOF
|
138
167
|
|
139
|
-
spec.version =
|
168
|
+
spec.version = ruby_debug_version
|
140
169
|
|
141
170
|
spec.author = "Kent Sibilev"
|
142
171
|
spec.email = "ksibilev@yahoo.com"
|
@@ -150,7 +179,7 @@ EOF
|
|
150
179
|
spec.date = Time.now
|
151
180
|
spec.rubyforge_project = 'ruby-debug'
|
152
181
|
spec.add_dependency('columnize', '>= 0.1')
|
153
|
-
spec.add_dependency('ruby-debug-base', "~> #{
|
182
|
+
spec.add_dependency('ruby-debug-base', "~> #{ruby_debug_version}.0")
|
154
183
|
|
155
184
|
# FIXME: work out operational logistics for this
|
156
185
|
# spec.test_files = FileList[CLI_TEST_FILE_LIST]
|
@@ -228,6 +257,7 @@ Rake::RDocTask.new("rdoc") do |rdoc|
|
|
228
257
|
rdoc.options << '--main' << 'README'
|
229
258
|
rdoc.rdoc_files.include('bin/**/*',
|
230
259
|
'cli/ruby-debug/commands/*.rb',
|
260
|
+
'cli/ruby-debug/*.rb',
|
231
261
|
'lib/**/*.rb',
|
232
262
|
'ext/**/ruby_debug.c',
|
233
263
|
'README',
|
@@ -253,3 +283,29 @@ task :rubyforge_upload do
|
|
253
283
|
system(release_command)
|
254
284
|
end
|
255
285
|
end
|
286
|
+
|
287
|
+
def install(spec, *opts)
|
288
|
+
args = ['gem', 'install', "pkg/#{spec.name}-#{spec.version}.gem"] + opts
|
289
|
+
args.unshift 'sudo' unless 0 == Process.uid
|
290
|
+
system(*args)
|
291
|
+
end
|
292
|
+
|
293
|
+
desc 'Install locally'
|
294
|
+
task :install => :package do
|
295
|
+
Dir.chdir(File::dirname(__FILE__)) do
|
296
|
+
# ri and rdoc take lots of time
|
297
|
+
install(base_spec, '--no-ri', '--no-rdoc')
|
298
|
+
install(cli_spec, '--no-ri', '--no-rdoc')
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
task :install_full => :package do
|
303
|
+
Dir.chdir(File::dirname(__FILE__)) do
|
304
|
+
install(base_spec)
|
305
|
+
install(cli_spec)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
task :make_version_file do
|
310
|
+
make_version_file
|
311
|
+
end
|
data/VERSION
ADDED
data/bin/rdebug
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
|
3
4
|
#=== Summary
|
4
5
|
#
|
@@ -111,7 +112,7 @@ def debug_program(options)
|
|
111
112
|
# Make sure Ruby script syntax checks okay.
|
112
113
|
# Otherwise we get a load message that looks like rdebug has
|
113
114
|
# a problem.
|
114
|
-
output = `ruby -c #{Debugger::PROG_SCRIPT} 2>&1`
|
115
|
+
output = `ruby -c #{Debugger::PROG_SCRIPT.inspect} 2>&1`
|
115
116
|
if $?.exitstatus != 0 and RUBY_PLATFORM !~ /mswin/
|
116
117
|
puts output
|
117
118
|
exit $?.exitstatus
|
data/cli/ruby-debug.rb
CHANGED
@@ -35,7 +35,7 @@ module Debugger
|
|
35
35
|
# if the call stack is truncated.
|
36
36
|
attr_accessor :start_sentinal
|
37
37
|
|
38
|
-
attr_reader :thread, :control_thread
|
38
|
+
attr_reader :thread, :control_thread, :cmd_port, :ctrl_port
|
39
39
|
|
40
40
|
def interface=(value) # :nodoc:
|
41
41
|
handler.interface = value
|
@@ -58,15 +58,16 @@ module Debugger
|
|
58
58
|
cmd_port, ctrl_port = port, port + 1
|
59
59
|
end
|
60
60
|
|
61
|
-
start_control(host, ctrl_port)
|
61
|
+
ctrl_port = start_control(host, ctrl_port)
|
62
62
|
|
63
63
|
yield if block_given?
|
64
64
|
|
65
65
|
mutex = Mutex.new
|
66
66
|
proceed = ConditionVariable.new
|
67
67
|
|
68
|
+
server = TCPServer.new(host, cmd_port)
|
69
|
+
@cmd_port = cmd_port = server.addr[1]
|
68
70
|
@thread = DebugThread.new do
|
69
|
-
server = TCPServer.new(host, cmd_port)
|
70
71
|
while (session = server.accept)
|
71
72
|
self.interface = RemoteInterface.new(session)
|
72
73
|
if wait_connection
|
@@ -86,15 +87,17 @@ module Debugger
|
|
86
87
|
|
87
88
|
def start_control(host = nil, ctrl_port = PORT + 1) # :nodoc:
|
88
89
|
raise "Debugger is not started" unless started?
|
89
|
-
return if defined?(@control_thread) && @control_thread
|
90
|
+
return @ctrl_port if defined?(@control_thread) && @control_thread
|
91
|
+
server = TCPServer.new(host, ctrl_port)
|
92
|
+
@ctrl_port = server.addr[1]
|
90
93
|
@control_thread = DebugThread.new do
|
91
|
-
server = TCPServer.new(host, ctrl_port)
|
92
94
|
while (session = server.accept)
|
93
95
|
interface = RemoteInterface.new(session)
|
94
96
|
processor = ControlCommandProcessor.new(interface)
|
95
97
|
processor.process_commands
|
96
98
|
end
|
97
99
|
end
|
100
|
+
@ctrl_port
|
98
101
|
end
|
99
102
|
|
100
103
|
#
|
data/cli/ruby-debug/command.rb
CHANGED
@@ -6,14 +6,32 @@ module Debugger
|
|
6
6
|
RUBY_DEBUG_DIR = File.expand_path(File.dirname(__FILE__)) unless
|
7
7
|
defined?(RUBY_DEBUG_DIR)
|
8
8
|
|
9
|
-
|
9
|
+
# A Debugger::Command object is is the base class for commands that
|
10
|
+
# implement a single debugger command. Individual debugger commands
|
11
|
+
# will be a subclass of this. The singleton class object is the
|
12
|
+
# command manager for all commands.
|
13
|
+
#
|
14
|
+
# Each debugger command is expected to implement the following methods:
|
15
|
+
# _regexp_:: A regular expression which input strings are matched
|
16
|
+
# against. If we have a match, run this command.
|
17
|
+
# It is the ruby-debug programmer's responsibility
|
18
|
+
# to make sure that these regular expressions match disjoint
|
19
|
+
# sets of strings. Otherwise one is arbitrarily used.
|
20
|
+
# _execute_:: Ruby code that implements the command.
|
21
|
+
# _help_:: Should return a String containing descriptive help for
|
22
|
+
# the commmand. Used by the 'help' command Debugger::HelpCommand
|
23
|
+
# _help_command_:: The name of the command listed via help.
|
24
|
+
#
|
25
|
+
# _help_ and _help_command_ methods are singleton methods, not
|
26
|
+
# instance methods like _regexp_ and _execute_.
|
27
|
+
class Command
|
10
28
|
SubcmdStruct=Struct.new(:name, :min, :short_help, :long_help) unless
|
11
29
|
defined?(SubcmdStruct)
|
12
30
|
|
13
31
|
include Columnize
|
14
32
|
|
15
|
-
# Find
|
16
|
-
# to the minimum length listed in the subcommands
|
33
|
+
# Find _param_ in _subcmds_. The _param_ id downcased and can be
|
34
|
+
# abbreviated to the minimum length listed in the subcommands
|
17
35
|
def find(subcmds, param)
|
18
36
|
param.downcase!
|
19
37
|
for try_subcmd in subcmds do
|
@@ -26,6 +44,8 @@ module Debugger
|
|
26
44
|
end
|
27
45
|
|
28
46
|
class << self
|
47
|
+
# An Array containing Debugger::Command classes that implment each
|
48
|
+
# of the debugger commands.
|
29
49
|
def commands
|
30
50
|
@commands ||= []
|
31
51
|
end
|
@@ -46,6 +66,11 @@ module Debugger
|
|
46
66
|
commands << klass
|
47
67
|
end
|
48
68
|
|
69
|
+
# Read in and "include" all the subclasses of the
|
70
|
+
# Debugger::Command class. For example
|
71
|
+
# Debugger::QuitCommand is one of them. The list of Ruby
|
72
|
+
# files to read are all the files that end .rb in directory
|
73
|
+
# Debugger::RUBY_DEBUG_DIR
|
49
74
|
def load_commands
|
50
75
|
Dir[File.join(Debugger.const_get(:RUBY_DEBUG_DIR), 'commands', '*')].each do |file|
|
51
76
|
require file if file =~ /\.rb$/
|
@@ -75,7 +100,9 @@ module Debugger
|
|
75
100
|
@@settings_map ||= {}
|
76
101
|
end
|
77
102
|
private :settings_map
|
78
|
-
|
103
|
+
|
104
|
+
# Returns a Hash of Debugger settings, @settings. If doesn't exist
|
105
|
+
# we create a @settings hash with [] setter and getter and return that.
|
79
106
|
def settings
|
80
107
|
unless true and defined? @settings and @settings
|
81
108
|
@settings = Object.new
|
@@ -165,10 +192,17 @@ module Debugger
|
|
165
192
|
@state.print(*args)
|
166
193
|
end
|
167
194
|
|
195
|
+
# Called when we are about to do a dangerous operation. _msg_
|
196
|
+
# contains a prompt message. Return _true_ if confirmed or _false_
|
197
|
+
# if not confirmed.
|
168
198
|
def confirm(msg)
|
169
199
|
@state.confirm(msg) == 'y'
|
170
200
|
end
|
171
201
|
|
202
|
+
# debug_eval like Kernel.eval or Object.instance_eval but using
|
203
|
+
# the bindings for the debugged program. If there is a
|
204
|
+
# syntax-error like exception in running eval, print an
|
205
|
+
# appropriate message and throw :debug_error
|
172
206
|
def debug_eval(str, b = get_binding)
|
173
207
|
begin
|
174
208
|
val = eval(str, b)
|
@@ -186,6 +220,10 @@ module Debugger
|
|
186
220
|
end
|
187
221
|
end
|
188
222
|
|
223
|
+
# debug_eval like Kernel.eval or Object.instance_eval but using
|
224
|
+
# the bindings for the debugged program. If there is a syntax
|
225
|
+
# error kind of exception in running eval, no warning is given and
|
226
|
+
# nil is returned.
|
189
227
|
def debug_silent_eval(str)
|
190
228
|
begin
|
191
229
|
eval(str, get_binding)
|
@@ -194,6 +232,7 @@ module Debugger
|
|
194
232
|
end
|
195
233
|
end
|
196
234
|
|
235
|
+
# Return a binding object for the debugged program.
|
197
236
|
def get_binding
|
198
237
|
@state.context.frame_binding(@state.frame_pos)
|
199
238
|
end
|
@@ -81,7 +81,9 @@ module Debugger
|
|
81
81
|
errmsg "We are not in a state we can add breakpoints.\n"
|
82
82
|
return
|
83
83
|
end
|
84
|
-
|
84
|
+
brkpt_filename = File.basename(brkpt_filename) if
|
85
|
+
Command.settings[:basename]
|
86
|
+
b = Debugger.add_breakpoint brkpt_filename, line, expr
|
85
87
|
print "Breakpoint %d file %s, line %s\n", b.id, brkpt_filename, line.to_s
|
86
88
|
unless syntax_valid?(expr)
|
87
89
|
errmsg("Expression \"#{expr}\" syntactically incorrect; breakpoint disabled.\n")
|
@@ -43,9 +43,11 @@ module Debugger
|
|
43
43
|
|
44
44
|
def help(cmd)
|
45
45
|
%{
|
46
|
-
cat[ch]\t\
|
47
|
-
cat[ch] <exception-name
|
48
|
-
|
46
|
+
cat[ch]\t\tsame as "info catch"
|
47
|
+
cat[ch] <exception-name> [on|off]
|
48
|
+
\tIntercept <exception-name> when there would otherwise be no handler.
|
49
|
+
\tWith an "on" or "off", turn handling the exception on or off.
|
50
|
+
cat[ch] off\tdelete all catchpoints
|
49
51
|
}
|
50
52
|
end
|
51
53
|
end
|
File without changes
|
@@ -3,7 +3,8 @@ module Debugger
|
|
3
3
|
def run_with_binding
|
4
4
|
binding = @state.context ? get_binding : TOPLEVEL_BINDING
|
5
5
|
$__dbg_interface = @state.interface
|
6
|
-
|
6
|
+
begin
|
7
|
+
eval(<<-EOC, binding)
|
7
8
|
__dbg_verbose_save=$VERBOSE; $VERBOSE=false
|
8
9
|
def dbg_print(*args)
|
9
10
|
$__dbg_interface.print(*args)
|
@@ -16,6 +17,8 @@ module Debugger
|
|
16
17
|
end
|
17
18
|
$VERBOSE=__dbg_verbose_save
|
18
19
|
EOC
|
20
|
+
rescue
|
21
|
+
end
|
19
22
|
yield binding
|
20
23
|
ensure
|
21
24
|
$__dbg_interface = nil
|
@@ -101,7 +101,7 @@ module Debugger
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
print file_line
|
104
|
-
if
|
104
|
+
if Debugger.inside_emacs? && adjust
|
105
105
|
fmt = (Debugger.annotate.to_i > 1 ?
|
106
106
|
"\032\032source %s:%d\n" : "\032\032%s:%d\n")
|
107
107
|
print fmt % [CommandProcessor.canonic_file(file), line]
|
@@ -168,7 +168,8 @@ module Debugger
|
|
168
168
|
|
169
169
|
end
|
170
170
|
if truncated_callstack?(@state.context, Debugger.start_sentinal)
|
171
|
-
print "Warning: saved frames may be incomplete
|
171
|
+
print "Warning: saved frames may be incomplete;\n"
|
172
|
+
print "compare debugger backtrace (bt) with Ruby caller(0).\n"
|
172
173
|
end
|
173
174
|
end
|
174
175
|
|
@@ -198,7 +199,7 @@ The position of the current frame is marked with -->. }
|
|
198
199
|
|
199
200
|
class UpCommand < Command # :nodoc:
|
200
201
|
def regexp
|
201
|
-
/^\s* u(?:p)? (?:\s+(
|
202
|
+
/^\s* u(?:p)? (?:\s+(\S+))? $/x
|
202
203
|
end
|
203
204
|
|
204
205
|
def execute
|
@@ -222,7 +223,7 @@ The position of the current frame is marked with -->. }
|
|
222
223
|
|
223
224
|
class DownCommand < Command # :nodoc:
|
224
225
|
def regexp
|
225
|
-
/^\s* down (?:\s+(
|
226
|
+
/^\s* down (?:\s+(\S+))? $/x
|
226
227
|
end
|
227
228
|
|
228
229
|
def execute
|
@@ -255,8 +256,7 @@ The position of the current frame is marked with -->. }
|
|
255
256
|
|
256
257
|
def execute
|
257
258
|
if not @match[1]
|
258
|
-
|
259
|
-
return
|
259
|
+
pos = 0
|
260
260
|
else
|
261
261
|
pos = get_int(@match[1], "Frame")
|
262
262
|
return unless pos
|
@@ -280,8 +280,9 @@ The position of the current frame is marked with -->. }
|
|
280
280
|
|
281
281
|
def help(cmd)
|
282
282
|
%{
|
283
|
-
f[rame] frame-number [thread thread-number]
|
284
|
-
Move the current frame to the specified frame number
|
283
|
+
f[rame] [frame-number [thread thread-number]]
|
284
|
+
Move the current frame to the specified frame number, or the
|
285
|
+
0 if no frame-number has been given.
|
285
286
|
|
286
287
|
A negative number indicates position from the other end. So
|
287
288
|
'frame -1' moves to the oldest frame, and 'frame 0' moves to
|
@@ -289,10 +290,10 @@ The position of the current frame is marked with -->. }
|
|
289
290
|
|
290
291
|
Without an argument, the command prints the current stack
|
291
292
|
frame. Since the current position is redisplayed, it may trigger a
|
292
|
-
|
293
|
+
resynchronization if there is a front end also watching over
|
293
294
|
things.
|
294
295
|
|
295
|
-
If a thread number is given then we set the context for evaluating
|
296
|
+
If a thread number is given, then we set the context for evaluating
|
296
297
|
expressions to that frame of that thread.
|
297
298
|
}
|
298
299
|
end
|