rb8-trepanning 0.1.3
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/.gitignore +3 -0
- data/CHANGES +34 -0
- data/ChangeLog +875 -0
- data/README.textile +59 -0
- data/Rakefile +215 -0
- data/app/.gitignore +1 -0
- data/app/cmd_parse.kpeg +241 -0
- data/app/cmd_parse.rb +212 -0
- data/app/cmd_parser.rb +1948 -0
- data/app/complete.rb +79 -0
- data/app/default.rb +90 -0
- data/app/display.rb +148 -0
- data/app/eventbuffer.rb +147 -0
- data/app/frame.rb +166 -0
- data/app/irb.rb +114 -0
- data/app/options.rb +200 -0
- data/app/run.rb +74 -0
- data/app/util.rb +65 -0
- data/bin/.gitignore +1 -0
- data/bin/trepan8 +115 -0
- data/data/.gitignore +1 -0
- data/data/irbrc +41 -0
- data/interface/.gitignore +1 -0
- data/interface/base_intf.rb +109 -0
- data/interface/client.rb +82 -0
- data/interface/comcodes.rb +20 -0
- data/interface/script.rb +110 -0
- data/interface/server.rb +147 -0
- data/interface/user.rb +165 -0
- data/io/base_io.rb +148 -0
- data/io/input.rb +158 -0
- data/io/null_output.rb +46 -0
- data/io/string_array.rb +156 -0
- data/io/tcpclient.rb +129 -0
- data/io/tcpfns.rb +33 -0
- data/io/tcpserver.rb +141 -0
- data/lib/debugger.rb +8 -0
- data/lib/trepanning.rb +283 -0
- data/processor/.gitignore +1 -0
- data/processor/command-ruby-debug/breakpoints.rb +155 -0
- data/processor/command-ruby-debug/catchpoint.rb +55 -0
- data/processor/command-ruby-debug/condition.rb +49 -0
- data/processor/command-ruby-debug/control.rb +31 -0
- data/processor/command-ruby-debug/display.rb +120 -0
- data/processor/command-ruby-debug/enable.rb +202 -0
- data/processor/command-ruby-debug/frame.rb +199 -0
- data/processor/command-ruby-debug/help.rb +63 -0
- data/processor/command-ruby-debug/info.rb +359 -0
- data/processor/command-ruby-debug/method.rb +84 -0
- data/processor/command-ruby-debug/reload.rb +40 -0
- data/processor/command-ruby-debug/save.rb +90 -0
- data/processor/command-ruby-debug/set.rb +237 -0
- data/processor/command-ruby-debug/show.rb +251 -0
- data/processor/command-ruby-debug/source.rb +36 -0
- data/processor/command-ruby-debug/threads.rb +189 -0
- data/processor/command-ruby-debug/trace.rb +57 -0
- data/processor/command-ruby-debug/variables.rb +199 -0
- data/processor/command.rb +270 -0
- data/processor/command/.gitignore +1 -0
- data/processor/command/alias.rb +54 -0
- data/processor/command/backtrace.rb +123 -0
- data/processor/command/base/cmd.rb +177 -0
- data/processor/command/base/subcmd.rb +230 -0
- data/processor/command/base/submgr.rb +188 -0
- data/processor/command/base/subsubcmd.rb +128 -0
- data/processor/command/base/subsubmgr.rb +199 -0
- data/processor/command/break.rb +114 -0
- data/processor/command/catch.rb +71 -0
- data/processor/command/complete.rb +39 -0
- data/processor/command/continue.rb +57 -0
- data/processor/command/directory.rb +50 -0
- data/processor/command/disable.rb +85 -0
- data/processor/command/display.rb +78 -0
- data/processor/command/down.rb +54 -0
- data/processor/command/edit.rb +79 -0
- data/processor/command/enable.rb +48 -0
- data/processor/command/eval.rb +90 -0
- data/processor/command/exit.rb +66 -0
- data/processor/command/finish.rb +59 -0
- data/processor/command/frame.rb +97 -0
- data/processor/command/help.rb +230 -0
- data/processor/command/help/.gitignore +1 -0
- data/processor/command/help/README +10 -0
- data/processor/command/help/command.txt +58 -0
- data/processor/command/help/examples.txt +16 -0
- data/processor/command/help/filename.txt +40 -0
- data/processor/command/help/location.txt +37 -0
- data/processor/command/help/suffixes.txt +17 -0
- data/processor/command/info.rb +28 -0
- data/processor/command/info_subcmd/.gitignore +1 -0
- data/processor/command/info_subcmd/args.rb +39 -0
- data/processor/command/info_subcmd/breakpoints.rb +80 -0
- data/processor/command/info_subcmd/catch.rb +36 -0
- data/processor/command/info_subcmd/files.rb +39 -0
- data/processor/command/info_subcmd/globals.rb +64 -0
- data/processor/command/info_subcmd/line.rb +30 -0
- data/processor/command/info_subcmd/locals.rb +69 -0
- data/processor/command/info_subcmd/macro.rb +62 -0
- data/processor/command/info_subcmd/program.rb +51 -0
- data/processor/command/info_subcmd/ruby.rb +57 -0
- data/processor/command/info_subcmd/source.rb +74 -0
- data/processor/command/info_subcmd/stack.rb +25 -0
- data/processor/command/info_subcmd/threads.rb +75 -0
- data/processor/command/kill.rb +78 -0
- data/processor/command/list.rb +117 -0
- data/processor/command/macro.rb +68 -0
- data/processor/command/next.rb +79 -0
- data/processor/command/parsetree.rb +56 -0
- data/processor/command/pp.rb +40 -0
- data/processor/command/pr.rb +37 -0
- data/processor/command/ps.rb +40 -0
- data/processor/command/restart.rb +86 -0
- data/processor/command/save.rb +58 -0
- data/processor/command/set.rb +47 -0
- data/processor/command/set_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/abbrev.rb +25 -0
- data/processor/command/set_subcmd/auto.rb +27 -0
- data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/auto_subcmd/eval.rb +53 -0
- data/processor/command/set_subcmd/auto_subcmd/irb.rb +33 -0
- data/processor/command/set_subcmd/auto_subcmd/list.rb +33 -0
- data/processor/command/set_subcmd/basename.rb +25 -0
- data/processor/command/set_subcmd/callstyle.rb +46 -0
- data/processor/command/set_subcmd/confirm.rb +24 -0
- data/processor/command/set_subcmd/debug.rb +47 -0
- data/processor/command/set_subcmd/different.rb +61 -0
- data/processor/command/set_subcmd/highlight.rb +43 -0
- data/processor/command/set_subcmd/max.rb +26 -0
- data/processor/command/set_subcmd/max_subcmd/list.rb +49 -0
- data/processor/command/set_subcmd/max_subcmd/stack.rb +50 -0
- data/processor/command/set_subcmd/max_subcmd/string.rb +76 -0
- data/processor/command/set_subcmd/max_subcmd/width.rb +49 -0
- data/processor/command/set_subcmd/reload.rb +42 -0
- data/processor/command/set_subcmd/timer.rb +58 -0
- data/processor/command/set_subcmd/trace.rb +37 -0
- data/processor/command/set_subcmd/trace_subcmd/buffer.rb +42 -0
- data/processor/command/set_subcmd/trace_subcmd/print.rb +41 -0
- data/processor/command/shell.rb +139 -0
- data/processor/command/show.rb +39 -0
- data/processor/command/show_subcmd/.gitignore +1 -0
- data/processor/command/show_subcmd/abbrev.rb +20 -0
- data/processor/command/show_subcmd/alias.rb +46 -0
- data/processor/command/show_subcmd/args.rb +34 -0
- data/processor/command/show_subcmd/auto.rb +28 -0
- data/processor/command/show_subcmd/auto_subcmd/eval.rb +27 -0
- data/processor/command/show_subcmd/auto_subcmd/irb.rb +23 -0
- data/processor/command/show_subcmd/auto_subcmd/list.rb +22 -0
- data/processor/command/show_subcmd/basename.rb +20 -0
- data/processor/command/show_subcmd/callstyle.rb +22 -0
- data/processor/command/show_subcmd/confirm.rb +18 -0
- data/processor/command/show_subcmd/debug.rb +26 -0
- data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +21 -0
- data/processor/command/show_subcmd/debug_subcmd/skip.rb +22 -0
- data/processor/command/show_subcmd/debug_subcmd/step.rb +22 -0
- data/processor/command/show_subcmd/different.rb +26 -0
- data/processor/command/show_subcmd/directories.rb +22 -0
- data/processor/command/show_subcmd/highlight.rb +24 -0
- data/processor/command/show_subcmd/max.rb +27 -0
- data/processor/command/show_subcmd/max_subcmd/list.rb +38 -0
- data/processor/command/show_subcmd/max_subcmd/stack.rb +36 -0
- data/processor/command/show_subcmd/max_subcmd/string.rb +42 -0
- data/processor/command/show_subcmd/max_subcmd/width.rb +37 -0
- data/processor/command/show_subcmd/reload.rb +18 -0
- data/processor/command/show_subcmd/timer.rb +18 -0
- data/processor/command/show_subcmd/trace.rb +29 -0
- data/processor/command/show_subcmd/trace_subcmd/buffer.rb +65 -0
- data/processor/command/show_subcmd/trace_subcmd/print.rb +23 -0
- data/processor/command/show_subcmd/version.rb +23 -0
- data/processor/command/source.rb +134 -0
- data/processor/command/step.rb +81 -0
- data/processor/command/tbreak.rb +19 -0
- data/processor/command/unalias.rb +44 -0
- data/processor/command/undisplay.rb +59 -0
- data/processor/command/up.rb +72 -0
- data/processor/default.rb +56 -0
- data/processor/display.rb +17 -0
- data/processor/eval.rb +113 -0
- data/processor/eventbuf.rb +105 -0
- data/processor/frame.rb +172 -0
- data/processor/help.rb +92 -0
- data/processor/helper.rb +76 -0
- data/processor/hook.rb +134 -0
- data/processor/load_cmds.rb +258 -0
- data/processor/location.rb +174 -0
- data/processor/main.rb +455 -0
- data/processor/mock.rb +136 -0
- data/processor/msg.rb +61 -0
- data/processor/processor.rb +674 -0
- data/processor/running.rb +168 -0
- data/processor/stepping.rb +18 -0
- data/processor/subcmd.rb +161 -0
- data/processor/validate.rb +355 -0
- data/processor/virtual.rb +34 -0
- data/test/data/.gitignore +1 -0
- data/test/data/break_bad.cmd +19 -0
- data/test/data/break_bad.right +29 -0
- data/test/data/break_loop_bug.cmd +5 -0
- data/test/data/break_loop_bug.right +15 -0
- data/test/data/dollar-0.right +2 -0
- data/test/data/dollar-0a.right +2 -0
- data/test/data/dollar-0b.right +2 -0
- data/test/data/edit.cmd +14 -0
- data/test/data/edit.right +24 -0
- data/test/data/file-with-space.cmd +6 -0
- data/test/data/file-with-space.right +4 -0
- data/test/data/printvar.cmd +17 -0
- data/test/data/printvar.right +31 -0
- data/test/data/raise.cmd +11 -0
- data/test/data/raise.right +19 -0
- data/test/data/source.cmd +5 -0
- data/test/data/source.right +18 -0
- data/test/data/stepping-1.9.right +50 -0
- data/test/data/stepping.cmd +21 -0
- data/test/data/stepping.right +48 -0
- data/test/data/trepan8-save.1 +6 -0
- data/test/example/bp_loop_issue.rb +3 -0
- data/test/example/break-bug.rb +7 -0
- data/test/example/brkpt-class-bug.rb +8 -0
- data/test/example/classes.rb +11 -0
- data/test/example/dollar-0.rb +5 -0
- data/test/example/except-bug1.rb +4 -0
- data/test/example/except-bug2.rb +7 -0
- data/test/example/file with space.rb +1 -0
- data/test/example/gcd.rb +18 -0
- data/test/example/info-var-bug.rb +47 -0
- data/test/example/info-var-bug2.rb +2 -0
- data/test/example/null.rb +1 -0
- data/test/example/pm-bug.rb +3 -0
- data/test/example/pm.rb +11 -0
- data/test/example/raise.rb +3 -0
- data/test/integration/.gitignore +4 -0
- data/test/integration/config.yaml +8 -0
- data/test/integration/helper.rb +154 -0
- data/test/integration/test-break_bad.rb +26 -0
- data/test/integration/test-dollar-0.rb +31 -0
- data/test/integration/test-edit.rb +17 -0
- data/test/integration/test-file-with-space.rb +26 -0
- data/test/integration/test-printvar.rb +17 -0
- data/test/integration/test-raise.rb +21 -0
- data/test/integration/test-source.rb +16 -0
- data/test/integration/test-stepping.rb +24 -0
- data/test/unit/.gitignore +1 -0
- data/test/unit/cmd-helper.rb +52 -0
- data/test/unit/mock-helper.rb +12 -0
- data/test/unit/test-app-cmd_parse.rb +97 -0
- data/test/unit/test-app-cmd_parser.rb +23 -0
- data/test/unit/test-app-complete.rb +39 -0
- data/test/unit/test-app-frame.rb +32 -0
- data/test/unit/test-app-options.rb +92 -0
- data/test/unit/test-app-run.rb +14 -0
- data/test/unit/test-app-util.rb +44 -0
- data/test/unit/test-base-cmd.rb +45 -0
- data/test/unit/test-base-subcmd.rb +57 -0
- data/test/unit/test-base-submgr.rb +23 -0
- data/test/unit/test-base-subsubcmd.rb +17 -0
- data/test/unit/test-cmd-alias.rb +48 -0
- data/test/unit/test-cmd-exit.rb +27 -0
- data/test/unit/test-cmd-help.rb +104 -0
- data/test/unit/test-cmd-kill.rb +46 -0
- data/test/unit/test-cmd-source.rb +34 -0
- data/test/unit/test-completion.rb +42 -0
- data/test/unit/test-intf-user.rb +46 -0
- data/test/unit/test-io-input.rb +27 -0
- data/test/unit/test-io-tcp.rb +33 -0
- data/test/unit/test-io-tcpclient.rb +54 -0
- data/test/unit/test-io-tcpfns.rb +17 -0
- data/test/unit/test-io-tcpserver.rb +50 -0
- data/test/unit/test-proc-eval.rb +36 -0
- data/test/unit/test-proc-hook.rb +30 -0
- data/test/unit/test-proc-load_cmds.rb +50 -0
- data/test/unit/test-proc-location.rb +79 -0
- data/test/unit/test-subcmd-help.rb +44 -0
- data/trepan8.gemspec +52 -0
- metadata +391 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'rubygems'; require 'require_relative'
|
|
2
|
+
require_relative '../app/default' # for Trepan::HOME_DIR etc.
|
|
3
|
+
require_relative 'virtual'
|
|
4
|
+
class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
|
|
5
|
+
|
|
6
|
+
DEFAULT_SETTINGS = {
|
|
7
|
+
:abbrev => true, # Allow abbreviations of debugger commands?
|
|
8
|
+
:autoeval => true, # Ruby eval non-debugger commands
|
|
9
|
+
:autoirb => false, # Go into IRB in debugger command loop
|
|
10
|
+
:autolist => false, # Run 'list'
|
|
11
|
+
|
|
12
|
+
:basename => false, # Show basename of filenames only
|
|
13
|
+
:callstyle => :last, #
|
|
14
|
+
:confirm => true, # Confirm potentially dangerous operations?
|
|
15
|
+
:different => 'nostack', # stop *only* when different position?
|
|
16
|
+
|
|
17
|
+
:debugdbgr => false, # Debugging the debugger
|
|
18
|
+
:debugexcept => true, # Internal debugging of command exceptions
|
|
19
|
+
:debugmacro => false, # debugging macros
|
|
20
|
+
:debugskip => false, # Internal debugging of step/next skipping
|
|
21
|
+
:directory => # last-resort path-search for files
|
|
22
|
+
'$cdir:$cwd', # that are not fully qualified.
|
|
23
|
+
|
|
24
|
+
:hidestack => nil, # Fixnum. How many hidden outer
|
|
25
|
+
# debugger stack frames to hide?
|
|
26
|
+
# nil or -1 means compute value. 0
|
|
27
|
+
# means hide none. Less than 0 means show
|
|
28
|
+
# all stack entries.
|
|
29
|
+
:hightlight => false, # Use terminal highlight?
|
|
30
|
+
|
|
31
|
+
:maxlist => 10, # Number of source lines to list
|
|
32
|
+
:maxstack => 10, # backtrace limit
|
|
33
|
+
:maxstring => 150, # Strings which are larger than this
|
|
34
|
+
# will be truncated to this length when
|
|
35
|
+
# printed
|
|
36
|
+
:maxwidth => (ENV['COLUMNS'] || '80').to_i,
|
|
37
|
+
:prompt => 'trepan8', # core part of prompt. Additional info like
|
|
38
|
+
# debug nesting and thread name is fixed
|
|
39
|
+
# and added on.
|
|
40
|
+
:reload => false, # Reread source file if we determine
|
|
41
|
+
# it has changed?
|
|
42
|
+
:save_cmdfile => nil, # If set, debugger command file to be
|
|
43
|
+
# used on restart
|
|
44
|
+
:timer => false, # show elapsed time between events
|
|
45
|
+
:traceprint => false, # event tracing printing
|
|
46
|
+
:tracebuffer => false, # save events to a trace buffer.
|
|
47
|
+
:user_cmd_dir => File.join(Trepan::HOME_DIR, 'trepan8', 'command'),
|
|
48
|
+
# User command directory
|
|
49
|
+
} unless defined? DEFAULT_SETTINGS
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
if __FILE__ == $0
|
|
53
|
+
# Show it:
|
|
54
|
+
require 'pp'
|
|
55
|
+
PP.pp(Trepan::CmdProcessor::DEFAULT_SETTINGS)
|
|
56
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
2
|
+
require 'rubygems'; require 'require_relative'
|
|
3
|
+
require_relative '../app/display'
|
|
4
|
+
require_relative 'virtual'
|
|
5
|
+
class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
|
|
6
|
+
attr_reader :displays
|
|
7
|
+
|
|
8
|
+
def display_initialize
|
|
9
|
+
@displays = DisplayMgr.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def run_eval_display(args={})
|
|
13
|
+
for line in @displays.display(@frame) do
|
|
14
|
+
msg(line)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/processor/eval.rb
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
require 'require_relative'
|
|
4
|
+
require_relative 'virtual'
|
|
5
|
+
class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
|
|
6
|
+
|
|
7
|
+
def debug_eval(str, max_fake_filename=15)
|
|
8
|
+
begin
|
|
9
|
+
debug_eval_with_exception(str, max_fake_filename)
|
|
10
|
+
rescue SyntaxError, StandardError, ScriptError => e
|
|
11
|
+
exception_dump(e, @settings[:stack_trace_on_error], $!.backtrace)
|
|
12
|
+
nil
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def debug_eval_with_exception(str, max_fake_filename=15)
|
|
17
|
+
filename, b = get_binding_and_filename(str, max_fake_filename)
|
|
18
|
+
eval(str, b, filename)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def debug_eval_no_errmsg(str, max_fake_filename=15)
|
|
22
|
+
begin
|
|
23
|
+
debug_eval_with_exception(str, max_fake_filename)
|
|
24
|
+
rescue SyntaxError, StandardError, ScriptError => e
|
|
25
|
+
nil
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def eval_code(str, max_fake_filename=nil)
|
|
30
|
+
obj = debug_eval(str, max_fake_filename)
|
|
31
|
+
|
|
32
|
+
# idx = @user_variables
|
|
33
|
+
# @user_variables += 1
|
|
34
|
+
|
|
35
|
+
# str = "$d#{idx}"
|
|
36
|
+
# Rubinius::Globals[str.to_sym] = obj
|
|
37
|
+
# msg "#{str} = #{obj.inspect}"
|
|
38
|
+
msg "#{obj.inspect}"
|
|
39
|
+
obj
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def exception_dump(e, stack_trace, backtrace)
|
|
43
|
+
str = "#{e.class} Exception:\n\t#{e.message}"
|
|
44
|
+
if stack_trace
|
|
45
|
+
str += "\n" + backtrace.map{|l| "\t#{l}"}.join("\n") rescue nil
|
|
46
|
+
end
|
|
47
|
+
msg str
|
|
48
|
+
# throw :debug_error
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def fake_eval_filename(str, maxlen = 15)
|
|
52
|
+
fake_filename =
|
|
53
|
+
if maxlen < str.size
|
|
54
|
+
# FIXME: Guard against \" in positions 13..15?
|
|
55
|
+
str.inspect[0..maxlen-1] + '"...'
|
|
56
|
+
else
|
|
57
|
+
str.inspect
|
|
58
|
+
end
|
|
59
|
+
"(eval #{fake_filename})"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def get_binding_and_filename(str, maxlen)
|
|
63
|
+
b =
|
|
64
|
+
begin
|
|
65
|
+
@frame.binding
|
|
66
|
+
rescue
|
|
67
|
+
TOPLEVEL_BINDING
|
|
68
|
+
end
|
|
69
|
+
filename = fake_eval_filename(str, maxlen)
|
|
70
|
+
return [filename, b]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
if __FILE__ == $0
|
|
76
|
+
# Demo it.
|
|
77
|
+
cmdp = Trepan::CmdProcessor.new([])
|
|
78
|
+
puts cmdp.fake_eval_filename('x = 1; y = 2')
|
|
79
|
+
puts cmdp.fake_eval_filename('x = 1; y = 2', 7)
|
|
80
|
+
|
|
81
|
+
def cmdp.errmsg(msg)
|
|
82
|
+
puts "** #{msg}"
|
|
83
|
+
end
|
|
84
|
+
def cmdp.msg(msg)
|
|
85
|
+
puts "** #{msg}"
|
|
86
|
+
end
|
|
87
|
+
begin
|
|
88
|
+
1/0
|
|
89
|
+
rescue Exception => exc
|
|
90
|
+
cmdp.exception_dump(exc, true, $!.backtrace)
|
|
91
|
+
puts '=' * 40
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
x = 10
|
|
95
|
+
|
|
96
|
+
require 'rubygems'; require 'require_relative'
|
|
97
|
+
puts "To be continued..."
|
|
98
|
+
exit
|
|
99
|
+
require_relative '../app/frame'
|
|
100
|
+
frame = Trepan::Frame.new(context)
|
|
101
|
+
cmdp.instance_variable_set('@frame', frame)
|
|
102
|
+
cmdp.instance_variable_set('@settings', {:stack_trace_on_error => true})
|
|
103
|
+
def cmdp.errmsg(mess) ; puts mess end
|
|
104
|
+
# require_relative '../lib/trepanning'
|
|
105
|
+
# Trepan.start
|
|
106
|
+
puts cmdp.debug_eval('x = "#{x}"')
|
|
107
|
+
puts '=' * 40
|
|
108
|
+
puts cmdp.debug_eval('x+')
|
|
109
|
+
puts cmdp.debug_eval_no_errmsg('y+')
|
|
110
|
+
puts '=' * 40
|
|
111
|
+
puts cmdp.debug_eval('x+')
|
|
112
|
+
puts cmdp.debug_eval('y = 1; x+', 4)
|
|
113
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
2
|
+
# For recording hook events in a buffer for review later. Make use of
|
|
3
|
+
# Trace::Buffer for this prupose.
|
|
4
|
+
|
|
5
|
+
require 'rubygems'; require 'require_relative'
|
|
6
|
+
begin
|
|
7
|
+
require 'linecache'
|
|
8
|
+
rescue LoadError
|
|
9
|
+
require 'linecache19'
|
|
10
|
+
end
|
|
11
|
+
require_relative '../app/eventbuffer'
|
|
12
|
+
require_relative 'virtual'
|
|
13
|
+
|
|
14
|
+
class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
|
|
15
|
+
|
|
16
|
+
attr_reader :eventbuf
|
|
17
|
+
attr_reader :event_tracefilter
|
|
18
|
+
|
|
19
|
+
def eventbuf_initialize(size=100)
|
|
20
|
+
@eventbuf = Trace::EventBuffer.new(size)
|
|
21
|
+
# @event_tracefilter = Trace::Filter.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# def event_processor(event, frame, arg=nil)
|
|
25
|
+
# @eventbuf.append(event, frame, arg)
|
|
26
|
+
# end
|
|
27
|
+
|
|
28
|
+
# Print event buffer entries from FROM up to TO try to stay within
|
|
29
|
+
# WIDTH. We show source lines only the first time they are
|
|
30
|
+
# encountered. Also we use separators to indicate points that the
|
|
31
|
+
# debugger has stopped at.
|
|
32
|
+
def eventbuf_print(from=nil, to=nil, width=80)
|
|
33
|
+
sep = '-' * ((width - 7) / 2)
|
|
34
|
+
last_container, last_location = nil, nil
|
|
35
|
+
if from == nil || !@eventbuf.marks[-1]
|
|
36
|
+
mark_index = 0
|
|
37
|
+
else
|
|
38
|
+
mark_index = @eventbuf.marks.size-1
|
|
39
|
+
translated_from = @eventbuf.zero_pos + from
|
|
40
|
+
@eventbuf.marks.each_with_index do
|
|
41
|
+
|m, i|
|
|
42
|
+
if m > translated_from
|
|
43
|
+
mark_index = [0, i-1].max
|
|
44
|
+
break
|
|
45
|
+
elsif m == translated_from
|
|
46
|
+
mark_index = i
|
|
47
|
+
break
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
nextmark = @eventbuf.marks[mark_index]
|
|
53
|
+
@eventbuf.each_with_index(from, to) do |e, i|
|
|
54
|
+
if nextmark
|
|
55
|
+
if nextmark == i
|
|
56
|
+
msg "#{sep} %5d #{sep}" % (mark_index - @eventbuf.marks.size)
|
|
57
|
+
mark_index += 1 if mark_index < @eventbuf.marks.size - 1
|
|
58
|
+
nextmark = @eventbuf.marks[mark_index]
|
|
59
|
+
elsif nextmark < i
|
|
60
|
+
mark_index += 1 if mark_index < @eventbuf.marks.size - 1
|
|
61
|
+
nextmark = @eventbuf.marks[mark_index]
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
last_container, last_location, mess =
|
|
65
|
+
format_eventbuf_entry(e, last_container, last_location) if e
|
|
66
|
+
msg mess
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Show event buffer entry. If the location is the same as the previous
|
|
71
|
+
# location we don't show the duplicated location information.
|
|
72
|
+
def format_eventbuf_entry(item, last_container, last_location)
|
|
73
|
+
mess = format_location(item.event, item.frame, 0)
|
|
74
|
+
return nil, nil, mess
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# FIXME: multiple hook mechanism needs work.
|
|
78
|
+
# def start_capture
|
|
79
|
+
# @event_tracefilter.add_trace_func(method(:event_processor).to_proc,
|
|
80
|
+
# Trace::DEFAULT_EVENT_MASK)
|
|
81
|
+
# end
|
|
82
|
+
|
|
83
|
+
# def stop_capture
|
|
84
|
+
# @event_tracefilter.set_trace_func(nil)
|
|
85
|
+
# end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
if __FILE__ == $0
|
|
90
|
+
# Demo it.
|
|
91
|
+
cmdproc = Trepan::CmdProcessor.new([])
|
|
92
|
+
cmdproc.eventbuf_initialize(5)
|
|
93
|
+
|
|
94
|
+
def cmdproc.msg(mess)
|
|
95
|
+
puts mess
|
|
96
|
+
end
|
|
97
|
+
# cmdproc.start_capture
|
|
98
|
+
# z=5
|
|
99
|
+
# z.times do |i|
|
|
100
|
+
# x = i
|
|
101
|
+
# y = x+2
|
|
102
|
+
# end
|
|
103
|
+
# cmdproc.stop_capture
|
|
104
|
+
cmdproc.eventbuf_print
|
|
105
|
+
end
|
data/processor/frame.rb
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
2
|
+
require 'rubygems'; require 'require_relative'
|
|
3
|
+
require_relative '../app/complete'
|
|
4
|
+
require_relative '../app/frame'
|
|
5
|
+
require_relative '../app/util'
|
|
6
|
+
require_relative 'virtual'
|
|
7
|
+
class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
|
|
8
|
+
|
|
9
|
+
include Trepan::Util
|
|
10
|
+
attr_reader :current_thread
|
|
11
|
+
|
|
12
|
+
# ThreadFrame, current frame
|
|
13
|
+
attr_accessor :frame
|
|
14
|
+
|
|
15
|
+
# frame index in a "backtrace" command
|
|
16
|
+
attr_accessor :frame_index
|
|
17
|
+
attr_reader :hide_level
|
|
18
|
+
|
|
19
|
+
# Hash[thread_id] -> FixNum, the level of the last frame to
|
|
20
|
+
# show. If we called the debugger directly, then there is
|
|
21
|
+
# generally a portion of a backtrace we don't want to show. We
|
|
22
|
+
# don't need to store this for all threads, just those we want to
|
|
23
|
+
# hide frame on. A value of 1 means to hide just the oldest
|
|
24
|
+
# level. The default or showing all levels is 0.
|
|
25
|
+
attr_accessor :hidelevels
|
|
26
|
+
|
|
27
|
+
# Hash[container] -> file container. This gives us a way to map non-file
|
|
28
|
+
# container objects to a file container for display.
|
|
29
|
+
attr_accessor :remap_container
|
|
30
|
+
|
|
31
|
+
attr_accessor :stack_size
|
|
32
|
+
|
|
33
|
+
# top frame of current thread.
|
|
34
|
+
attr_accessor :top_frame
|
|
35
|
+
# attr_reader :threads2frames # Hash[thread_id] -> top_frame
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def adjust_frame(frame_num, absolute_pos)
|
|
39
|
+
frame, frame_num = get_frame(frame_num, absolute_pos)
|
|
40
|
+
if frame
|
|
41
|
+
@frame = frame
|
|
42
|
+
@frame.index = frame_num
|
|
43
|
+
prefix = "--> ##{frame_num} "
|
|
44
|
+
unless @settings[:traceprint]
|
|
45
|
+
msg("#{prefix}%s" %
|
|
46
|
+
@frame.describe(:basename => settings[:basename],
|
|
47
|
+
:maxwidth => settings[:maxwidth] - prefix.size,
|
|
48
|
+
:callstyle => settings[:callstyle]))
|
|
49
|
+
end
|
|
50
|
+
@line_no = @frame.line
|
|
51
|
+
@frame
|
|
52
|
+
else
|
|
53
|
+
nil
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def frame_low_high(direction)
|
|
58
|
+
if direction
|
|
59
|
+
low, high = [ @frame.index * -direction,
|
|
60
|
+
(@stack_size - 1 - @frame.index) * direction ]
|
|
61
|
+
low, high = [high, low] if direction < 0
|
|
62
|
+
[low, high]
|
|
63
|
+
else
|
|
64
|
+
[-@stack_size, @stack_size-1]
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def frame_complete(prefix, direction)
|
|
69
|
+
low, high = frame_low_high(direction)
|
|
70
|
+
ary = (low..high).map{|i| i.to_s}
|
|
71
|
+
Trepan::Complete.complete_token(ary, prefix)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Initializes the thread and frame variables: @frame, @top_frame,
|
|
75
|
+
# @frame_index, @current_thread, and @threads2frames
|
|
76
|
+
def frame_setup(context, state)
|
|
77
|
+
@frame = @top_frame = Trepan::Frame.new(context)
|
|
78
|
+
@frame.index = 0
|
|
79
|
+
@current_thread = @frame.thread
|
|
80
|
+
@context = context
|
|
81
|
+
@state = state
|
|
82
|
+
@line_no = @frame.line
|
|
83
|
+
|
|
84
|
+
@threads2frames ||= {}
|
|
85
|
+
@threads2frames[@current_thread] = @top_frame
|
|
86
|
+
@stack_size = @frame.stack_size
|
|
87
|
+
## FIXME: reinstate
|
|
88
|
+
## set_hide_level
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Remove access to thread and frame variables
|
|
92
|
+
def frame_teardown
|
|
93
|
+
@top_frame = @frame = @current_thread = nil
|
|
94
|
+
@threads2frames = {}
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def frame_initialize
|
|
98
|
+
@remap_container = {}
|
|
99
|
+
@remap_iseq = {}
|
|
100
|
+
@hidelevels = Hash.new(nil)
|
|
101
|
+
@hide_level = 0
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def get_frame(frame_num, absolute_pos)
|
|
105
|
+
if absolute_pos
|
|
106
|
+
frame_num += @frame.stack_size if frame_num < 0
|
|
107
|
+
else
|
|
108
|
+
frame_num += @frame.index
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
if frame_num < 0
|
|
112
|
+
errmsg('Adjusting would put us beyond the newest frame.')
|
|
113
|
+
return [nil, nil]
|
|
114
|
+
elsif frame_num >= @stack_size
|
|
115
|
+
errmsg('Adjusting would put us beyond the oldest frame.')
|
|
116
|
+
return [nil, nil]
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
@frame.index = frame_num
|
|
120
|
+
[@frame, frame_num]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def parent_frame
|
|
124
|
+
unless @frame.index + 1 < @frame.stack_size
|
|
125
|
+
errmsg "Unable to find parent frame at level #{@frame.index+1}"
|
|
126
|
+
return nil
|
|
127
|
+
end
|
|
128
|
+
@frame.index += 1
|
|
129
|
+
@frame
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def set_hide_level
|
|
133
|
+
max_stack_size = @frame.stack_size
|
|
134
|
+
@hide_level =
|
|
135
|
+
if !@settings[:hidelevel] || @settings[:hidelevel] < 0
|
|
136
|
+
@settings[:hidelevel] = @hidelevels[@current_thread] =
|
|
137
|
+
find_main_script(@frame) || max_stack_size
|
|
138
|
+
else
|
|
139
|
+
@settings[:hidelevel]
|
|
140
|
+
end
|
|
141
|
+
@stack_size = if @hide_level >= max_stack_size
|
|
142
|
+
max_stack_size else max_stack_size - @hide_level
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
if __FILE__ == $0
|
|
148
|
+
# Demo it.
|
|
149
|
+
class Trepan::CmdProcessor
|
|
150
|
+
def print_location
|
|
151
|
+
puts "frame location: #{frame.file} #{frame.line}"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
require_relative './mock'
|
|
156
|
+
puts "To be continued..."
|
|
157
|
+
exit
|
|
158
|
+
dbgr, cmd = MockDebugger::setup('exit', false)
|
|
159
|
+
# require_relative '../lib/trepanning'
|
|
160
|
+
# Trepan.start(:set_restart => true)
|
|
161
|
+
proc = cmd.proc
|
|
162
|
+
0.upto(proc.stack_size-1) { |i| proc.adjust_frame(i, true) }
|
|
163
|
+
puts '*' * 10
|
|
164
|
+
proc.adjust_frame(-1, true)
|
|
165
|
+
proc.adjust_frame(0, true)
|
|
166
|
+
puts '*' * 10
|
|
167
|
+
proc.stack_size.times { proc.adjust_frame(1, false) }
|
|
168
|
+
puts '*' * 10
|
|
169
|
+
proc.adjust_frame(proc.stack_size-1, true)
|
|
170
|
+
proc.stack_size.times { proc.adjust_frame(-1, false) }
|
|
171
|
+
|
|
172
|
+
end
|