ruby-debug 0.10.3 → 0.10.4
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/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
|