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,54 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
3
|
+
require 'rubygems'; require 'require_relative'
|
|
4
|
+
require_relative 'up'
|
|
5
|
+
|
|
6
|
+
# Debugger "down" command. Is the same as the "up" command with the
|
|
7
|
+
# direction (set by DIRECTION) reversed.
|
|
8
|
+
class Trepan::Command::DownCommand < Trepan::Command::UpCommand
|
|
9
|
+
|
|
10
|
+
# Silence already initialized constant .. warnings
|
|
11
|
+
old_verbose = $VERBOSE
|
|
12
|
+
$VERBOSE = nil
|
|
13
|
+
HELP = <<-HELP
|
|
14
|
+
#{NAME} [count]
|
|
15
|
+
|
|
16
|
+
Move the current frame down in the stack trace (to a newer frame). 0
|
|
17
|
+
is the most recent frame. If no count is given, move down 1.
|
|
18
|
+
|
|
19
|
+
See also 'up' and 'frame'.
|
|
20
|
+
HELP
|
|
21
|
+
|
|
22
|
+
ALIASES = %w(d)
|
|
23
|
+
NAME = File.basename(__FILE__, '.rb')
|
|
24
|
+
SHORT_HELP = 'Move frame in the direction of the caller of the last-selected frame'
|
|
25
|
+
$VERBOSE = old_verbose
|
|
26
|
+
|
|
27
|
+
def initialize(proc)
|
|
28
|
+
super
|
|
29
|
+
@direction = -1 # +1 for up.
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if __FILE__ == $0
|
|
35
|
+
# Demo it.
|
|
36
|
+
require_relative '../mock'
|
|
37
|
+
dbgr, cmd = MockDebugger::setup
|
|
38
|
+
|
|
39
|
+
# def sep ; puts '=' * 40 end
|
|
40
|
+
# cmd.run [cmd.name]
|
|
41
|
+
# %w(-1 0 1 -2).each do |count|
|
|
42
|
+
# puts "#{cmd.name} #{count}"
|
|
43
|
+
# cmd.run([cmd.name, count])
|
|
44
|
+
# sep
|
|
45
|
+
# end
|
|
46
|
+
# def foo(cmd, cmd.name)
|
|
47
|
+
# puts "#{cmd.name}"
|
|
48
|
+
# cmd.run([cmd.name])
|
|
49
|
+
# sep
|
|
50
|
+
# puts "#{cmd.name} -1"
|
|
51
|
+
# cmd.run([cmd.name, '-1'])
|
|
52
|
+
# end
|
|
53
|
+
# foo(cmd, cmd.name)
|
|
54
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
3
|
+
require 'rubygems'; require 'require_relative'
|
|
4
|
+
require_relative './base/cmd'
|
|
5
|
+
|
|
6
|
+
class Trepan::Command::EditCommand < Trepan::Command
|
|
7
|
+
|
|
8
|
+
old_verbose = $VERBOSE
|
|
9
|
+
$VERBOSE = nil
|
|
10
|
+
NAME = File.basename(__FILE__, '.rb')
|
|
11
|
+
HELP = <<-HELP
|
|
12
|
+
#{NAME} [[FILE] [LINE]]
|
|
13
|
+
|
|
14
|
+
With no argument, edits file containing most recent line listed.
|
|
15
|
+
The value of the environment variable EDITOR is used for the
|
|
16
|
+
editor to run. If no EDITOR environment variable is set /bin/ex
|
|
17
|
+
is used. The editor should support line and file positioning via
|
|
18
|
+
editor-name +line file-name
|
|
19
|
+
(Most editors do.)
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
#{NAME} # Edit current location
|
|
23
|
+
#{NAME} 7 # Edit current file at line 7
|
|
24
|
+
#{NAME} test.rb # Edit test.rb, line 1
|
|
25
|
+
#{NAME} test.rb 10 # Edit test.rb line 10
|
|
26
|
+
HELP
|
|
27
|
+
|
|
28
|
+
ALIASES = %w(e)
|
|
29
|
+
CATEGORY = 'files'
|
|
30
|
+
NEED_STACK = false
|
|
31
|
+
SHORT_HELP = 'Invoke an editor on some source code'
|
|
32
|
+
MAX_ARGS = 2
|
|
33
|
+
$VERBOSE = old_verbose
|
|
34
|
+
|
|
35
|
+
# FIXME: redo with locations and kparse.
|
|
36
|
+
def run(args)
|
|
37
|
+
case args.size
|
|
38
|
+
when 1
|
|
39
|
+
unless @proc.context
|
|
40
|
+
errmsg "We are not in a state that has an associated file."
|
|
41
|
+
return
|
|
42
|
+
end
|
|
43
|
+
file = @proc.frame.file
|
|
44
|
+
line = @proc.frame.line
|
|
45
|
+
when 2
|
|
46
|
+
line = Integer(args[1]) rescue nil
|
|
47
|
+
if line
|
|
48
|
+
unless @proc.context
|
|
49
|
+
errmsg "We are not in a state that has an associated file."
|
|
50
|
+
return
|
|
51
|
+
end
|
|
52
|
+
file = @proc.frame.file
|
|
53
|
+
else
|
|
54
|
+
file = args[1]
|
|
55
|
+
line = 1
|
|
56
|
+
end
|
|
57
|
+
when 3
|
|
58
|
+
line, file = args[2], args[1]
|
|
59
|
+
else
|
|
60
|
+
errmsg "edit needs at most 2 args."
|
|
61
|
+
end
|
|
62
|
+
editor = ENV['EDITOR'] || '/bin/ex'
|
|
63
|
+
if File.readable?(file)
|
|
64
|
+
file = File.basename(file) if settings[:basename]
|
|
65
|
+
edit_cmd = "#{editor} +#{line} \"#{file}\""
|
|
66
|
+
msg "Running #{edit_cmd}..."
|
|
67
|
+
system(edit_cmd)
|
|
68
|
+
msg "Warning: return code was #{$?.exitstatus}" if $?.exitstatus != 0
|
|
69
|
+
else
|
|
70
|
+
errmsg "File \"#{file}\" is not readable."
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
if __FILE__ == $0
|
|
76
|
+
require_relative '../mock'
|
|
77
|
+
dbgr, cmd = MockDebugger::setup
|
|
78
|
+
cmd.run [cmd.name] if ARGV.size > 0
|
|
79
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
3
|
+
require 'rubygems'; require 'require_relative'
|
|
4
|
+
require_relative 'disable'
|
|
5
|
+
|
|
6
|
+
# enable breakpoint command. Is like disable but the parameter
|
|
7
|
+
# to @proc.en_disable_breakpoint_by_number is different (set as
|
|
8
|
+
# ENABLE_PARM below).
|
|
9
|
+
class Trepan::Command::EnableCommand < Trepan::Command::DisableCommand
|
|
10
|
+
|
|
11
|
+
# Silence already initialized constant .. warnings
|
|
12
|
+
old_verbose = $VERBOSE
|
|
13
|
+
$VERBOSE = nil
|
|
14
|
+
NAME = File.basename(__FILE__, '.rb')
|
|
15
|
+
HELP = <<-HELP
|
|
16
|
+
#{NAME} BPNUM1 [BPNUM2 ...]
|
|
17
|
+
|
|
18
|
+
Enables breakpoints BPNUM1. Breakpoints numbers are given as a space-
|
|
19
|
+
separated list numbers.
|
|
20
|
+
|
|
21
|
+
See also "info break" to get a list of breakpoints.
|
|
22
|
+
HELP
|
|
23
|
+
|
|
24
|
+
ALIASES = %w(en)
|
|
25
|
+
SHORT_HELP = 'Enable some breakpoints'
|
|
26
|
+
$VERBOSE = old_verbose
|
|
27
|
+
|
|
28
|
+
def run(args)
|
|
29
|
+
if args.size == 1
|
|
30
|
+
errmsg('No breakpoint number given.')
|
|
31
|
+
return
|
|
32
|
+
end
|
|
33
|
+
enable_disable_breakpoints("Disable", args[1..-1])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if __FILE__ == $0
|
|
39
|
+
require_relative '../mock'
|
|
40
|
+
dbgr, cmd = MockDebugger::setup
|
|
41
|
+
cmd.run([cmd.name])
|
|
42
|
+
cmd.run([cmd.name, '1'])
|
|
43
|
+
cmds = cmd.proc.commands
|
|
44
|
+
break_cmd = cmds['break']
|
|
45
|
+
puts "To be continued..."
|
|
46
|
+
# break_cmd.run(['break', cmdproc.frame.source_location[0].to_s])
|
|
47
|
+
# cmd.run([cmd.name, '1'])
|
|
48
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
3
|
+
require 'rubygems'; require 'require_relative'
|
|
4
|
+
require_relative './base/cmd'
|
|
5
|
+
require_relative '../../app/util'
|
|
6
|
+
|
|
7
|
+
class Trepan::Command::EvalCommand < Trepan::Command
|
|
8
|
+
|
|
9
|
+
old_verbose = $VERBOSE
|
|
10
|
+
$VERBOSE = nil
|
|
11
|
+
NAME = File.basename(__FILE__, '.rb')
|
|
12
|
+
HELP = <<-HELP
|
|
13
|
+
#{NAME} [STRING]
|
|
14
|
+
|
|
15
|
+
Run code in the context of the current frame.
|
|
16
|
+
|
|
17
|
+
The value of the expression is stored into a global variable so it
|
|
18
|
+
may be used again easily. The name of the global variable is printed
|
|
19
|
+
next to the inspect output of the value.
|
|
20
|
+
|
|
21
|
+
If no string is given, we run the string from the current source code
|
|
22
|
+
about to be run. If the command ends ? (via an alias) and no string is
|
|
23
|
+
given we will the following translations occur:
|
|
24
|
+
|
|
25
|
+
{if|elsif|unless} expr [then] => expr
|
|
26
|
+
{until|while} expr [do] => expr
|
|
27
|
+
return expr => expr
|
|
28
|
+
case expr => expr
|
|
29
|
+
def fn(params) => [params]
|
|
30
|
+
var = expr => expr
|
|
31
|
+
|
|
32
|
+
The above is done via regular expression. No fancy parsing is done, say,
|
|
33
|
+
to look to see if expr is split across a line or whether var an assigment
|
|
34
|
+
might have multiple variables on the left-hand side.
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
|
|
38
|
+
#{NAME} 1+2 # 3
|
|
39
|
+
#{NAME} @v
|
|
40
|
+
#{NAME} # Run current source-code line
|
|
41
|
+
#{NAME}? # but strips off leading 'if', 'while', ..
|
|
42
|
+
# from command
|
|
43
|
+
|
|
44
|
+
See also 'set autoeval'. The command helps one predict future execution.
|
|
45
|
+
See 'set buffer trace' for showing what may have already been run.
|
|
46
|
+
HELP
|
|
47
|
+
|
|
48
|
+
ALIASES = %w(eval? ev? ev)
|
|
49
|
+
CATEGORY = 'data'
|
|
50
|
+
NEED_STACK = true
|
|
51
|
+
SHORT_HELP = 'Run code in the current context'
|
|
52
|
+
$VERBOSE = old_verbose
|
|
53
|
+
|
|
54
|
+
def complete(prefix)
|
|
55
|
+
if prefix.empty?
|
|
56
|
+
if @proc.leading_str.start_with?('eval?')
|
|
57
|
+
Trepan::Util.extract_expression(@proc.current_source_text)
|
|
58
|
+
else
|
|
59
|
+
@proc.current_source_text
|
|
60
|
+
end
|
|
61
|
+
else
|
|
62
|
+
prefix
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def run(args)
|
|
67
|
+
if args.size == 1
|
|
68
|
+
text = @proc.current_source_text.chomp
|
|
69
|
+
## FIXME turn into a subroutine and use in complete.
|
|
70
|
+
if '?' == args[0][-1..-1]
|
|
71
|
+
text = Trepan::Util::extract_expression(text)
|
|
72
|
+
msg "eval: #{text}"
|
|
73
|
+
end
|
|
74
|
+
else
|
|
75
|
+
text = @proc.cmd_argstr
|
|
76
|
+
end
|
|
77
|
+
@proc.eval_code(text, settings[:maxstring])
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if __FILE__ == $0
|
|
82
|
+
require_relative '../mock'
|
|
83
|
+
dbgr, cmd = MockDebugger::setup
|
|
84
|
+
arg_str = '1 + 2'
|
|
85
|
+
cmd.proc.instance_variable_set('@cmd_argstr', arg_str)
|
|
86
|
+
puts "eval #{arg_str} is: #{cmd.run([cmd.name, arg_str])}"
|
|
87
|
+
arg_str = 'return "foo"'
|
|
88
|
+
cmd.proc.instance_variable_set('@cmd_argstr', arg_str)
|
|
89
|
+
puts "eval? #{arg_str} is: #{cmd.run([cmd.name + '?'])}"
|
|
90
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
|
|
2
|
+
require 'rubygems'; require 'require_relative'
|
|
3
|
+
require_relative 'base/cmd'
|
|
4
|
+
class Trepan::Command::ExitCommand < Trepan::Command
|
|
5
|
+
|
|
6
|
+
unless defined?(HELP)
|
|
7
|
+
NAME = File.basename(__FILE__, '.rb')
|
|
8
|
+
ALIASES = %w(quit q q! quit! exit!)
|
|
9
|
+
HELP = <<-HELP
|
|
10
|
+
#{NAME} [exitcode] - hard exit of the debugged program.
|
|
11
|
+
|
|
12
|
+
The program being debugged is exited via exit!() which does not run
|
|
13
|
+
the Kernel at_exit finalizers. If a return code is given, that is the
|
|
14
|
+
return code passed to exit() - presumably the return code that will be
|
|
15
|
+
passed back to the OS. If no exit code is given, 0 is used.
|
|
16
|
+
|
|
17
|
+
If you are in interactive mode, and confirm is not set off, you are
|
|
18
|
+
prompted to confirm quitting. However if you do not want to be
|
|
19
|
+
prompted, add ! the end. (vim/vi/ed users can use alias q!).
|
|
20
|
+
|
|
21
|
+
See also "kill" and "set confirm".'
|
|
22
|
+
HELP
|
|
23
|
+
|
|
24
|
+
CATEGORY = 'support'
|
|
25
|
+
MAX_ARGS = 2 # Need at most this many
|
|
26
|
+
SHORT_HELP = 'Exit program via "exit!()"'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# FIXME: Combine 'quit' and 'exit'. The only difference is
|
|
30
|
+
# whether exit! or exit is used.
|
|
31
|
+
|
|
32
|
+
# This method runs the command
|
|
33
|
+
def run(args) # :nodoc
|
|
34
|
+
unconditional =
|
|
35
|
+
if args.size > 1 && args[1] == 'unconditionally'
|
|
36
|
+
args.shift
|
|
37
|
+
true
|
|
38
|
+
elsif args[0][-1..-1] == '!'
|
|
39
|
+
true
|
|
40
|
+
else
|
|
41
|
+
false
|
|
42
|
+
end
|
|
43
|
+
unless unconditional || confirm('Really quit?', false)
|
|
44
|
+
msg('Quit not confirmed.')
|
|
45
|
+
return
|
|
46
|
+
end
|
|
47
|
+
exitrc = (args.size > 1) ? exitrc = Integer(args[1]) rescue 0 : 0
|
|
48
|
+
|
|
49
|
+
# FIXME: Is this the best/most general way?
|
|
50
|
+
## @proc.finalize
|
|
51
|
+
## @proc.dbgr.intf[-1].finalize
|
|
52
|
+
|
|
53
|
+
# No graceful way to stop threads...
|
|
54
|
+
# A little harsh, but for now let's go with this.
|
|
55
|
+
exit! exitrc
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
if __FILE__ == $0
|
|
60
|
+
require_relative '../mock'
|
|
61
|
+
dbgr, cmd = MockDebugger::setup
|
|
62
|
+
puts "before #{cmd.name}"
|
|
63
|
+
fork { cmd.run([cmd.name]) }
|
|
64
|
+
puts "before #{cmd.name} 10"
|
|
65
|
+
cmd.run([cmd.name, '10'])
|
|
66
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
|
2
|
+
require 'rubygems'; require 'require_relative'
|
|
3
|
+
require_relative 'base/cmd'
|
|
4
|
+
|
|
5
|
+
class Trepan::Command::FinishCommand < Trepan::Command
|
|
6
|
+
|
|
7
|
+
unless defined?(HELP)
|
|
8
|
+
ALIASES = %w(fin)
|
|
9
|
+
CATEGORY = 'running'
|
|
10
|
+
NAME = File.basename(__FILE__, '.rb')
|
|
11
|
+
HELP = <<-HELP
|
|
12
|
+
#{NAME} [FRAME_NUM]
|
|
13
|
+
|
|
14
|
+
Execute until selected stack frame returns.
|
|
15
|
+
|
|
16
|
+
If no frame number is given, we run until the currently selected frame
|
|
17
|
+
returns. The currently selected frame starts out the most-recent
|
|
18
|
+
frame or 0 if no frame positioning (e.g "up", "down" or "frame") has
|
|
19
|
+
been performed. If a frame number is given we run until that frame
|
|
20
|
+
returns.
|
|
21
|
+
HELP
|
|
22
|
+
NEED_RUNNING = true
|
|
23
|
+
SHORT_HELP = 'Step into next method call or to next line'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# self.allow_in_post_mortem = false
|
|
27
|
+
# self.need_context = true
|
|
28
|
+
|
|
29
|
+
def run(args)
|
|
30
|
+
state = @proc.state
|
|
31
|
+
context = @proc.context
|
|
32
|
+
max_frame = context.stack_size - state.frame_pos
|
|
33
|
+
if args.size == 1
|
|
34
|
+
frame_pos = state.frame_pos
|
|
35
|
+
else
|
|
36
|
+
count_str = args[1]
|
|
37
|
+
count_opts = {
|
|
38
|
+
:msg_on_error =>
|
|
39
|
+
"The '#{NAME}' command argument must eval to an integer. Got: %s" %
|
|
40
|
+
count_str,
|
|
41
|
+
:min_value => 0,
|
|
42
|
+
:max_valiue => context.stack_size - state.frame_pos
|
|
43
|
+
}
|
|
44
|
+
count = @proc.get_an_int(count_str, count_opts)
|
|
45
|
+
return unless count
|
|
46
|
+
frame_pos = count - 1
|
|
47
|
+
end
|
|
48
|
+
context.stop_frame = frame_pos
|
|
49
|
+
state.frame_pos = 0
|
|
50
|
+
state.proceed
|
|
51
|
+
@proc.leave_cmd_loop = true
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
if __FILE__ == $0
|
|
56
|
+
require_relative '../mock'
|
|
57
|
+
dbgr, cmd = MockDebugger::setup
|
|
58
|
+
cmd.run([cmd.name])
|
|
59
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'rubygems'; require 'require_relative'
|
|
2
|
+
require_relative './base/cmd'
|
|
3
|
+
|
|
4
|
+
class Trepan::Command::FrameCommand < Trepan::Command
|
|
5
|
+
CATEGORY = 'stack'
|
|
6
|
+
HELP = <<-HELP
|
|
7
|
+
frame [frame-number]
|
|
8
|
+
|
|
9
|
+
Change the current frame to frame `frame-number' if specified, or the
|
|
10
|
+
most-recent frame, 0, if no frame number specified.
|
|
11
|
+
|
|
12
|
+
A negative number indicates the position from the other or
|
|
13
|
+
least-recently-entered end. So 'frame -1' moves to the oldest frame.
|
|
14
|
+
Any variable or expression that evaluates to a number can be used as a
|
|
15
|
+
position, however due to parsing limitations, the position expression
|
|
16
|
+
has to be seen as a single blank-delimited parameter. That is, the
|
|
17
|
+
expression '(5*3)-1' is okay while '( (5 * 3) - 1 )' isn't.
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
frame # Set current frame at the current stopping point
|
|
21
|
+
frame 0 # Same as above
|
|
22
|
+
frame 5-5 # Same as above. Note: no spaces allowed in expression 5-5
|
|
23
|
+
frame 1 # Move to frame 1. Same as: frame 0; up
|
|
24
|
+
frame -1 # The least-recent frame
|
|
25
|
+
|
|
26
|
+
See also 'up', 'down', and 'backtrace'.
|
|
27
|
+
HELP
|
|
28
|
+
NAME = File.basename(__FILE__, '.rb')
|
|
29
|
+
SHORT_HELP = 'Make a specific frame in the call stack the current frame'
|
|
30
|
+
|
|
31
|
+
def complete(prefix)
|
|
32
|
+
@proc.frame_complete(prefix, nil)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def run(args)
|
|
36
|
+
|
|
37
|
+
if args.size == 1
|
|
38
|
+
# Form is: "frame" which means "frame 0"
|
|
39
|
+
position_str = '0'
|
|
40
|
+
elsif args.size == 2
|
|
41
|
+
# Form is: "frame position"
|
|
42
|
+
position_str = args[1]
|
|
43
|
+
# elsif args.size == 3
|
|
44
|
+
# # Form is: frame <position> <thread>
|
|
45
|
+
# name_or_id = args[1]
|
|
46
|
+
# thread_str = args[2]
|
|
47
|
+
# th = @proc.get_thread_from_string(thread_str)
|
|
48
|
+
# if th
|
|
49
|
+
# @proc.frame_setup(th.threadframe)
|
|
50
|
+
# return
|
|
51
|
+
# else
|
|
52
|
+
# # FIXME: Give suitable error message was given
|
|
53
|
+
# end
|
|
54
|
+
# else
|
|
55
|
+
# # Form should be: "frame thread" which means
|
|
56
|
+
# # "frame thread 0"
|
|
57
|
+
# position_str = '0'
|
|
58
|
+
# ## FIXME:
|
|
59
|
+
# ## @proc.find_and_set_debugged_frame(frame, thread_id)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
stack_size = @proc.frame.stack_size
|
|
63
|
+
if stack_size == 0
|
|
64
|
+
errmsg('No frames recorded.')
|
|
65
|
+
return false
|
|
66
|
+
end
|
|
67
|
+
low, high = @proc.frame_low_high(nil)
|
|
68
|
+
opts={
|
|
69
|
+
:msg_on_error =>
|
|
70
|
+
"The '#{NAME}' command requires a frame number. Got: #{position_str}",
|
|
71
|
+
:min_value => low, :max_value => high
|
|
72
|
+
}
|
|
73
|
+
frame_num = @proc.get_an_int(position_str, opts)
|
|
74
|
+
return false unless frame_num
|
|
75
|
+
|
|
76
|
+
@proc.adjust_frame(frame_num, true)
|
|
77
|
+
return true
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if __FILE__ == $0
|
|
82
|
+
# Demo it.
|
|
83
|
+
require_relative '../mock'
|
|
84
|
+
dbgr, cmd = MockDebugger::setup
|
|
85
|
+
|
|
86
|
+
puts "To be continued..."
|
|
87
|
+
# def sep ; puts '=' * 40 end
|
|
88
|
+
# require 'ruby-debug'
|
|
89
|
+
# %w(0 1 -2).each {|count|
|
|
90
|
+
# cmd.run([cmd.name, count.to_s]); sep
|
|
91
|
+
# }
|
|
92
|
+
# def foo(cmd, name)
|
|
93
|
+
# cmd.proc.frame_setup(Debugger.current_context, nil)
|
|
94
|
+
# %w(0 -1).each {|count| cmd.run([cmd.name, count.to_s]); sep }
|
|
95
|
+
# end
|
|
96
|
+
# foo(cmd, cmd.name)
|
|
97
|
+
end
|