rb8-trepanning 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/CHANGES +10 -0
  2. data/ChangeLog +276 -0
  3. data/Makefile +13 -0
  4. data/Rakefile +1 -2
  5. data/app/display.rb +41 -1
  6. data/app/irb.rb +55 -49
  7. data/app/options.rb +3 -2
  8. data/app/run.rb +25 -7
  9. data/app/util.rb +19 -1
  10. data/bin/trepan8 +0 -2
  11. data/data/perldb.bindings +17 -0
  12. data/interface/script.rb +1 -1
  13. data/interface/server.rb +1 -1
  14. data/interface/user.rb +3 -1
  15. data/{interface/base_intf.rb → interface.rb} +1 -1
  16. data/io/input.rb +1 -1
  17. data/io/null_output.rb +1 -1
  18. data/io/string_array.rb +2 -2
  19. data/io/tcpclient.rb +1 -1
  20. data/io/tcpserver.rb +1 -1
  21. data/{io/base_io.rb → io.rb} +0 -0
  22. data/lib/debugger.rb +0 -1
  23. data/lib/trepanning.rb +3 -1
  24. data/processor/command/alias.rb +13 -2
  25. data/processor/command/backtrace.rb +2 -1
  26. data/processor/command/base/subcmd.rb +1 -5
  27. data/processor/command/base/submgr.rb +1 -1
  28. data/processor/command/base/subsubcmd.rb +1 -1
  29. data/processor/command/base/subsubmgr.rb +4 -4
  30. data/processor/command/break.rb +19 -11
  31. data/processor/command/catch.rb +1 -1
  32. data/processor/command/complete.rb +1 -1
  33. data/processor/command/continue.rb +7 -1
  34. data/processor/command/directory.rb +2 -2
  35. data/processor/command/disable.rb +13 -14
  36. data/processor/command/display.rb +3 -1
  37. data/processor/command/down.rb +8 -8
  38. data/processor/command/edit.rb +1 -1
  39. data/processor/command/enable.rb +21 -22
  40. data/processor/command/eval.rb +1 -2
  41. data/processor/command/exit.rb +25 -8
  42. data/processor/command/finish.rb +7 -2
  43. data/processor/command/frame.rb +1 -1
  44. data/processor/command/help.rb +3 -4
  45. data/processor/command/info.rb +2 -0
  46. data/processor/command/info_subcmd/files.rb +2 -2
  47. data/processor/command/info_subcmd/locals.rb +6 -53
  48. data/processor/command/info_subcmd/source.rb +10 -4
  49. data/processor/command/info_subcmd/variables.rb +35 -0
  50. data/processor/command/info_subcmd/variables_subcmd/.gitignore +1 -0
  51. data/processor/command/info_subcmd/variables_subcmd/class.rb +42 -0
  52. data/processor/command/info_subcmd/variables_subcmd/constant.rb +42 -0
  53. data/processor/command/info_subcmd/{globals.rb → variables_subcmd/globals.rb} +22 -17
  54. data/processor/command/info_subcmd/variables_subcmd/instance.rb +42 -0
  55. data/processor/command/info_subcmd/variables_subcmd/locals.rb +80 -0
  56. data/processor/command/kill.rb +8 -7
  57. data/processor/command/list.rb +2 -2
  58. data/processor/command/macro.rb +27 -9
  59. data/processor/command/next.rb +1 -1
  60. data/processor/command/parsetree.rb +1 -1
  61. data/processor/command/pp.rb +1 -1
  62. data/processor/command/pr.rb +1 -1
  63. data/processor/command/ps.rb +1 -1
  64. data/processor/command/restart.rb +1 -1
  65. data/processor/command/save.rb +1 -1
  66. data/processor/command/set_subcmd/auto.rb +7 -1
  67. data/processor/command/set_subcmd/different.rb +1 -1
  68. data/processor/command/set_subcmd/trace.rb +5 -4
  69. data/processor/command/set_subcmd/trace_subcmd/print.rb +4 -3
  70. data/processor/command/shell.rb +5 -4
  71. data/processor/command/show_subcmd/{alias.rb → aliases.rb} +2 -2
  72. data/processor/command/source.rb +1 -1
  73. data/processor/command/step.rb +2 -5
  74. data/processor/command/tbreak.rb +1 -1
  75. data/processor/command/unalias.rb +13 -8
  76. data/processor/command/undisplay.rb +13 -9
  77. data/processor/command/up.rb +12 -14
  78. data/processor/command.rb +138 -230
  79. data/processor/display.rb +46 -10
  80. data/processor/help.rb +5 -3
  81. data/processor/hook.rb +2 -2
  82. data/processor/location.rb +25 -0
  83. data/processor/mock.rb +3 -2
  84. data/processor/msg.rb +55 -42
  85. data/processor/old-command.rb +270 -0
  86. data/processor/{processor.rb → old-processor.rb} +7 -8
  87. data/processor/running.rb +7 -12
  88. data/processor/subcmd.rb +15 -41
  89. data/processor/validate.rb +240 -238
  90. data/{processor/main.rb → processor.rb} +20 -42
  91. data/test/data/trace.cmd +6 -0
  92. data/test/data/trace.right +46 -0
  93. data/test/integration/helper.rb +2 -0
  94. data/test/integration/test-trace.rb +29 -0
  95. data/test/unit/cmd-helper.rb +2 -3
  96. data/test/unit/test-app-options.rb +13 -11
  97. data/test/unit/test-app-run.rb +7 -1
  98. data/test/unit/test-base-cmd.rb +1 -1
  99. data/test/unit/test-cmd-kill.rb +11 -4
  100. data/test/unit/test-io-tcpserver.rb +9 -4
  101. data/test/unit/test-proc-eval.rb +1 -2
  102. data/test/unit/test-proc-location.rb +26 -32
  103. data/test/unit/test-subcmd-help.rb +1 -1
  104. data/trepan8.gemspec +9 -1
  105. metadata +60 -17
  106. data/processor/command/base/cmd.rb +0 -177
@@ -4,14 +4,14 @@ require 'rubygems'; require 'require_relative'
4
4
  require_relative '../base/subcmd'
5
5
 
6
6
  class Trepan::Subcommand::InfoFiles < Trepan::Subcommand
7
- unless defined?(HELP)
7
+ Trepan::Util::suppress_warnings {
8
8
  Trepanning::Subcommand.set_name_prefix(__FILE__, self)
9
9
  HELP = 'Show files cached by the debugger'
10
10
  MIN_ABBREV = 'files'.size
11
11
  MIN_ARGS = 0
12
12
  MAX_ARGS = 0
13
13
  NEED_STACK = false
14
- end
14
+ }
15
15
 
16
16
  def run(args)
17
17
  files = LineCache::cached_files
@@ -1,69 +1,22 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require 'columnize'
5
4
  require_relative '../base/subcmd'
6
- require_relative '../../../app/frame'
7
5
 
8
6
  class Trepan::Subcommand::InfoLocals < Trepan::Subcommand
9
7
  unless defined?(HELP)
10
8
  Trepanning::Subcommand.set_name_prefix(__FILE__, self)
11
- HELP = <<-EOH
12
- #{CMD}
13
- #{CMD} [names]
14
-
15
- Show local variables including parameters of the current stack frame.
16
- Normally for each which show both the name and value. If you just
17
- want a list of names add parameter 'names'.
18
- EOH
19
- SHORT_HELP = 'Show local variables of the current stack frame'
20
- MIN_ARGS = 0
21
- MAX_ARGS = 1
22
- MIN_ABBREV = 'lo'.size
23
- NEED_STACK = true
24
- end
25
-
26
- def get_local_names
27
- @proc.frame.local_variables.keys
28
- end
9
+ HELP = 'Same thing as "info locals"'
10
+ NEED_LOCALS = true
11
+ end
29
12
 
30
13
  def run(args)
31
- if args.size == 3
32
- if 0 == 'names'.index(args[-1].downcase)
33
- local_names = get_local_names()
34
- if local_names.empty?
35
- msg "No local variables defined."
36
- else
37
- section "Local variable names:"
38
- width = settings[:maxwidth]
39
- mess = Columnize::columnize(local_names,
40
- @proc.settings[:maxwidth], ' ',
41
- false, true, ' ' * 2).chomp
42
- msg mess
43
- end
44
- else
45
- errmsg("unrecognized argument #{args[2]}")
46
- end
47
- elsif args.size == 2
48
- local_names = get_local_names
49
- if local_names.empty?
50
- msg "No local variables defined."
51
- else
52
- section "Local variables:"
53
- @proc.frame.local_variables.each do |var_name, var_value|
54
- msg("#{var_name} = #{var_value}")
55
- end
56
- end
57
- else
58
- errmsg("Wrong number of arguments #{args.size}")
59
- end
14
+ @proc.commands['info'].run(%w(info variables locals))
60
15
  end
61
16
  end
62
17
 
63
18
  if __FILE__ == $0
64
19
  # Demo it.
65
20
  require_relative '../../mock'
66
- cmd = MockDebugger::sub_setup(Trepan::Subcommand::InfoLocals, false)
67
- cmd.run(cmd.prefix)
68
- cmd.run(cmd.prefix + ['name'])
21
+ # ???
69
22
  end
@@ -10,6 +10,7 @@ end
10
10
  require 'columnize'
11
11
  require_relative '../base/subcmd'
12
12
  require_relative '../../../app/complete'
13
+ require_relative '../../../app/run'
13
14
 
14
15
  class Trepan::Subcommand::InfoSource < Trepan::Subcommand
15
16
  unless defined?(HELP)
@@ -52,10 +53,15 @@ EOH
52
53
  max_line = LineCache::size(canonic_name)
53
54
  msg 'File has %d lines.' % max_line if max_line
54
55
  msg('SHA1 is %s.' % LineCache::sha1(canonic_name))
55
- msg('Possible breakpoint line numbers:')
56
- lines = LineCache.trace_line_numbers(canonic_name)
57
- fmt_lines = columnize_numbers(lines)
58
- msg(fmt_lines)
56
+ syntax_errors = Trepan::ruby_syntax_errors(canonic_name)
57
+ if syntax_errors
58
+ msg('Not a syntactically-correct Ruby program.')
59
+ else
60
+ msg('Possible breakpoint line numbers:')
61
+ lines = LineCache.trace_line_numbers(canonic_name)
62
+ fmt_lines = columnize_numbers(lines)
63
+ msg(fmt_lines)
64
+ end
59
65
  msg("Stat info:\n\t%s" % LineCache::stat(canonic_name).pretty_inspect)
60
66
  end
61
67
  end
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative '../base/subsubcmd'
5
+ require_relative '../base/subsubmgr'
6
+
7
+ class Trepan::Subcommand::InfoVariables < Trepan::SubSubcommandMgr
8
+ unless defined?(HELP)
9
+ Trepanning::Subcommand.set_name_prefix(__FILE__, self)
10
+ HELP = <<-EOH
11
+ #{CMD} [locals|globals|instance]
12
+
13
+ List various classes of variables for the current stack frame.
14
+
15
+ Examples:
16
+ #{CMD} locals # show local variables
17
+ #{CMD} globals # show global variables
18
+ EOH
19
+ NEED_STACK = true
20
+ SHORT_HELP = 'List names and/or values from the current stack frame'
21
+ end
22
+ end
23
+
24
+ if __FILE__ == $0
25
+ # Demo it.
26
+ require_relative '../../mock'
27
+ dbgr, parent_cmd = MockDebugger::setup('info', false)
28
+ cmd = Trepan::Subcommand::InfoVariables.new(dbgr.processor,
29
+ parent_cmd)
30
+ cmd.run(cmd.prefix + %w(locals))
31
+ cmd.run(cmd.prefix + %w(globals name))
32
+ %w(loc glo globals i).each do |prefix|
33
+ p [prefix, cmd.complete(prefix)]
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'locals'
5
+
6
+ class Trepan::Subcommand::InfoVariablesClass <
7
+ Trepan::Subcommand::InfoVariablesLocals
8
+ Trepan::Util.suppress_warnings {
9
+ Trepanning::Subcommand.set_name_prefix(__FILE__, self)
10
+ HELP = <<-EOH
11
+ #{CMD}
12
+ #{CMD} [names]
13
+
14
+ Show class variables of the current stack frame.
15
+ Normally for each which show both the name and value. If you just
16
+ want a list of names add parameter 'names'.
17
+ EOH
18
+ SHORT_HELP = 'Show instance variables of the current stack frame'
19
+ MIN_ABBREV = 'cl'.size
20
+ MIN_ARGS = 0
21
+ MAX_ARGS = 1
22
+ NEED_STACK = true
23
+ }
24
+
25
+ def get_names
26
+ @proc.debug_eval_no_errmsg('self.class_variables') || []
27
+ end
28
+
29
+ def run(args)
30
+ run_for_type(args, 'class', @proc.debug_eval('self'))
31
+ end
32
+ end
33
+
34
+ if __FILE__ == $0
35
+ # Demo it.
36
+ require_relative '../../mock'
37
+ cmd =
38
+ MockDebugger::subsub_setup(Trepan::Subcommand::InfoVariables,
39
+ Trepan::Subcommand::InfoVariablesClass)
40
+ cmd.run(cmd.prefix)
41
+ cmd.run(cmd.prefix + ['name'])
42
+ end
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'locals'
5
+
6
+ class Trepan::Subcommand::InfoVariablesConstant <
7
+ Trepan::Subcommand::InfoVariablesLocals
8
+ Trepan::Util.suppress_warnings {
9
+ Trepanning::Subcommand.set_name_prefix(__FILE__, self)
10
+ HELP = <<-EOH
11
+ #{CMD}
12
+ #{CMD} [names]
13
+
14
+ Show class constants of the current stack frame.
15
+ Normally for each which show both the name and value. If you just
16
+ want a list of names add parameter 'names'.
17
+ EOH
18
+ SHORT_HELP = 'Show class constants via the current stack frame'
19
+ MIN_ABBREV = 'co'.size
20
+ MIN_ARGS = 0
21
+ MAX_ARGS = 1
22
+ NEED_STACK = true
23
+ }
24
+
25
+ def get_names
26
+ @proc.debug_eval_no_errmsg('self.class.constants.sort') || []
27
+ end
28
+
29
+ def run(args)
30
+ run_for_type(args, 'constant', @proc.debug_eval('self'))
31
+ end
32
+ end
33
+
34
+ if __FILE__ == $0
35
+ # Demo it.
36
+ require_relative '../../mock'
37
+ cmd =
38
+ MockDebugger::subsub_setup(Trepan::Subcommand::InfoVariables,
39
+ Trepan::Subcommand::InfoVariablesConstant)
40
+ cmd.run(cmd.prefix)
41
+ cmd.run(cmd.prefix + ['name'])
42
+ end
@@ -1,12 +1,10 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require 'columnize'
5
- require_relative '../base/subcmd'
6
- require_relative '../../../app/frame'
4
+ require_relative 'locals'
7
5
 
8
- class Trepan::Subcommand::InfoGlobals < Trepan::Subcommand
9
- unless defined?(HELP)
6
+ class Trepan::SubSubcommand::InfoVariablesGlobals < Trepan::SubSubcommand
7
+ Trepan::Util.suppress_warnings {
10
8
  Trepanning::Subcommand.set_name_prefix(__FILE__, self)
11
9
  HELP = <<-EOH
12
10
  #{CMD}
@@ -19,34 +17,39 @@ EOH
19
17
  SHORT_HELP = 'Show global variables'
20
18
  MIN_ARGS = 0
21
19
  MAX_ARGS = 1
22
- MIN_ABBREV = 'gl'.size
23
20
  NEED_STACK = true
21
+ }
22
+
23
+ def get_names
24
+ global_variables.sort
24
25
  end
25
26
 
26
27
  def run(args)
27
- if args.size == 3
28
+ if args.size == 2
28
29
  if 0 == 'names'.index(args[-1].downcase)
29
- if global_variables.empty?
30
+ names = get_names()
31
+ if names.empty?
30
32
  msg "No global variables defined."
31
33
  else
32
34
  section "Global variable names:"
33
35
  width = settings[:maxwidth]
34
- mess = Columnize::columnize(global_variables.sort,
36
+ mess = Columnize::columnize(names,
35
37
  @proc.settings[:maxwidth], ' ',
36
38
  false, true, ' ' * 2).chomp
37
39
  msg mess
38
40
  end
39
41
  else
40
- errmsg("unrecognized argument #{args[2]}")
42
+ errmsg("unrecognized argument: #{args[-1]}")
41
43
  end
42
- elsif args.size == 2
43
- if global_variables.empty?
44
+ elsif args.size == 1
45
+ names = get_names
46
+ if names.empty?
44
47
  msg "No global variables defined."
45
48
  else
46
49
  section "Global variables:"
47
- global_variables.sort.each do |var_name|
48
- s = @proc.debug_eval(var_name)
49
- msg("#{var_name} = #{s.inspect}")
50
+ names.each do |var_name|
51
+ s = @proc.debug_eval(var_name.to_s)
52
+ msg("#{var_name} = #{s.inspect}", :code=>true)
50
53
  end
51
54
  end
52
55
  else
@@ -57,8 +60,10 @@ end
57
60
 
58
61
  if __FILE__ == $0
59
62
  # Demo it.
60
- require_relative '../../mock'
61
- cmd = MockDebugger::sub_setup(Trepan::Subcommand::InfoGlobals, false)
63
+ require_relative '../../../mock'
64
+ require_relative '../variables'
65
+ cmd = MockDebugger::subsub_setup(Trepan::Subcommand::InfoVariables,
66
+ Trepan::SubSubcommand::InfoVariablesGlobals)
62
67
  cmd.run(cmd.prefix)
63
68
  cmd.run(cmd.prefix + ['name'])
64
69
  end
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'locals'
5
+
6
+ class Trepan::Subcommand::InfoVariablesInstance <
7
+ Trepan::Subcommand::InfoVariablesLocals
8
+ Trepan::Util.suppress_warnings {
9
+ Trepanning::Subcommand.set_name_prefix(__FILE__, self)
10
+ HELP = <<-EOH
11
+ #{CMD}
12
+ #{CMD} [names]
13
+
14
+ Show instance variables of the current stack frame.
15
+ Normally for each which show both the name and value. If you just
16
+ want a list of names add parameter 'names'.
17
+ EOH
18
+ SHORT_HELP = 'Show instance variables of the current stack frame'
19
+ MIN_ARGS = 0
20
+ MAX_ARGS = 1
21
+ MIN_ABBREV = 'iv'.size
22
+ NEED_STACK = true
23
+ }
24
+
25
+ def get_names
26
+ @proc.debug_eval('self.instance_variables')
27
+ end
28
+
29
+ def run(args)
30
+ run_for_type(args, 'instance', @proc.debug_eval('self'))
31
+ end
32
+ end
33
+
34
+ if __FILE__ == $0
35
+ # Demo it.
36
+ require_relative '../../mock'
37
+ cmd =
38
+ MockDebugger::subsub_setup(Trepan::Subcommand::InfoVariables,
39
+ Trepan::Subcommand::InfoVariablesInstance)
40
+ cmd.run(cmd.prefix)
41
+ cmd.run(cmd.prefix + ['name'])
42
+ end
@@ -0,0 +1,80 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require 'columnize'
5
+ require_relative '../../base/subsubcmd'
6
+ require_relative '../../../../app/frame'
7
+ require_relative '../../../../app/util'
8
+
9
+ class Trepan::Subcommand::InfoVariablesLocals < Trepan::SubSubcommand
10
+ Trepan::Util.suppress_warnings {
11
+ Trepanning::Subcommand.set_name_prefix(__FILE__, self)
12
+ HELP = <<-EOH
13
+ #{CMD}
14
+ #{CMD} [names]
15
+
16
+ Show local variables including parameters of the current stack frame.
17
+ Normally for each which show both the name and value. If you just
18
+ want a list of names add parameter 'names'.
19
+ EOH
20
+ SHORT_HELP = 'Show local variables of the current stack frame'
21
+ MIN_ARGS = 0
22
+ MAX_ARGS = 1
23
+ MIN_ABBREV = 'lo'.size
24
+ NEED_STACK = true
25
+ }
26
+
27
+ def get_names
28
+ @proc.state.context.frame_args(@proc.state.frame_pos)
29
+ end
30
+
31
+ def run_for_type(args, type, klass=nil)
32
+ suffix = klass ? " for #{klass.to_s}" : ''
33
+ names = get_names()
34
+ if args.size == 2
35
+ if 0 == 'names'.index(args[-1].downcase)
36
+ names = get_names()
37
+ if names.empty?
38
+ msg "No #{type} variables defined."
39
+ else
40
+ section "#{type.capitalize} variable names#{suffix}:"
41
+
42
+ width = settings[:maxwidth]
43
+ mess = Columnize::columnize(names,
44
+ @proc.settings[:maxwidth], ' ',
45
+ false, true, ' ' * 2).chomp
46
+ msg mess
47
+ end
48
+ else
49
+ errmsg("unrecognized argument: #{args[-1]}")
50
+ end
51
+ elsif args.size == 1
52
+ if names.empty?
53
+ msg "No #{type} variables defined#{suffix}."
54
+ else
55
+ section "#{type.capitalize} variables#{suffix}:"
56
+ names.each do |var_name|
57
+ var_value =
58
+ @proc.safe_rep(@proc.debug_eval_no_errmsg(var_name).inspect)
59
+ msg("#{var_name} = #{var_value}", :code =>true)
60
+ end
61
+ end
62
+ else
63
+ errmsg("Wrong number of arguments #{args.size}")
64
+ end
65
+ end
66
+ def run(args)
67
+ run_for_type(args, 'local', @proc.debug_eval('self'))
68
+ end
69
+ end
70
+
71
+ if __FILE__ == $0
72
+ # Demo it.
73
+ require_relative '../../../mock'
74
+ require_relative '../variables'
75
+ cmd = MockDebugger::subsub_setup(Trepan::SubSubcommand::InfoVariables,
76
+ Trepan::SubSubcommand::InfoVariablesLocals
77
+ )
78
+ cmd.run([])
79
+ cmd.run(['name'])
80
+ end
@@ -1,6 +1,6 @@
1
1
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
2
  require 'rubygems'; require 'require_relative'
3
- require_relative 'base/cmd'
3
+ require_relative '../command'
4
4
  class Trepan::Command::KillCommand < Trepan::Command
5
5
 
6
6
  unless defined?(HELP)
@@ -35,9 +35,10 @@ Examples:
35
35
  end
36
36
 
37
37
  def complete(prefix)
38
- completions = Signal.list.keys +
38
+ completions = Signal.list.keys + Signal.list.keys.map{|k| k.downcase} +
39
39
  Signal.list.values.map{|i| i.to_s} +
40
- Signal.list.values.map{|i| (-i).to_s}
40
+ Signal.list.values.map{|i| (-i).to_s} +
41
+ ['unconditionally']
41
42
  Trepan::Complete.complete_token(completions, prefix)
42
43
  end
43
44
 
@@ -59,10 +60,10 @@ Examples:
59
60
  end
60
61
  end
61
62
  begin
62
- ## @proc.intf.finalize if 'KILL' == sig || Signal['KILL'] == sig
63
+ ## @proc.intf.finalize if 'KILL' == sig || Signal.list['KILL'] == sig
63
64
  Process.kill(sig, Process.pid)
64
- rescue Errno::ESRCH
65
- errmsg "Unable to send kill #{sig} to process #{Process.pid}"
65
+ rescue Errno::ESRCH, Errno::EINVAL, Errno::EPERM, RangeError
66
+ errmsg "Unable to send kill #{sig} to process #{Process.pid}: #{$!}"
66
67
  end
67
68
  end
68
69
  end
@@ -70,7 +71,7 @@ end
70
71
  if __FILE__ == $0
71
72
  require_relative '../mock'
72
73
  dbgr, cmd = MockDebugger::setup
73
- %w(fooo 1 -1 HUP -9).each do |arg|
74
+ %w(fooo 100 1 -1 HUP -9).each do |arg|
74
75
  puts "#{cmd.name} #{arg}"
75
76
  cmd.run([cmd.name, arg])
76
77
  puts '=' * 40
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require_relative './base/cmd'
4
+ require_relative '../command'
5
5
 
6
6
  class Trepan::Command::ListCommand < Trepan::Command
7
7
  unless defined?(HELP)
@@ -29,7 +29,7 @@ In the third form, list lines centered around the current line.
29
29
  Use 'set max list' or 'show max list' to see or set the value.
30
30
  HELP
31
31
 
32
- ALIASES = %W(l)
32
+ ALIASES = %W(l cat)
33
33
  CATEGORY = 'files'
34
34
  MAX_ARGS = 2
35
35
  SHORT_HELP = 'List source code'
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require_relative 'base/cmd'
4
+ require_relative '../command'
5
5
  require_relative '../eval'
6
6
  class Trepan::Command::MacroCommand < Trepan::Command
7
7
 
@@ -11,25 +11,43 @@ class Trepan::Command::MacroCommand < Trepan::Command
11
11
  #{NAME} MACRO-NAME PROC-OBJECT
12
12
 
13
13
  Define MACRO-NAME as a debugger macro. Debugger macros get a list of
14
- arguments.
14
+ arguments. Debugger macros get a list of arguments which you supply
15
+ without parenthesis or commas. See below for an example.
15
16
 
16
- The macro should return either a String or an Array of Strings which
17
- is substituted for the command. If the return is a String, that gets
18
- tokenized by a simple String#split . Note that macro processing is
19
- done right after splitting on ;; so if the macro returns a string
20
- containing ;; this will not be handled on the string returned.
17
+ The macro (really a Ruby Proc) should return either a String or an
18
+ Array of Strings. The string in both cases are strings of debugger
19
+ commands. If the return is a String, that gets tokenized by a simple
20
+ String#split . Note that macro processing is done right after
21
+ splitting on ;; so if the macro returns a string containing ;; this
22
+ will not be handled on the string returned.
21
23
 
22
24
  If instead, Array of Strings is returned, then the first string is
23
- unshifted from the array and executed. The remaning strings are pushed
25
+ shifted from the array and executed. The remaning strings are pushed
24
26
  onto the command queue. In contrast to the first string, subsequent
25
27
  strings can contain other macros, and ;; in those strings will be
26
28
  split into separate commands.
27
29
 
28
- Here is an example. The below creates a macro called finish+ which
30
+ Here is an example. The below creates a macro called fin+ which
29
31
  issues two commands 'finish' followed by 'step':
30
32
 
31
33
  macro fin+ Proc.new{|*args| %w(finish step)}
32
34
 
35
+ If you wanted to parameterize the argument of the 'finish' command you
36
+ could do that this way:
37
+
38
+ macro fin+ Proc.new{|*args| ['finish \#{args[0]}' 'step']}
39
+
40
+ Invoking with
41
+ fin+ 3
42
+
43
+ would expand to ["finish 3", "step"]
44
+
45
+ If you were to add another parameter for 'step', the note that the
46
+ invocation might be:
47
+ fin+ 3 2
48
+
49
+ rather than 'fin+(3,2)' or 'fin+ 3, 2'.
50
+
33
51
  See also 'show macro'.
34
52
  HELP
35
53
 
@@ -1,6 +1,6 @@
1
1
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
2
  require 'rubygems'; require 'require_relative'
3
- require_relative 'base/cmd'
3
+ require_relative '../command'
4
4
 
5
5
  class Trepan::Command::NextCommand < Trepan::Command
6
6
 
@@ -3,7 +3,7 @@
3
3
  begin
4
4
  require 'rubygems'; require 'require_relative'
5
5
  require 'parse_tree'
6
- require_relative 'base/cmd'
6
+ require_relative '../command'
7
7
  require_relative '../../app/cmd_parse'
8
8
  class Trepan::Command::ParseTreeCommand < Trepan::Command
9
9
 
@@ -2,7 +2,7 @@
2
2
  # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
4
  require 'pp'
5
- require_relative 'base/cmd'
5
+ require_relative '../command'
6
6
  class Trepan::Command::PPCommand < Trepan::Command
7
7
 
8
8
  unless defined?(HELP)
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require_relative 'base/cmd'
4
+ require_relative '../command'
5
5
  class Trepan::Command::PrCommand < Trepan::Command
6
6
 
7
7
  unless defined?(HELP)
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require_relative 'base/cmd'
4
+ require_relative '../command'
5
5
  require_relative '../eval'
6
6
  class Trepan::Command::PsCommand < Trepan::Command
7
7
 
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require_relative 'base/cmd'
4
+ require_relative '../command'
5
5
  ## require_relative '../../app/run'
6
6
  class Trepan::Command::RestartCommand < Trepan::Command
7
7
 
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require 'rubygems'; require 'require_relative'
4
- require_relative 'base/cmd'
4
+ require_relative '../command'
5
5
  class Trepan::Command::SaveCommand < Trepan::Command
6
6
 
7
7
  unless defined?(HELP)
@@ -6,8 +6,14 @@ require_relative '../base/subsubmgr'
6
6
 
7
7
  class Trepan::SubSubcommand::SetAuto < Trepan::SubSubcommandMgr
8
8
  unless defined?(HELP)
9
- HELP = 'Set controls for things with some sort of "automatic" default behavior'
10
9
  Trepanning::Subcommand.set_name_prefix(__FILE__, self)
10
+ HELP = <<-EOH
11
+ Set controls for things with some sort of "automatic" default behavior.
12
+
13
+ See "#{PREFIX.join(' ')} *" for a list of subcommands or "#{PREFIX.join(' ')} <name>"
14
+ for help on a particular trace subcommand.
15
+ EOH
16
+ SHORT_HELP = 'Set controls for some "automatic" default behaviors'
11
17
  end
12
18
  end
13
19
 
@@ -10,7 +10,7 @@ class Trepan::Subcommand::SetDifferent < Trepan::SetBoolSubcommand
10
10
  HELP = <<-EOH
11
11
  #{PREFIX.join(' ')} [on|off|nostack]
12
12
 
13
- Make sure 'next/step' moves to a new line number.
13
+ Set to make sure 'next' or 'step' moves to a new position.
14
14
 
15
15
  Due to the interpretive, expression-oriented nature of the Ruby
16
16
  Language and implementation, each line often may contain many possible