trepanning 0.1.0 → 0.1.1

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.
Files changed (181) hide show
  1. data/.gitignore +4 -0
  2. data/ChangeLog +1279 -235
  3. data/Makefile +13 -0
  4. data/NEWS +30 -0
  5. data/Rakefile +50 -14
  6. data/app/.gitignore +1 -0
  7. data/app/breakpoint.rb +7 -2
  8. data/app/brkptmgr.rb +12 -0
  9. data/app/cmd_parse.citrus +167 -0
  10. data/app/cmd_parse.kpeg +221 -0
  11. data/app/cmd_parse.rb +201 -0
  12. data/app/cmd_parser.rb +1914 -0
  13. data/app/complete.rb +79 -0
  14. data/app/condition.rb +1 -1
  15. data/app/core.rb +7 -11
  16. data/app/default.rb +1 -1
  17. data/app/disassemble.rb +3 -2
  18. data/app/file.rb +12 -36
  19. data/app/frame.rb +3 -2
  20. data/app/irb.rb +9 -5
  21. data/app/iseq.rb +46 -0
  22. data/app/options.rb +6 -30
  23. data/app/run.rb +5 -2
  24. data/app/util.rb +1 -2
  25. data/app/yarv.rb +11 -1
  26. data/bin/.gitignore +1 -0
  27. data/bin/trepan +6 -6
  28. data/data/.gitignore +1 -0
  29. data/interface/.gitignore +1 -0
  30. data/interface/base_intf.rb +9 -5
  31. data/interface/comcodes.rb +10 -8
  32. data/interface/user.rb +76 -17
  33. data/io/.gitignore +1 -0
  34. data/io/input.rb +39 -15
  35. data/io/tcpclient.rb +7 -1
  36. data/io/tcpfns.rb +5 -3
  37. data/io/tcpserver.rb +13 -10
  38. data/lib/.gitignore +1 -0
  39. data/lib/trepanning.rb +50 -13
  40. data/processor/.gitignore +1 -0
  41. data/processor/Makefile +7 -0
  42. data/processor/breakpoint.rb +7 -2
  43. data/processor/command/.gitignore +1 -0
  44. data/processor/command/Makefile +7 -0
  45. data/processor/command/alias.rb +2 -2
  46. data/processor/command/backtrace.rb +4 -0
  47. data/processor/command/base/cmd.rb +45 -2
  48. data/processor/command/base/subcmd.rb +4 -2
  49. data/processor/command/base/submgr.rb +23 -19
  50. data/processor/command/base/subsubcmd.rb +23 -1
  51. data/processor/command/base/subsubmgr.rb +13 -0
  52. data/processor/command/break.rb +34 -29
  53. data/processor/command/complete.rb +37 -0
  54. data/processor/command/condition.rb +2 -0
  55. data/processor/command/continue.rb +15 -18
  56. data/processor/command/disassemble.rb +5 -0
  57. data/processor/command/down.rb +1 -1
  58. data/processor/command/eval.rb +70 -0
  59. data/processor/command/exit.rb +4 -1
  60. data/processor/command/finish.rb +6 -4
  61. data/processor/command/frame.rb +6 -3
  62. data/processor/command/help.rb +97 -54
  63. data/processor/command/help/.gitignore +1 -0
  64. data/processor/command/help/README +10 -0
  65. data/processor/command/help/command.txt +48 -0
  66. data/processor/command/help/filename.txt +40 -0
  67. data/processor/command/help/location.txt +37 -0
  68. data/processor/command/info_subcmd/.gitignore +1 -0
  69. data/processor/command/info_subcmd/breakpoints.rb +9 -9
  70. data/processor/command/info_subcmd/{file.rb → files.rb} +92 -27
  71. data/processor/command/info_subcmd/frame.rb +41 -15
  72. data/processor/command/info_subcmd/iseq.rb +39 -17
  73. data/processor/command/info_subcmd/program.rb +2 -8
  74. data/processor/command/info_subcmd/registers.rb +12 -10
  75. data/processor/command/info_subcmd/registers_subcmd/.gitignore +1 -0
  76. data/processor/command/info_subcmd/ruby.rb +60 -0
  77. data/processor/command/irb.rb +26 -3
  78. data/processor/command/kill.rb +21 -10
  79. data/processor/command/list.rb +1 -1
  80. data/processor/command/macro.rb +37 -23
  81. data/processor/command/pr.rb +1 -1
  82. data/processor/command/reload.rb +4 -0
  83. data/processor/command/reload_subcmd/.gitignore +1 -0
  84. data/processor/command/restart.rb +9 -9
  85. data/processor/command/save.rb +29 -36
  86. data/processor/command/set_subcmd/.gitignore +1 -0
  87. data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
  88. data/processor/command/set_subcmd/confirm.rb +23 -0
  89. data/processor/command/set_subcmd/debug_subcmd/.gitignore +1 -0
  90. data/processor/command/set_subcmd/different.rb +2 -0
  91. data/processor/command/set_subcmd/events.rb +2 -0
  92. data/processor/command/set_subcmd/max.rb +9 -12
  93. data/processor/command/set_subcmd/max_subcmd/.gitignore +1 -0
  94. data/processor/command/set_subcmd/substitute_subcmd/.gitignore +1 -0
  95. data/processor/command/set_subcmd/trace.rb +7 -13
  96. data/processor/command/set_subcmd/trace_subcmd/.gitignore +1 -0
  97. data/processor/command/set_subcmd/trace_subcmd/buffer.rb +12 -27
  98. data/processor/command/set_subcmd/trace_subcmd/print.rb +10 -8
  99. data/processor/command/set_subcmd/trace_subcmd/var.rb +6 -10
  100. data/processor/command/show.rb +12 -1
  101. data/processor/command/show_subcmd/.gitignore +1 -0
  102. data/processor/command/show_subcmd/alias.rb +11 -15
  103. data/processor/command/show_subcmd/auto_subcmd/.gitignore +1 -0
  104. data/processor/command/show_subcmd/basename.rb +1 -9
  105. data/processor/command/show_subcmd/confirm.rb +25 -0
  106. data/processor/command/show_subcmd/debug_subcmd/.gitignore +1 -0
  107. data/processor/command/show_subcmd/macro.rb +32 -14
  108. data/processor/command/show_subcmd/max_subcmd/.gitignore +1 -0
  109. data/processor/command/show_subcmd/trace_subcmd/.gitignore +1 -0
  110. data/processor/command/show_subcmd/trace_subcmd/buffer.rb +11 -31
  111. data/processor/command/show_subcmd/trace_subcmd/print.rb +4 -20
  112. data/processor/command/source.rb +7 -1
  113. data/processor/command/up.rb +7 -4
  114. data/processor/default.rb +3 -1
  115. data/processor/eval.rb +13 -0
  116. data/processor/eventbuf.rb +3 -2
  117. data/processor/frame.rb +19 -0
  118. data/processor/help.rb +20 -0
  119. data/processor/load_cmds.rb +143 -24
  120. data/processor/location.rb +61 -10
  121. data/processor/main.rb +30 -11
  122. data/processor/mock.rb +5 -3
  123. data/processor/msg.rb +17 -0
  124. data/processor/running.rb +1 -1
  125. data/processor/subcmd.rb +3 -2
  126. data/processor/validate.rb +173 -185
  127. data/sample/.gitignore +1 -0
  128. data/sample/list-terminal-colors.rb +139 -0
  129. data/sample/rocky-dot-trepanrc +14 -0
  130. data/sample/rocky-trepan-colors.rb +47 -0
  131. data/test/Makefile +7 -0
  132. data/test/data/.gitignore +1 -0
  133. data/test/data/debugger-stop.cmd +3 -0
  134. data/test/data/debugger-stop.right +5 -0
  135. data/test/data/fname-with-blank.right +0 -3
  136. data/test/data/quit.right +0 -1
  137. data/test/data/quit2.cmd +6 -0
  138. data/test/data/quit2.right +3 -0
  139. data/test/data/testing.cmd +1 -0
  140. data/test/example/.gitignore +1 -0
  141. data/test/example/debugger-stop.rb +14 -0
  142. data/test/functional/.gitignore +2 -0
  143. data/test/functional/fn_helper.rb +7 -9
  144. data/test/functional/test-break-long.rb +7 -7
  145. data/test/functional/test-break.rb +7 -7
  146. data/test/functional/test-condition.rb +4 -4
  147. data/test/functional/test-delete.rb +6 -5
  148. data/test/functional/test-eval.rb +115 -0
  149. data/test/functional/test-raise.rb +1 -1
  150. data/test/functional/test-return.rb +1 -1
  151. data/test/integration/.gitignore +2 -0
  152. data/test/integration/helper.rb +6 -3
  153. data/test/integration/test-debugger-stop.rb +22 -0
  154. data/test/integration/test-quit.rb +8 -0
  155. data/test/unit/.gitignore +1 -0
  156. data/test/unit/Makefile +7 -0
  157. data/test/unit/test-app-brkpt.rb +0 -1
  158. data/test/unit/test-app-cmd_parse.rb +107 -0
  159. data/test/unit/test-app-cmd_parser.rb +22 -0
  160. data/test/unit/test-app-complete.rb +38 -0
  161. data/test/unit/test-app-condition.rb +20 -0
  162. data/test/unit/test-app-iseq.rb +31 -0
  163. data/test/unit/test-app-options.rb +9 -1
  164. data/test/unit/test-app-util.rb +0 -1
  165. data/test/unit/test-base-cmd.rb +46 -0
  166. data/test/unit/test-base-subcmd.rb +11 -2
  167. data/test/unit/test-base-submgr.rb +23 -0
  168. data/test/unit/test-base-subsubcmd.rb +20 -0
  169. data/test/unit/test-cmd-break.rb +22 -23
  170. data/test/unit/test-cmd-help.rb +4 -0
  171. data/test/unit/test-completion.rb +43 -0
  172. data/test/unit/test-io-tcpclient.rb +3 -2
  173. data/test/unit/test-proc-load_cmds.rb +10 -1
  174. data/test/unit/test-proc-location.rb +39 -0
  175. data/test/unit/test-proc-main.rb +1 -1
  176. data/test/unit/test-proc-validate.rb +47 -31
  177. data/trepanning.gemspec +45 -0
  178. metadata +247 -179
  179. data/app/core.rb-consider +0 -198
  180. data/test/functional/tmp/b3.rb +0 -5
  181. data/test/functional/tmp/immediate-bug1.rb +0 -9
@@ -0,0 +1 @@
1
+ /*~
@@ -0,0 +1,10 @@
1
+ Files in this directory are help for "help syntax".
2
+
3
+ A list of sub-names is obtained by Dir.glob('*.txt') in this
4
+ directory.
5
+
6
+ Each file name without the trailing ".txt' is the name of the help
7
+ subcategory under "help syntax".
8
+
9
+ The first line in the file is a summary shown in help summary.
10
+ Lines 3 on are shown as help text.
@@ -0,0 +1,48 @@
1
+ overall debugger command syntax
2
+
3
+ Command tokenization syntax is very simple-minded.
4
+
5
+ If a line starts with #, the command is ignored.
6
+ If a line starts with !, the line is eval'd.
7
+
8
+ If the command you want eval'd uses the Ruby ! initially, add that
9
+ after the first ! or start the line with a space.
10
+
11
+ Commands are split at whereever ;; appears. This process disregards
12
+ any quotes or other symbols that have meaning in Ruby. The strings
13
+ after the leading command string are put back on a command queue.
14
+
15
+ Within a single command, tokens are then white-space split. Again,
16
+ this process disregards quotes or symbols that have meaning in Ruby.
17
+ Some commands like 'eval', 'macro', and 'break' have access to the
18
+ untokenized string entered and make use of that rather than the
19
+ tokenized list.
20
+
21
+ The leading token is first looked up in the macro table. If it is in
22
+ the table, the expansion is replaces the current command and possibly
23
+ other commands pushed onto a command queue. Next, the leading token is
24
+ looked up in the debugger alias table and the name may be substituted
25
+ there. Finally, the leading token is looked up in the debugger alias
26
+ table. If a match is found, the command name and arguments are
27
+ dispatched to the command object that process the command.
28
+
29
+ If the command is not found and "auto eval" is set on, then the
30
+ command is eval'd in the context that the program is currently stopped
31
+ at. If "auto eval" is not set on, then we display an error message
32
+ that the entered string is "undefined".
33
+
34
+ If you want irb-like command-processing, it's possible to go into an
35
+ irb shell with the "irb" command. It is also possible to arrange going
36
+ into an irb shell every time you enter the debugger.
37
+
38
+ Examples:
39
+
40
+ # This line does nothing. It is a comment
41
+ s # by default, this is an alias for the "step" command
42
+ !s # shows the value of variable step.
43
+ !!s # Evaluates !s (or "not s"). The first ! is indicates evaluate.
44
+ info program;; list # Runs two commands "info program" and "list"
45
+ pr "hi ;;-)" # Syntax error since ;; splits the line and " is not closed.
46
+ !puts "hi ;;-)" # One way to do the above.
47
+
48
+ See also "alias", "irb", "set auto eval", and "set auto irb".
@@ -0,0 +1,40 @@
1
+ syntax for indicating a filename
2
+
3
+ There are two ways you can give a file name:
4
+ - unadorned (without double-quotes) with possible escapes
5
+ - as a double-quoted string with possible escapes in the string
6
+
7
+ Probably most of the time a file name will be specified in the first
8
+ form, without using quotes. If the file name however has a space or a
9
+ colon in it, escape that character with a backslash. Also, if you need
10
+ to enter a backslash and the character followinng that is unlucky
11
+ enough to be a colon, space, or backslash use two backslashes. Some
12
+ examples:
13
+
14
+ irb.rb => irb.rb
15
+ /tmp/irb.rb => /tmp/irb.rb
16
+ C\:irb.rb => C:irb.rb
17
+ C\:\irb.rb => C:\irb.rb
18
+ C\:\\irb.rb => C:\irb.rb # Note: double slash not needed
19
+ \\new.rb => \new.rb # Note: double slash, or filename has newline
20
+ my\ file.rb => my file.rb
21
+
22
+
23
+ The quoted string is useful if you have a file name that contains
24
+ several characters that normally confuse the debugger parser, notably
25
+ a space, newline, or a colon. The quoted string starts with a double
26
+ quote ("). Escape sequences are allowed inside the string to be able
27
+ to enter tabs or newlines, or a double quote inside the string. The
28
+ list of translations is as follows:
29
+
30
+ \t => <tab>
31
+ \n => <newline>
32
+ \" => "
33
+ \\ => \
34
+
35
+ Here are some examples of quoted filenames:
36
+
37
+ "This is a file with blanks.rb" => This is a file with blanks.rb
38
+ "/tmp/RubyProgram \"foo\".rb => /tmp/RubyProgram "foo".rb
39
+ "/Ruby\nProgram.rb" => /tmp/Ruby
40
+ Program.rb
@@ -0,0 +1,37 @@
1
+ syntax for source code locations; e.g. used "list" and "break"
2
+
3
+ Locations are used to indicates places in the source code or the
4
+ places in bytecode compiled from source code. Locations are used in
5
+ the listing commands like "list" or "disassemble"; they are also used
6
+ in "breakpoint" commands like "break", "tbreak" and "continue"
7
+
8
+ A location is either some sort of "container" and a position inside
9
+ that container. A container is either a file name or a method
10
+ name. And a position is either a line number or a bytecode offset.
11
+ Bytecode offsets are prefaced with an '@'. So 4 is a line number 4, but
12
+ @4 is bytecode offset 4.
13
+
14
+ File names are distinguished from method names purely by semantic
15
+ means. That its "foo" (without the quotes) could conceivably be
16
+ either a method or a file name. The debugger does a file check to see
17
+ if "foo" is a file.
18
+
19
+ In gdb, locations are often given using a filename a colon and a line
20
+ number. That is supported here are well. So myfile.rb:5 indicates line 5
21
+ of file "myfile.rb". But since we also allow method names you can also use
22
+ "gcd:5" to indicate line 5 of method "gcd".
23
+
24
+ Line numbers in methods are not relative to the beginning of the
25
+ method but relative the beginning of source text that contains the
26
+ method. This is also how Ruby stores line numbers for methods which
27
+ are shown for example in a backtrace. So all of this hopefully will
28
+ feel familiar and consistent.
29
+
30
+ Instead of using a colon to separate the container and the position,
31
+ you can also use spacs. So "gcd 5" is the same as gcd:5.
32
+
33
+ If the filename has an embedded blank in it, you can indicate that by
34
+ using a backslash escape. For example: "file\ with\ blanks.rb"
35
+
36
+
37
+
@@ -0,0 +1 @@
1
+ /*~
@@ -5,8 +5,8 @@ require_relative '../base/subcmd'
5
5
  class Trepan::Subcommand::InfoBreakpoints < Trepan::Subcommand
6
6
  unless defined?(HELP)
7
7
  Trepanning::Subcommand.set_name_prefix(__FILE__, self)
8
- HELP = <<EOH
9
- info breakpoints [num1 ...] [verbose]
8
+ HELP = <<-EOH
9
+ #{PREFIX.join(' ')} [num1 ...] [verbose]
10
10
 
11
11
  Show status of user-settable breakpoints. If no breakpoint numbers are
12
12
  given, the show all breakpoints. Otherwise only those breakpoints
@@ -20,11 +20,10 @@ The "enb" column indicates whether the breakpoint is enabled.
20
20
 
21
21
  The "Where" column indicates where the breakpoint is located.
22
22
  EOH
23
-
24
- MIN_ABBREV = 'br'.size
25
- SHORT_HELP = "Status of user-settable breakpoints"
23
+ MIN_ABBREV = 'br'.size
24
+ SHORT_HELP = 'Status of user-settable breakpoints'
26
25
  end
27
-
26
+
28
27
  def bpprint(bp, verbose=false)
29
28
  disp = bp.temp? ? 'del ' : 'keep '
30
29
  disp += bp.enabled? ? 'y ' : 'n '
@@ -48,7 +47,8 @@ EOH
48
47
  msg("\t#{other_loc}") if verbose
49
48
 
50
49
  if bp.condition && bp.condition != 'true'
51
- msg("\tstop only if %s" % bp.condition)
50
+ msg("\tstop %s %s" %
51
+ [bp.negate ? "unless" : "only if", bp.condition])
52
52
  end
53
53
  if bp.ignore > 0
54
54
  msg("\tignore next %d hits" % bp.ignore)
@@ -105,7 +105,7 @@ EOH
105
105
  msg('No breakpoints.')
106
106
  else
107
107
  # There's at least one
108
- msg("Num Type Disp Enb Where")
108
+ section("Num Type Disp Enb Where")
109
109
  if show_all
110
110
  bpmgr.list.each do |bp|
111
111
  bpprint(bp, verbose)
@@ -133,7 +133,7 @@ if __FILE__ == $0
133
133
  require_relative '../../mock'
134
134
  name = File.basename(__FILE__, '.rb')
135
135
  dbgr, cmd = MockDebugger::setup('info')
136
- subcommand = Trepan::Subcommand::InfoBreak.new(cmd)
136
+ subcommand = Trepan::Subcommand::InfoBreakpoints.new(cmd)
137
137
 
138
138
  puts '-' * 20
139
139
  subcommand.run(%w(info break))
@@ -1,24 +1,32 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'linecache'
4
+ require 'columnize'
4
5
  require_relative '../base/subcmd'
5
6
  require_relative '../../../app/file'
7
+ require_relative '../../../app/complete'
6
8
 
7
- class Trepan::Subcommand::InfoFile < Trepan::Subcommand
9
+ class Trepan::Subcommand::InfoFiles < Trepan::Subcommand
8
10
  unless defined?(HELP)
9
11
  Trepanning::Subcommand.set_name_prefix(__FILE__, self)
10
- DEFAULT_FILE_ARGS = %w(size sha1)
12
+ DEFAULT_FILE_ARGS = %w(size mtime sha1)
11
13
 
12
- HELP =
13
- "info file [{FILENAME|.} [all | brkpts | iseq | sha1 | size | stat]]
14
+ HELP = <<-EOH
15
+ #{CMD} [{FILENAME|.|*} [all|ctime|brkpts|mtime|sha1|size|stat]]
14
16
 
15
17
  Show information about the current file. If no filename is given and
16
- the program is running then the current file associated with the
17
- current stack entry is used. Sub options which can be shown about a file are:
18
+ the program is running, then the current file associated with the
19
+ current stack entry is used. Giving . has the same effect.
20
+
21
+ Given * gives a list of all files we know about.
22
+
23
+ Sub options which can be shown about a file are:
18
24
 
19
25
  brkpts -- Line numbers where there are statement boundaries.
20
26
  These lines can be used in breakpoint commands.
27
+ ctime -- File creation time
21
28
  iseq -- Instruction sequences from this file.
29
+ mtime -- File modification time
22
30
  sha1 -- A SHA1 hash of the source text. This may be useful in comparing
23
31
  source code.
24
32
  size -- The number of lines in the file.
@@ -26,18 +34,49 @@ stat -- File.stat information
26
34
 
27
35
  all -- All of the above information.
28
36
 
29
- If no sub-options are given #{DEFAULT_FILE_ARGS.join(' ')} are assumed.
30
- "
37
+ If no sub-options are given, "#{DEFAULT_FILE_ARGS.join(' ')}" are assumed.
38
+
39
+ Examples:
40
+
41
+ #{CMD} # Show #{DEFAULT_FILE_ARGS.join(' ')} information about current file
42
+ #{CMD} . # same as above
43
+ #{CMD} brkpts # show the number of lines in the current file
44
+ #{CMD} brkpts size # same as above but also list breakpoint line numbers
45
+ #{CMD} * # Give a list of files we know about
46
+ EOH
31
47
  MIN_ABBREV = 'fi'.size # Note we have "info frame"
32
48
  NEED_STACK = false
33
49
  end
34
50
 
51
+ # completion %w(all brkpts iseq sha1 size stat)
52
+
35
53
  include Trepanning
54
+
55
+ def file_list
56
+ (LineCache.class_variable_get('@@file_cache').keys +
57
+ LineCache.class_variable_get('@@file2file_remap').keys).uniq
58
+ end
59
+ def complete(prefix)
60
+ completions = ['.'] + file_list
61
+ Trepan::Complete.complete_token(completions, prefix)
62
+ end
36
63
 
37
64
  # Get file information
38
65
  def run(args)
39
66
  return if args.size < 2
40
67
  args << '.' if 2 == args.size
68
+ if '*' == args[2]
69
+ section 'Canonic Files names cached:'
70
+ primary = LineCache.class_variable_get('@@file_cache')
71
+ remap = LineCache.class_variable_get('@@file2file_remap')
72
+ msg columnize_commands(remap.keys.uniq.sort)
73
+ names = remap.keys - primary.keys
74
+ unless names.empty?
75
+ section 'Non-canonic names cached:'
76
+ msg columnize_commands(names.sort)
77
+ end
78
+ return
79
+ end
41
80
  filename =
42
81
  if '.' == args[2]
43
82
  if not @proc.frame
@@ -45,36 +84,49 @@ If no sub-options are given #{DEFAULT_FILE_ARGS.join(' ')} are assumed.
45
84
  return false
46
85
  nil
47
86
  else
48
- File.expand_path(@proc.frame.source_container[1])
87
+ frame_file = @proc.frame.source_container[1]
88
+ LineCache::map_file(frame_file) || File.expand_path(frame_file)
49
89
  end
50
90
  else
51
91
  args[2]
52
92
  end
53
93
  args += DEFAULT_FILE_ARGS if args.size == 3
54
94
 
55
- m = filename + ' is'
56
- canonic_name = LineCache::map_file(filename)
95
+ m = filename
96
+ canonic_name = @proc.canonic_file(filename)
97
+ canonic_name = LineCache::map_file(canonic_name) || canonic_name
57
98
  if LineCache::cached?(canonic_name)
58
- m += " cached in debugger"
99
+ m += " is cached in debugger"
59
100
  if canonic_name != filename
60
- m += (' as:' + canonic_name)
101
+ m += (" as:\n " + canonic_name)
61
102
  end
62
103
  m += '.'
63
104
  msg(m)
64
105
  elsif !(matches = find_scripts(filename)).empty?
65
106
  if (matches.size > 1)
66
107
  msg("Multiple files found:")
67
- matches.each { |match_file| msg "\t%s" % match_file }
108
+ matches.sort.each { |match_file| msg "\t%s" % match_file }
68
109
  return
69
110
  else
70
111
  msg('File "%s" just now cached.' % filename)
71
112
  LineCache::cache(matches[0])
72
- LineCache::remap_file(matches[0], filename)
113
+ LineCache::remap_file(filename, matches[0])
73
114
  canonic_name = matches[0]
74
115
  end
75
116
  else
76
- msg(m + ' not cached in debugger.')
77
- return
117
+ matches = file_list.select{|try| try.end_with?(filename)}
118
+ if (matches.size > 1)
119
+ msg("Multiple files found ending filename string:")
120
+ matches.sort.each { |match_file| msg "\t%s" % match_file }
121
+ return
122
+ elsif 1 == matches.size
123
+ canonic_name = LineCache::map_file(matches[0])
124
+ m += " matched debugger cache file:\n " + canonic_name
125
+ msg m
126
+ else
127
+ msg(m + ' is not cached in debugger.')
128
+ return
129
+ end
78
130
  end
79
131
  seen = {}
80
132
  args[3..-1].each do |arg|
@@ -98,13 +150,21 @@ If no sub-options are given #{DEFAULT_FILE_ARGS.join(' ')} are assumed.
98
150
  if %w(all brkpts).member?(arg)
99
151
  unless seen[:brkpts]
100
152
  msg("Possible breakpoint line numbers:")
101
- lines = LineCache::trace_line_numbers(canonic_name)
153
+ lines = LineCache.trace_line_numbers(canonic_name)
102
154
  fmt_lines = columnize_numbers(lines)
103
155
  msg(fmt_lines)
104
156
  end
105
157
  processed_arg = seen[:brkpts] = true
106
158
  end
107
159
 
160
+ if %w(all ctime).member?(arg)
161
+ unless seen[:ctime]
162
+ msg("create time:\t%s." %
163
+ LineCache::stat(canonic_name).ctime.to_s)
164
+ end
165
+ processed_arg = seen[:ctime] = true
166
+ end
167
+
108
168
  if %w(all iseq).member?(arg)
109
169
  unless seen[:iseq]
110
170
  if SCRIPT_ISEQS__.member?(canonic_name)
@@ -119,6 +179,14 @@ If no sub-options are given #{DEFAULT_FILE_ARGS.join(' ')} are assumed.
119
179
  processed_arg = seen[:iseq] = true
120
180
  end
121
181
 
182
+ if %w(all mtime).member?(arg)
183
+ unless seen[:mtime]
184
+ msg("modify time:\t%s." %
185
+ LineCache::stat(canonic_name).mtime.to_s)
186
+ end
187
+ processed_arg = seen[:mtime] = true
188
+ end
189
+
122
190
  if %w(all stat).member?(arg)
123
191
  unless seen[:stat]
124
192
  msg("Stat info:\n\t%s." % LineCache::stat(canonic_name).inspect)
@@ -141,21 +209,18 @@ if __FILE__ == $0
141
209
  load(__FILE__)
142
210
  else
143
211
  require_relative '../../mock'
144
- require_relative '../../subcmd'
145
- name = File.basename(__FILE__, '.rb')
146
- # FIXME: DRY the below code
147
- dbgr, cmd = MockDebugger::setup('info')
148
- subcommand = Trepan::Subcommand::InfoFile.new(cmd)
149
- testcmdMgr = Trepan::Subcmd.new(subcommand)
150
-
212
+ cmd = MockDebugger::sub_setup(Trepan::Subcommand::InfoFiles, false)
151
213
  [%w(info file nothere),
152
214
  %w(info file .),
215
+ %w(info file *),
153
216
  %w(info file),
154
217
  %w(info file file.rb),
218
+ %w(info file citrus/file.rb),
155
219
  %w(info file . all),
156
- %w(info file . lines size sha1 sha1)].each do |args|
157
- subcommand.run(args)
220
+ %w(info file . brkpts bad size sha1 sha1)].each do |args|
221
+ cmd.run(args)
158
222
  puts '-' * 40
159
223
  end
224
+ p cmd.complete('')
160
225
  end
161
226
  end
@@ -5,18 +5,51 @@ require_relative '../base/subcmd'
5
5
  class Trepan::Subcommand::InfoFrame < Trepan::Subcommand
6
6
  unless defined?(HELP)
7
7
  Trepanning::Subcommand.set_name_prefix(__FILE__, self)
8
- HELP = 'Show all information about the selected frame'
8
+ HELP = <<-EOH
9
+ #{CMD}
10
+
11
+ Show information about the selected frame. The fields we list are:
12
+
13
+ * A source container and name (e.g. "file" or "string" and the value)
14
+ * The actual number of arguments passed in
15
+ * The 'arity' or permissible number of arguments passed it. -1 indicates
16
+ variable number
17
+ * The frame "type", e.g. TOP, METHOD, BLOCK, EVAL, CFUNC etc.
18
+ * The return value if the frame is at a return point
19
+ * The PC offset we are currently at; May be omitted of no instruction
20
+ sequence
21
+
22
+ A backtrace shows roughly the same information in a more compact form.
23
+
24
+ Example form inside File.basename('foo')
25
+
26
+ Frame basename
27
+ file : /tmp/c-func.rb # actually location of caller
28
+ line : 2 # inherited from caller
29
+ argc : 1 # One out argument supplied: 'foo'
30
+ arity : -1 # Variable number of args, can have up to 2 arguments.
31
+ type : CFUNC (A C function)
32
+
33
+
34
+ See also: backtrace
35
+ EOH
9
36
  MIN_ABBREV = 'fr'.size # Note we have "info file"
10
37
  NEED_STACK = true
38
+ SHORT_HELP = 'Show information about the selected frame'
11
39
  end
12
40
 
13
41
  def run(args)
14
42
  frame = @proc.frame
15
- msg("Line %s of %s at PC offset %d, type: %s" %
16
- [@proc.frame_line, frame.source_container[1], frame.pc_offset,
17
- frame.type])
18
- if @proc.event == 'return'
19
- msg("Return value class: #{@proc.frame.sp(1).class}")
43
+ section "Frame %2d: #{frame.method}" % @proc.frame_index
44
+ msg " %-6s: %s" % frame.source_container
45
+ msg " line : %s" % @proc.frame_line
46
+ msg " argc : %d" % frame.argc
47
+ msg " arity : %d" % frame.arity
48
+ msg " type : %s" % frame.type
49
+ msg " offset: %d" % frame.pc_offset if frame.iseq
50
+ if %w(return c-return).member?(@proc.event)
51
+ ret_val = Trepan::Frame.value_returned(@proc.frame, @proc.event)
52
+ msg " Return: %s" % ret_val
20
53
  end
21
54
  end
22
55
 
@@ -25,14 +58,7 @@ end
25
58
  if __FILE__ == $0
26
59
  # Demo it.
27
60
  require_relative '../../mock'
28
- require_relative '../../subcmd'
29
- name = File.basename(__FILE__, '.rb')
30
-
31
- # FIXME: DRY the below code
32
61
  dbgr, cmd = MockDebugger::setup('info')
33
- subcommand = Trepan::Subcommand::InfoFrame.new(cmd)
34
- testcmdMgr = Trepan::Subcmd.new(subcommand)
35
-
36
- name = File.basename(__FILE__, '.rb')
37
- subcommand.summary_help(name)
62
+ cmd = MockDebugger::sub_setup(Trepan::Subcommand::InfoFrame, false)
63
+ cmd.run(cmd.prefix)
38
64
  end