trepanning 0.1.4 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +188 -0
- data/Makefile +7 -0
- data/NEWS +9 -0
- data/README.textile +3 -3
- data/Rakefile +3 -3
- data/app/breakpoint.rb +1 -1
- data/app/brkptmgr.rb +1 -1
- data/app/client.rb +15 -4
- data/app/core.rb +4 -4
- data/app/default.rb +1 -0
- data/app/display.rb +1 -1
- data/app/frame.rb +38 -19
- data/app/options.rb +4 -1
- data/app/run.rb +12 -2
- data/bin/trepan +2 -1
- data/check-filter.rb +18 -0
- data/interface/client.rb +1 -1
- data/interface/comcodes.rb +9 -8
- data/interface/server.rb +38 -2
- data/interface/user.rb +2 -2
- data/io/input.rb +11 -3
- data/io/tcpclient.rb +0 -2
- data/io/tcpserver.rb +3 -2
- data/lib/trepanning.rb +8 -8
- data/processor.rb +4 -4
- data/processor/command/backtrace.rb +1 -1
- data/processor/command/base/subcmd.rb +4 -1
- data/processor/command/break.rb +1 -1
- data/processor/command/condition.rb +1 -1
- data/processor/command/debug.rb +19 -15
- data/processor/command/delete.rb +2 -1
- data/processor/command/disassemble.rb +2 -2
- data/processor/command/display.rb +1 -1
- data/processor/command/down.rb +1 -2
- data/processor/command/finish.rb +8 -4
- data/processor/command/frame.rb +1 -1
- data/processor/command/help.rb +1 -1
- data/processor/command/info_subcmd/breakpoints.rb +1 -1
- data/processor/command/info_subcmd/registers.rb +1 -1
- data/processor/command/info_subcmd/source.rb +1 -1
- data/processor/command/info_subcmd/thread.rb +2 -2
- data/processor/command/list.rb +1 -1
- data/processor/command/set_subcmd/auto_subcmd/eval.rb +10 -6
- data/processor/command/set_subcmd/auto_subcmd/irb.rb +2 -2
- data/processor/command/set_subcmd/auto_subcmd/list.rb +2 -2
- data/processor/command/set_subcmd/substitute_subcmd/eval.rb +1 -1
- data/processor/command/show_subcmd/abbrev.rb +2 -2
- data/processor/command/undisplay.rb +1 -1
- data/processor/command/up.rb +1 -2
- data/processor/eval.rb +9 -5
- data/processor/frame.rb +1 -1
- data/processor/list.rb +1 -1
- data/processor/location.rb +3 -2
- data/processor/mock.rb +3 -3
- data/processor/running.rb +1 -1
- data/processor/validate.rb +1 -1
- data/test/example/factorial.rb +10 -0
- data/test/example/gcd1.rb +1 -1
- data/test/functional/fn_helper.rb +1 -1
- data/test/functional/test-recursive-bt.rb +103 -0
- data/test/functional/test-remap.rb +50 -0
- data/test/integration/test-remote.rb +23 -0
- data/test/unit/test-app-brkpt.rb +1 -1
- data/test/unit/test-app-brkptmgr.rb +2 -2
- data/test/unit/test-app-display.rb +1 -1
- data/test/unit/test-app-frame.rb +3 -3
- data/test/unit/test-app-options.rb +1 -1
- data/test/unit/test-cmd-break.rb +2 -2
- data/test/unit/test-cmd-endisable.rb +1 -1
- data/test/unit/test-cmd-parse_list_cmd.rb +1 -1
- data/test/unit/test-cmd-quit.rb +1 -0
- data/test/unit/test-cmd-set-auto-eval.rb.try +19 -0
- data/test/unit/test-proc-eval.rb +1 -1
- data/test/unit/test-proc-frame.rb +2 -2
- data/test/unit/test-proc-list.rb +1 -1
- data/test/unit/test-proc-location.rb +1 -1
- data/test/unit/test-proc-validate.rb +3 -3
- data/trepanning.gemspec +5 -5
- metadata +101 -104
data/ChangeLog
CHANGED
@@ -1,3 +1,191 @@
|
|
1
|
+
2012-11-25 rocky <rockyb@rubyforge.org>
|
2
|
+
|
3
|
+
* NEWS, app/options.rb: Get ready for release. 0.1.6
|
4
|
+
|
5
|
+
2012-11-25 rocky <rockyb@rubyforge.org>
|
6
|
+
|
7
|
+
* Rakefile: Gem packaging de jour. Gem packaging stuff keeps moving
|
8
|
+
around.
|
9
|
+
|
10
|
+
2012-11-25 rocky <rockyb@rubyforge.org>
|
11
|
+
|
12
|
+
* processor/command/debug.rb, processor/eval.rb: Hacks to make
|
13
|
+
recursive debugging on 1.9.3 work. This is really horrible.
|
14
|
+
|
15
|
+
2012-11-24 rocky <rockyb@rubyforge.org>
|
16
|
+
|
17
|
+
* README.textile: Note that this now works on 1.9.3.
|
18
|
+
|
19
|
+
2012-11-24 rocky <rockyb@rubyforge.org>
|
20
|
+
|
21
|
+
* README.textile: Note that this now works on 1.9.3.
|
22
|
+
|
23
|
+
2012-11-24 rocky <rockyb@rubyforge.org>
|
24
|
+
|
25
|
+
Merge branch 'master' of github.com:rocky/rb-trepanning
|
26
|
+
|
27
|
+
2012-11-24 rocky <rockyb@rubyforge.org>
|
28
|
+
|
29
|
+
* lib/trepanning.rb, processor/command/debug.rb,
|
30
|
+
processor/command/finish.rb, test/functional/test-recursive-bt.rb,
|
31
|
+
trepanning.gemspec: Make this work on 1.9.3! (Really the heavy
|
32
|
+
lifting was done in rb-threadframe). Adjust dependent versions
|
33
|
+
acceptance.
|
34
|
+
|
35
|
+
2012-08-25 rocky <rockyb@rubyforge.org>
|
36
|
+
|
37
|
+
* NEWS, processor/command/delete.rb, processor/command/down.rb,
|
38
|
+
processor/command/up.rb: Remove aliases 'd' and 'u'.
|
39
|
+
|
40
|
+
2012-08-25 rocky <rockyb@rubyforge.org>
|
41
|
+
|
42
|
+
* processor/command/finish.rb: Correct "finish" doc string.
|
43
|
+
|
44
|
+
2012-08-05 rocky <rockyb@rubyforge.org>
|
45
|
+
|
46
|
+
Merge branch 'master' of github.com:rocky/rb-trepanning
|
47
|
+
|
48
|
+
2012-08-05 rocky <rockyb@rubyforge.org>
|
49
|
+
|
50
|
+
* test/functional/test-remap.rb: Skipp remap test until I figure
|
51
|
+
what's up.
|
52
|
+
|
53
|
+
2012-08-05 rocky <rockyb@rubyforge.org>
|
54
|
+
|
55
|
+
* processor/command/show_subcmd/abbrev.rb: Doc string typo.
|
56
|
+
|
57
|
+
2012-07-02 rocky <rockyb@rubyforge.org>
|
58
|
+
|
59
|
+
* trepanning.gemspec: Need 0.40 now with ThreadFrame -> Frame
|
60
|
+
change.
|
61
|
+
|
62
|
+
2012-07-02 rocky <rockyb@rubyforge.org>
|
63
|
+
|
64
|
+
* ChangeLog, NEWS, app/breakpoint.rb, app/brkptmgr.rb, app/core.rb,
|
65
|
+
app/display.rb, app/frame.rb, app/run.rb, lib/trepanning.rb,
|
66
|
+
processor/command/backtrace.rb, processor/command/break.rb,
|
67
|
+
processor/command/condition.rb, processor/command/debug.rb,
|
68
|
+
processor/command/disassemble.rb, processor/command/display.rb,
|
69
|
+
processor/command/down.rb, processor/command/frame.rb,
|
70
|
+
processor/command/help.rb,
|
71
|
+
processor/command/info_subcmd/breakpoints.rb,
|
72
|
+
processor/command/info_subcmd/registers.rb,
|
73
|
+
processor/command/info_subcmd/thread.rb, processor/command/list.rb,
|
74
|
+
processor/command/set_subcmd/substitute_subcmd/eval.rb,
|
75
|
+
processor/command/undisplay.rb, processor/command/up.rb,
|
76
|
+
processor/eval.rb, processor/frame.rb, processor/list.rb,
|
77
|
+
processor/location.rb, processor/mock.rb, processor/validate.rb,
|
78
|
+
test/example/gcd1.rb, test/functional/fn_helper.rb,
|
79
|
+
test/unit/test-app-brkpt.rb, test/unit/test-app-brkptmgr.rb,
|
80
|
+
test/unit/test-app-display.rb, test/unit/test-app-frame.rb,
|
81
|
+
test/unit/test-cmd-break.rb, test/unit/test-cmd-endisable.rb,
|
82
|
+
test/unit/test-cmd-parse_list_cmd.rb, test/unit/test-proc-eval.rb,
|
83
|
+
test/unit/test-proc-frame.rb, test/unit/test-proc-list.rb,
|
84
|
+
test/unit/test-proc-location.rb, test/unit/test-proc-validate.rb,
|
85
|
+
trepanning.gemspec: RubyVM::ThreadFrame -> RubyVM::Frame
|
86
|
+
|
87
|
+
2012-06-29 rocky <rockyb@rubyforge.org>
|
88
|
+
|
89
|
+
* app/core.rb, app/default.rb, app/options.rb, app/run.rb,
|
90
|
+
bin/trepan, processor.rb, processor/location.rb,
|
91
|
+
processor/running.rb: Lame attempt at post-mortem
|
92
|
+
|
93
|
+
2012-06-29 rocky <rockyb@rubyforge.org>
|
94
|
+
|
95
|
+
* app/client.rb, interface/comcodes.rb, interface/server.rb: Add a
|
96
|
+
sync op. Not sure if it will be useful though
|
97
|
+
|
98
|
+
2012-06-27 rocky <rockyb@rubyforge.org>
|
99
|
+
|
100
|
+
* app/client.rb, io/input.rb: Remove debug output, small indention
|
101
|
+
correction; sync with rbx-trepanning
|
102
|
+
|
103
|
+
2012-06-25 rocky <rockyb@rubyforge.org>
|
104
|
+
|
105
|
+
* io/input.rb: Remove stray debugger call. Doesn't anyone check
|
106
|
+
these commits?
|
107
|
+
|
108
|
+
2012-06-25 rocky <rockyb@rubyforge.org>
|
109
|
+
|
110
|
+
* app/client.rb: This commented-out code *is* useful. Should turn
|
111
|
+
into a debug option. Until then...
|
112
|
+
|
113
|
+
2012-06-25 rocky <rockyb@rubyforge.org>
|
114
|
+
|
115
|
+
* Rakefile, app/client.rb, interface/client.rb, interface/user.rb,
|
116
|
+
io/input.rb, io/tcpserver.rb, lib/trepanning.rb,
|
117
|
+
test/integration/test-remote.rb, test/unit/test-app-options.rb,
|
118
|
+
test/unit/test-cmd-quit.rb: Fix missing prompt/confirm output in
|
119
|
+
client mode. Noticed during Bandung 2012 tak.
|
120
|
+
|
121
|
+
2012-06-20 rocky <rockyb@rubyforge.org>
|
122
|
+
|
123
|
+
* Makefile, check-filter.rb, processor/command/base/subcmd.rb,
|
124
|
+
processor/command/set_subcmd/auto_subcmd/eval.rb,
|
125
|
+
processor/command/set_subcmd/auto_subcmd/irb.rb,
|
126
|
+
processor/command/set_subcmd/auto_subcmd/list.rb,
|
127
|
+
test/unit/test-cmd-set-auto-eval.rb.try: Makefile, check-filter.rb:
|
128
|
+
reduce verbosity of testing output. Makefile: comment targets
|
129
|
+
subcmd: document how save_command is supposed to work.
|
130
|
+
|
131
|
+
2012-06-19 rocky <rockyb@rubyforge.org>
|
132
|
+
|
133
|
+
* processor/command/set_subcmd/auto_subcmd/eval.rb,
|
134
|
+
processor/command/set_subcmd/auto_subcmd/irb.rb,
|
135
|
+
processor/command/set_subcmd/auto_subcmd/list.rb: "set auto *"
|
136
|
+
routines were not setting their prefix properly causing "restart" to
|
137
|
+
fail.
|
138
|
+
|
139
|
+
2012-05-10 rocky <rockyb@rubyforge.org>
|
140
|
+
|
141
|
+
* io/tcpclient.rb, processor.rb, test/functional/test-remap.rb: * processor.rb: Since location of processor has moved, relative path
|
142
|
+
to data has changed too. * test/functional/test-remap.rb: test above
|
143
|
+
change * io/tcpclient.rb: remove unused DEFAULT_OPTIONS
|
144
|
+
|
145
|
+
2012-03-09 R. Bernstein <rocky.bernstein@gmail.com>
|
146
|
+
|
147
|
+
Merge pull request #2 from Erkan-Yilmaz/master two small
|
148
|
+
language changes
|
149
|
+
|
150
|
+
2012-03-09 Erkan Yilmaz <erkan77@gmail.com>
|
151
|
+
|
152
|
+
* README.textile: small language changes
|
153
|
+
|
154
|
+
2011-10-29 rocky <rockyb@rubyforge.org>
|
155
|
+
|
156
|
+
* app/frame.rb, test/functional/test-recursive-bt.rb: Add "more
|
157
|
+
frames follow" on truncated backtraces. Matches what we do in
|
158
|
+
rbx-trepanning.
|
159
|
+
|
160
|
+
2011-10-28 rocky <rockyb@rubyforge.org>
|
161
|
+
|
162
|
+
* app/frame.rb, app/options.rb, app/run.rb,
|
163
|
+
processor/command/info_subcmd/source.rb, test/example/factorial.rb,
|
164
|
+
test/functional/test-recursive-bt.rb: app/frame.rb: Add direct
|
165
|
+
recursion in stack frame and give a count of repeated frames. Was
|
166
|
+
floor rounding halfway frame point when should have been ceiling
|
167
|
+
rounding. source.rb: called ruby_syntax incorrectly. app/options.rb:
|
168
|
+
bump version number
|
169
|
+
|
170
|
+
2011-10-27 rocky <rockyb@rubyforge.org>
|
171
|
+
|
172
|
+
* app/options.rb: Get ready 0.1.4 release
|
173
|
+
|
174
|
+
2011-10-23 rocky <rockyb@rubyforge.org>
|
175
|
+
|
176
|
+
Merge branch 'master' of github.com:rocky/rb-trepanning
|
177
|
+
|
178
|
+
2011-10-23 rocky <rockyb@rubyforge.org>
|
179
|
+
|
180
|
+
* processor/command/set_subcmd/substitute_subcmd/eval.rb: Doc
|
181
|
+
spelling typo
|
182
|
+
|
183
|
+
2011-10-16 rocky <rockyb@rubyforge.org>
|
184
|
+
|
185
|
+
* ChangeLog, NEWS, processor/command/shell.rb: Update NEWS and
|
186
|
+
ChangeLog in preparation for release. shell.rb: adjust help to refer
|
187
|
+
to "irb", since #{NAME} is no longer "irb" but "shell".
|
188
|
+
|
1
189
|
2011-10-15 rocky <rockyb@rubyforge.org>
|
2
190
|
|
3
191
|
* processor/command/enable.rb: Another small doc change to enable
|
data/Makefile
CHANGED
data/NEWS
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
(0.1.6) Nov 25, 2012
|
2
|
+
- Make it work on Ruby 1.9.3 p327
|
3
|
+
- Incompatible change: Remove aliases 'd' and 'u' for down and up
|
4
|
+
respectively. gdb uses 'u' and 'd' to mean something different.
|
5
|
+
|
6
|
+
(0.1.5)
|
7
|
+
- Fix bug in remote debugging not showing prompt.
|
8
|
+
- Internal RubyVM::ThreadFrame -> RubyVM::Frame
|
9
|
+
|
1
10
|
Oct 27, 2011 (0.1.4)
|
2
11
|
- Add debugger commands:
|
3
12
|
* info iv (is in ruby-debug)
|
data/README.textile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
A modular, testable debugger for Ruby 1.9.2. A total rewrite of _ruby-debug_.
|
1
|
+
A modular, testable debugger for MRI Ruby 1.9.2 or 1.9.3. A total rewrite of _ruby-debug_.
|
2
2
|
|
3
|
-
__In order to use this debugger, you'll need a patched Ruby 1.9.2 and some additional packages. See the "installation instructions.":https://github.com/rocky/rb-trepanning/wiki/How-to-Install-rb-trepanning__
|
3
|
+
__In order to use this debugger, you'll need a patched MRI Ruby 1.9.2 or 1.9.3 and some additional packages. See the "installation instructions.":https://github.com/rocky/rb-trepanning/wiki/How-to-Install-rb-trepanning__
|
4
4
|
|
5
5
|
Right now this debugger is beta code.
|
6
6
|
|
@@ -39,7 +39,7 @@ bc. $trepan = Trepan.new
|
|
39
39
|
|
40
40
|
The global variable $trepan set holds debugger settings, such as "autolist" or "autoeval" settings and breakpoint information.
|
41
41
|
|
42
|
-
Due to the line-event orientation in ruby-debug, it occasionally
|
42
|
+
Due to the line-event orientation in ruby-debug, it occasionally was convenient to add a synchronous stop in your program. I don't think that will be necessary here, but if you do call to the debugger at the point of the call rather than the subsequent stopping point, set opts[:immediate] to true. Example:
|
43
43
|
|
44
44
|
bc. # ... work, work, work
|
45
45
|
mydbg.debugger(:immediate=>true) # enter debugger here
|
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ def gemspec
|
|
10
10
|
@gemspec ||= eval(File.read(Gemspec_filename), binding, Gemspec_filename)
|
11
11
|
end
|
12
12
|
|
13
|
-
require '
|
13
|
+
require 'rubygems/package_task'
|
14
14
|
desc "Build the gem"
|
15
15
|
task :package=>:gem
|
16
16
|
task :gem=>:gemspec do
|
@@ -86,7 +86,7 @@ Rake::TestTask.new(:'test:integration') do |t|
|
|
86
86
|
t.options = '--verbose' if $VERBOSE
|
87
87
|
end
|
88
88
|
|
89
|
-
desc 'Test everything - unit
|
89
|
+
desc 'Test everything - unit, functional, and integration tests.'
|
90
90
|
task :test do
|
91
91
|
exceptions = %w(test:unit test:functional test:integration).collect do |task|
|
92
92
|
begin
|
@@ -182,7 +182,7 @@ task :gemspec do
|
|
182
182
|
end
|
183
183
|
|
184
184
|
# --------- RDoc Documentation ------
|
185
|
-
require '
|
185
|
+
require 'rdoc/task'
|
186
186
|
desc "Generate rdoc documentation"
|
187
187
|
Rake::RDocTask.new("rdoc") do |rdoc|
|
188
188
|
rdoc.rdoc_dir = 'doc'
|
data/app/breakpoint.rb
CHANGED
data/app/brkptmgr.rb
CHANGED
data/app/client.rb
CHANGED
@@ -1,20 +1,27 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
# Copyright (C) 2011, 2012 Rocky Bernstein <rockyb@rubyforge.net>
|
3
3
|
require_relative 'default' # default debugger settings
|
4
|
+
require_relative '../lib/trepanning' # main Trepan object & initialization
|
4
5
|
require_relative '../interface/comcodes' # communication codes
|
5
6
|
|
6
7
|
module Trepanning
|
7
8
|
include Trepanning::RemoteCommunication
|
8
9
|
def start_client(options)
|
9
10
|
puts "Client option given"
|
11
|
+
user_opts = {}
|
12
|
+
%w(readline).each do |opt|
|
13
|
+
user_opts[opt.to_sym] = options[opt.to_sym]
|
14
|
+
end
|
10
15
|
dbgr = Trepan.new(:client => true,
|
11
16
|
:cmdfiles => [],
|
12
17
|
:initial_dir => options[:chdir],
|
13
18
|
:nx => true,
|
14
19
|
:host => options[:host],
|
15
|
-
:port => options[:port]
|
20
|
+
:port => options[:port],
|
21
|
+
:user_opts => user_opts
|
16
22
|
)
|
17
23
|
intf = dbgr.intf[-1]
|
24
|
+
intf.write_remote(SYNC, 'FIXME: add useful info')
|
18
25
|
while true
|
19
26
|
begin
|
20
27
|
control_code, line = intf.read_remote
|
@@ -25,6 +32,11 @@ module Trepanning
|
|
25
32
|
# p [control_code, line]
|
26
33
|
case control_code
|
27
34
|
when PRINT
|
35
|
+
|
36
|
+
# FIXME: don't know why server sometimes adds a gratuituous space.
|
37
|
+
# the space is added somewhere inside TCPSocket.print
|
38
|
+
line = line[0..-2] if line.end_with?("\n ")
|
39
|
+
|
28
40
|
print line
|
29
41
|
when CONFIRM_TRUE
|
30
42
|
response = intf.confirm(line, true)
|
@@ -33,8 +45,7 @@ module Trepanning
|
|
33
45
|
response = intf.confirm(line, true)
|
34
46
|
intf.write_remote(CONFIRM_REPLY, response ? 'Y' : 'N')
|
35
47
|
when PROMPT
|
36
|
-
#
|
37
|
-
# debugger
|
48
|
+
# Printing of prompt has been handled already by PRINT.
|
38
49
|
begin
|
39
50
|
command = intf.read_command(line)
|
40
51
|
rescue EOFError
|
data/app/core.rb
CHANGED
@@ -146,14 +146,14 @@ class Trepan
|
|
146
146
|
|
147
147
|
return_exception = @exception
|
148
148
|
@frame = @event = @arg = @exception = nil
|
149
|
-
|
149
|
+
|
150
150
|
end
|
151
151
|
return return_exception
|
152
152
|
end
|
153
153
|
|
154
154
|
# A Ruby 1.8-style event processor. We don't use file, line, id, bind.
|
155
155
|
def old_event_processor(event, file, line, id, bind, klass)
|
156
|
-
event_processor(event, RubyVM::
|
156
|
+
event_processor(event, RubyVM::Frame.current.prev)
|
157
157
|
end
|
158
158
|
|
159
159
|
# Call this from inside the program you want to get a synchronous
|
@@ -163,14 +163,14 @@ class Trepan
|
|
163
163
|
while @frame && @frame.type == 'IFUNC'
|
164
164
|
@frame = @frame.prev
|
165
165
|
end
|
166
|
-
frame = RubyVM::
|
166
|
+
frame = RubyVM::Frame.current.prev(prev_count+1)
|
167
167
|
@step_count = 0 # Make event processor stop
|
168
168
|
event_processor('debugger-call', frame)
|
169
169
|
end
|
170
170
|
|
171
171
|
# A trace-hook processor for 'trace var'
|
172
172
|
def trace_var_processor(var_name, value)
|
173
|
-
frame = RubyVM::
|
173
|
+
frame = RubyVM::Frame.current.prev(2)
|
174
174
|
if 'CFUNC' == frame.type
|
175
175
|
# Don't need the C call that got us here.
|
176
176
|
prev = frame.prev
|
data/app/default.rb
CHANGED
data/app/display.rb
CHANGED
data/app/frame.rb
CHANGED
@@ -156,13 +156,20 @@ class Trepan
|
|
156
156
|
return s
|
157
157
|
end
|
158
158
|
|
159
|
+
# Return true if frame1 and frame2 are at the same place.
|
160
|
+
# We use this for example in detecting tail recursion.
|
161
|
+
def location_equal(frame1, frame2)
|
162
|
+
frame1 && frame2 && frame1.source_location == frame2.source_location &&
|
163
|
+
frame1.pc_offset == frame2.pc_offset &&
|
164
|
+
frame1.source_container == frame2.source_container
|
165
|
+
end
|
166
|
+
|
159
167
|
def offset_for_return(event)
|
160
168
|
raise RuntimeError unless %w(return c-return).member?(event)
|
161
169
|
# FIXME: C calls have a RubyVM::Env added to the stack.
|
162
170
|
# Where? Why?
|
163
171
|
'return' == event ? 1 : 4
|
164
172
|
end
|
165
|
-
module_function :offset_for_return
|
166
173
|
|
167
174
|
def param_names(iseq, start, stop, prefix='')
|
168
175
|
start.upto(stop).map do |i|
|
@@ -180,10 +187,22 @@ class Trepan
|
|
180
187
|
end
|
181
188
|
|
182
189
|
def print_stack_trace_from_to(from, to, frame, opts)
|
190
|
+
last_frame = nil
|
191
|
+
# TODO: handle indirect recursion.
|
192
|
+
direct_recursion_count = 0
|
183
193
|
from.upto(to) do |i|
|
184
|
-
|
185
|
-
|
186
|
-
|
194
|
+
if location_equal(last_frame, frame)
|
195
|
+
direct_recursion_count += 1
|
196
|
+
else
|
197
|
+
if direct_recursion_count > 0
|
198
|
+
msg("... above line repeated #{direct_recursion_count} times")
|
199
|
+
direct_recursion_count = 0
|
200
|
+
end
|
201
|
+
prefix = (i == opts[:current_pos]) ? '-->' : ' '
|
202
|
+
prefix += ' #%d ' % [i]
|
203
|
+
print_stack_entry(frame, i, prefix, opts)
|
204
|
+
end
|
205
|
+
last_frame = frame
|
187
206
|
frame = frame.prev
|
188
207
|
end
|
189
208
|
end
|
@@ -191,7 +210,7 @@ class Trepan
|
|
191
210
|
# Print `count' frame entries
|
192
211
|
def print_stack_trace(frame, opts={})
|
193
212
|
opts = DEFAULT_STACK_TRACE_SETTINGS.merge(opts)
|
194
|
-
halfstack = opts[:maxstack] / 2
|
213
|
+
halfstack = (opts[:maxstack]+1) / 2
|
195
214
|
n = frame.stack_size
|
196
215
|
n = [n, opts[:count]].min if opts[:count]
|
197
216
|
if n > (halfstack * 2)
|
@@ -201,6 +220,7 @@ class Trepan
|
|
201
220
|
else
|
202
221
|
print_stack_trace_from_to(0, n-1, frame, opts)
|
203
222
|
end
|
223
|
+
msg "(More stack frames follow...)" if n < frame.stack_size
|
204
224
|
end
|
205
225
|
|
206
226
|
def set_return_value(frame, event, value)
|
@@ -212,7 +232,6 @@ class Trepan
|
|
212
232
|
def value_returned(frame, event)
|
213
233
|
frame.sp(offset_for_return(event))
|
214
234
|
end
|
215
|
-
module_function :value_returned
|
216
235
|
end
|
217
236
|
end
|
218
237
|
|
@@ -223,61 +242,61 @@ if __FILE__ == $0
|
|
223
242
|
def msg(msg)
|
224
243
|
puts msg
|
225
244
|
end
|
226
|
-
print_stack_trace(RubyVM::
|
245
|
+
print_stack_trace(RubyVM::Frame.current, :basename => true)
|
227
246
|
def foo
|
228
247
|
puts '=' * 10
|
229
|
-
print_stack_trace(RubyVM::
|
248
|
+
print_stack_trace(RubyVM::Frame.current, :show_pc => true)
|
230
249
|
end
|
231
250
|
foo
|
232
251
|
|
233
252
|
def bar(a, b, c)
|
234
253
|
puts '=' * 10
|
235
|
-
print_stack_trace(RubyVM::
|
254
|
+
print_stack_trace(RubyVM::Frame.current,
|
236
255
|
)
|
237
256
|
end
|
238
257
|
bar(1, 2, 3)
|
239
258
|
|
240
259
|
def baz(a, b, c=5)
|
241
260
|
puts '=' * 10
|
242
|
-
print_stack_trace(RubyVM::
|
261
|
+
print_stack_trace(RubyVM::Frame.current)
|
243
262
|
end
|
244
263
|
baz(1, 2)
|
245
264
|
|
246
265
|
def bat(a, b, &block)
|
247
266
|
puts '=' * 10
|
248
|
-
print_stack_trace(RubyVM::
|
267
|
+
print_stack_trace(RubyVM::Frame.current)
|
249
268
|
end
|
250
269
|
bat(1, 2)
|
251
270
|
|
252
271
|
def babe(a, b, *rest)
|
253
272
|
puts '=' * 10
|
254
|
-
print_stack_trace(RubyVM::
|
273
|
+
print_stack_trace(RubyVM::Frame.current)
|
255
274
|
end
|
256
275
|
babe(1, 2)
|
257
276
|
|
258
277
|
puts '=' * 10
|
259
|
-
x = lambda { |a,b| print_stack_trace(RubyVM::
|
278
|
+
x = lambda { |a,b| print_stack_trace(RubyVM::Frame::current) }
|
260
279
|
x.call(1,2)
|
261
280
|
puts '=' * 10
|
262
281
|
x = Proc.new do |a|
|
263
|
-
print_stack_trace(RubyVM::
|
282
|
+
print_stack_trace(RubyVM::Frame::current)
|
264
283
|
end
|
265
284
|
x.call(1,2)
|
266
285
|
class C # :nodoc
|
267
286
|
def initialize(a)
|
268
|
-
print_stack_trace(RubyVM::
|
287
|
+
print_stack_trace(RubyVM::Frame::current)
|
269
288
|
end
|
270
289
|
end
|
271
290
|
puts '=' * 30
|
272
291
|
C.new('Hi')
|
273
292
|
puts '=' * 30
|
274
|
-
eval("print_stack_trace(RubyVM::
|
293
|
+
eval("print_stack_trace(RubyVM::Frame.current)")
|
275
294
|
puts '=' * 30
|
276
|
-
eval("eval('print_stack_trace(RubyVM::
|
295
|
+
eval("eval('print_stack_trace(RubyVM::Frame.current)')")
|
277
296
|
puts '=' * 30
|
278
|
-
eval("eval('print_stack_trace(RubyVM::
|
297
|
+
eval("eval('print_stack_trace(RubyVM::Frame.current, :maxstack => 2)')")
|
279
298
|
puts '=' * 30
|
280
299
|
1.times do |a; b|
|
281
|
-
print_stack_trace(RubyVM::
|
300
|
+
print_stack_trace(RubyVM::Frame::current)
|
282
301
|
end
|
283
302
|
end
|