debugger 1.4.0 → 1.5.0

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 (75) hide show
  1. data/CHANGELOG.md +4 -0
  2. data/README.md +9 -3
  3. data/debugger.gemspec +1 -1
  4. data/ext/ruby_debug/192/ruby_debug.c +21 -9
  5. data/ext/ruby_debug/193/ruby_debug.c +15 -5
  6. data/lib/debugger/test.rb +6 -0
  7. data/{test/support → lib/debugger/test}/breakpoint.rb +0 -0
  8. data/{test/support → lib/debugger/test}/context.rb +0 -0
  9. data/{test/support → lib/debugger/test}/matchers.rb +0 -0
  10. data/{test/support → lib/debugger/test}/mocha_extensions.rb +1 -1
  11. data/lib/debugger/test/printer_helpers.rb +8 -0
  12. data/{test/support → lib/debugger/test}/processor.rb +0 -0
  13. data/{test/support → lib/debugger/test}/test_dsl.rb +22 -2
  14. data/{test/support → lib/debugger/test}/test_interface.rb +4 -0
  15. data/lib/debugger/version.rb +1 -1
  16. data/lib/ruby-debug.rb +4 -1
  17. data/lib/ruby-debug/command.rb +18 -6
  18. data/lib/ruby-debug/commands/breakpoints.rb +27 -29
  19. data/lib/ruby-debug/commands/condition.rb +7 -2
  20. data/lib/ruby-debug/commands/continue.rb +1 -2
  21. data/lib/ruby-debug/commands/control.rb +8 -9
  22. data/lib/ruby-debug/commands/display.rb +7 -15
  23. data/lib/ruby-debug/commands/edit.rb +6 -6
  24. data/lib/ruby-debug/commands/enable.rb +6 -7
  25. data/lib/ruby-debug/commands/eval.rb +1 -3
  26. data/lib/ruby-debug/commands/frame.rb +72 -101
  27. data/lib/ruby-debug/commands/info.rb +8 -14
  28. data/lib/ruby-debug/commands/irb.rb +1 -1
  29. data/lib/ruby-debug/commands/jump.rb +6 -6
  30. data/lib/ruby-debug/commands/kill.rb +0 -1
  31. data/lib/ruby-debug/commands/list.rb +4 -4
  32. data/lib/ruby-debug/commands/method.rb +8 -11
  33. data/lib/ruby-debug/commands/quit.rb +1 -1
  34. data/lib/ruby-debug/commands/reload.rb +1 -1
  35. data/lib/ruby-debug/commands/save.rb +1 -1
  36. data/lib/ruby-debug/commands/set.rb +10 -15
  37. data/lib/ruby-debug/commands/show.rb +28 -42
  38. data/lib/ruby-debug/commands/skip.rb +1 -1
  39. data/lib/ruby-debug/commands/source.rb +1 -1
  40. data/lib/ruby-debug/commands/start.rb +26 -0
  41. data/lib/ruby-debug/commands/threads.rb +29 -18
  42. data/lib/ruby-debug/commands/tmate.rb +1 -1
  43. data/lib/ruby-debug/commands/trace.rb +6 -7
  44. data/lib/ruby-debug/commands/variables.rb +36 -19
  45. data/lib/ruby-debug/helper.rb +5 -5
  46. data/lib/ruby-debug/interface.rb +15 -3
  47. data/lib/ruby-debug/printers/base.rb +58 -0
  48. data/lib/ruby-debug/printers/plain.rb +41 -0
  49. data/lib/ruby-debug/printers/texts/base.yml +146 -0
  50. data/lib/ruby-debug/printers/texts/plain.yml +60 -0
  51. data/lib/ruby-debug/processor.rb +56 -47
  52. data/test/breakpoints_test.rb +43 -54
  53. data/test/conditions_test.rb +18 -6
  54. data/test/continue_test.rb +1 -1
  55. data/test/display_test.rb +11 -11
  56. data/test/edit_test.rb +1 -2
  57. data/test/eval_test.rb +5 -6
  58. data/test/finish_test.rb +1 -1
  59. data/test/frame_test.rb +29 -27
  60. data/test/help_test.rb +0 -1
  61. data/test/info_test.rb +10 -14
  62. data/test/irb_test.rb +0 -1
  63. data/test/jump_test.rb +21 -2
  64. data/test/method_test.rb +3 -3
  65. data/test/new/printers/plain_test.rb +84 -0
  66. data/test/reload_test.rb +2 -2
  67. data/test/restart_test.rb +1 -2
  68. data/test/set_test.rb +8 -7
  69. data/test/show_test.rb +22 -22
  70. data/test/source_test.rb +1 -1
  71. data/test/test_helper.rb +2 -1
  72. data/test/thread_test.rb +11 -13
  73. data/test/trace_test.rb +7 -7
  74. data/test/variables_test.rb +33 -15
  75. metadata +20 -12
@@ -1,21 +1,34 @@
1
1
  module Debugger
2
2
  module ThreadFunctions # :nodoc:
3
- def display_context(c, show_top_frame=true)
4
- c_flag = c.thread == Thread.current ? '+' : ' '
5
- c_flag = '$' if c.suspended?
6
- d_flag = c.ignored? ? '!' : ' '
7
- print "%s%s", c_flag, d_flag
8
- print "%d ", c.thnum
9
- print "%s\t", c.thread.inspect
10
- if c.stack_size > 0 and show_top_frame
11
- print "%s:%d", c.frame_file(0), c.frame_line(0)
3
+ def display_context(context, should_show_top_frame = true)
4
+ print pr("thread.context", thread_arguments(context, should_show_top_frame))
5
+ end
6
+
7
+ def thread_arguments(context, should_show_top_frame = true)
8
+ is_current = context.thread == Thread.current
9
+ status_flag = if context.suspended?
10
+ "$"
11
+ else
12
+ is_current ? '+' : ' '
12
13
  end
13
- print "\n"
14
+ debug_flag = context.ignored? ? '!' : ' '
15
+ file_line = if context.stack_size > 0 && should_show_top_frame
16
+ "#{context.frame_file(0)}:#{context.frame_line(0)}"
17
+ end
18
+ {
19
+ status_flag: status_flag,
20
+ debug_flag: debug_flag,
21
+ id: context.thnum,
22
+ thread: context.thread.inspect,
23
+ file_line: file_line,
24
+ status: context.thread.status,
25
+ current: is_current ? "yes" : "no"
26
+ }
14
27
  end
15
28
 
16
29
  def parse_thread_num(subcmd, arg)
17
30
  if '' == arg
18
- errmsg "'%s' needs a thread number\n" % subcmd
31
+ errmsg pr("thread.errors.no_number", subcmd: subcmd)
19
32
  nil
20
33
  else
21
34
  thread_num = get_int(arg, "thread #{subcmd}", 1)
@@ -29,11 +42,11 @@ module Debugger
29
42
  return nil unless c
30
43
  case
31
44
  when nil == c
32
- errmsg "No such thread.\n"
45
+ errmsg pr("thread.errors.no_thread")
33
46
  when @state.context == c
34
- errmsg "It's the current thread.\n"
47
+ errmsg pr("thread.errors.current_thread")
35
48
  when c.ignored?
36
- errmsg "Can't #{subcmd} to the debugger thread #{arg}.\n"
49
+ errmsg pr("thread.errors.wrong_action", subcmd: subcmd, arg: arg)
37
50
  else # Everything is okay
38
51
  return c
39
52
  end
@@ -49,9 +62,7 @@ module Debugger
49
62
  end
50
63
 
51
64
  def execute
52
- threads = Debugger.contexts.sort_by{|c| c.thnum}.each do |c|
53
- display_context(c)
54
- end
65
+ print prc("thread.context", Debugger.contexts.sort_by(&:thnum)) { |context, _| thread_arguments(context) }
55
66
  end
56
67
 
57
68
  class << self
@@ -109,7 +120,7 @@ module Debugger
109
120
  c = parse_thread_num_for_cmd("thread resume", @match[1])
110
121
  return unless c
111
122
  if !c.thread.stop?
112
- print "Already running."
123
+ errmsg pr("thread.errors.already_running")
113
124
  return
114
125
  end
115
126
  c.resume
@@ -9,7 +9,7 @@ module Debugger
9
9
  if @match[1]
10
10
  frm_n = @match[1].to_i
11
11
  if frm_n > @state.context.stack_size || frm_n == 0
12
- print "Wrong frame number\n"
12
+ print pr("tmate.errors.wrong_frame")
13
13
  return
14
14
  end
15
15
  file, line = @state.context.frame_file(frm_n-1), @state.context.frame_line(frm_n-1)
@@ -12,31 +12,30 @@ module Debugger
12
12
  onoff = 'on' == @match[1]
13
13
  if @match[2]
14
14
  Debugger.tracing = onoff
15
- print "Tracing %s all threads.\n" % (onoff ? 'on' : 'off')
15
+ print pr("trace.messages.all_threads", status: onoff ? 'on' : 'off')
16
16
  else
17
17
  Debugger.current_context.tracing = onoff
18
- print "Tracing %s on current thread.\n" % (onoff ? 'on' : 'off')
18
+ print pr("trace.messages.current_thread", status: onoff ? 'on' : 'off')
19
19
  end
20
20
  elsif @match[1] =~ /var(?:iable)?/
21
21
  varname=@match[2]
22
22
  if debug_eval("defined?(#{varname})")
23
23
  if @match[3] && @match[3] !~ /(:?no)?stop/
24
- errmsg("expecting 'stop' or 'nostop'; got %s\n" % @match[3])
24
+ errmsg pr("trace.errors.wrong_var_subcommand", subcmd: @match[3])
25
25
  else
26
26
  dbg_cmd = if @match[3] && (@match[3] !~ /nostop/)
27
27
  'debugger' else '' end
28
28
  end
29
29
  eval("
30
30
  trace_var(:#{varname}) do |val|
31
- print \"traced variable #{varname} has value \#{val}\n\"
31
+ print pr('trace.trace', name: '#{varname}', value: val)
32
32
  #{dbg_cmd}
33
33
  end")
34
34
  else
35
- errmsg "#{varname} is not a global variable.\n"
35
+ errmsg pr("trace.errors.var_is_not_global", name: varname)
36
36
  end
37
37
  else
38
- errmsg("expecting 'on', 'off', 'var' or 'variable'; got: %s\n" %
39
- @match[1])
38
+ errmsg pr("trace.errors.wrong_subcommand", subcmd: @match[1])
40
39
  end
41
40
  end
42
41
 
@@ -1,8 +1,7 @@
1
1
  module Debugger
2
2
  module VarFunctions # :nodoc:
3
3
  def var_list(ary, b = get_binding)
4
- ary.sort!
5
- for v in ary
4
+ vars = ary.sort.map do |v|
6
5
  begin
7
6
  s = debug_eval(v.to_s, b).inspect
8
7
  rescue
@@ -15,13 +14,17 @@ module Debugger
15
14
  if s.size > self.class.settings[:width]
16
15
  s[self.class.settings[:width]-3 .. -1] = "..."
17
16
  end
18
- print "%s = %s\n", v, s
17
+ [v, s]
19
18
  end
19
+ print prv(vars, 'instance')
20
20
  end
21
21
  def var_class_self
22
22
  obj = debug_eval('self')
23
23
  var_list(obj.class.class_variables, get_binding)
24
24
  end
25
+ def var_global
26
+ var_list(global_variables.reject { |v| [:$=, :$KCODE, :$-K].include?(v) })
27
+ end
25
28
  end
26
29
 
27
30
  # Implements the debugger 'var class' command.
@@ -59,15 +62,13 @@ module Debugger
59
62
  def execute
60
63
  obj = debug_eval(@match.post_match)
61
64
  if obj.kind_of? Module
62
- constants = debug_eval("#{@match.post_match}.constants")
63
- constants.sort!
64
- for c in constants
65
- next if c =~ /SCRIPT/
66
- value = obj.const_get(c) rescue "ERROR: #{$!}"
67
- print " %s => %p\n", c, value
65
+ constants = debug_eval("#{@match.post_match}.constants").sort.reject { |c| c =~ /SCRIPT/ }.map do |constant|
66
+ value = obj.const_get(constant) rescue "ERROR: #{$!}"
67
+ [constant, value]
68
68
  end
69
+ print prv(constants, "constant")
69
70
  else
70
- print "Should be Class/Module: %s\n", @match.post_match
71
+ errmsg pr("variable.errors.not_class_module", object: @match.post_match)
71
72
  end
72
73
  end
73
74
 
@@ -90,7 +91,7 @@ module Debugger
90
91
  end
91
92
 
92
93
  def execute
93
- var_list(global_variables)
94
+ var_global
94
95
  end
95
96
 
96
97
  class << self
@@ -108,11 +109,12 @@ module Debugger
108
109
 
109
110
  class VarInstanceCommand < Command # :nodoc:
110
111
  def regexp
111
- /^\s*v(?:ar)?\s+ins(?:tance)?\s*/
112
+ # id will be read as first match, name as post match
113
+ /^\s*v(?:ar)?\s+ins(?:tance)?\s*((?:[\\+-]0x)[\dabcdef]+)?/
112
114
  end
113
115
 
114
116
  def execute
115
- obj = debug_eval(@match.post_match.empty? ? 'self' : @match.post_match)
117
+ obj = get_obj(@match)
116
118
  var_list(obj.instance_variables, obj.instance_eval{binding()})
117
119
  end
118
120
 
@@ -123,10 +125,25 @@ module Debugger
123
125
 
124
126
  def help(cmd)
125
127
  %{
126
- v[ar] i[nstance] <object>\tshow instance variables of object
128
+ v[ar] i[nstance] <object>\tshow instance variables of object. You may pass object id's hex as well.
127
129
  }
128
130
  end
129
131
  end
132
+
133
+ private
134
+
135
+ def get_obj(match)
136
+ obj = if match[1]
137
+ begin
138
+ ObjectSpace._id2ref(match[1].hex)
139
+ rescue RangeError
140
+ errmsg "Unknown object id : %s" % match[1]
141
+ nil
142
+ end
143
+ else
144
+ debug_eval(match.post_match.empty? ? 'self' : match.post_match)
145
+ end
146
+ end
130
147
  end
131
148
 
132
149
  # Implements the debugger 'var local' command.
@@ -136,11 +153,11 @@ module Debugger
136
153
  end
137
154
 
138
155
  def execute
139
- locals = @state.context.frame_locals(@state.frame_pos)
140
- _self = @state.context.frame_self(@state.frame_pos)
141
- locals.keys.sort.each do |name|
142
- print " %s => %p\n", name, locals[name]
143
- end
156
+ locals = []
157
+ _self = @state.context.frame_self(@state.frame_pos)
158
+ locals << ['self', _self] unless _self.to_s == "main"
159
+ locals += @state.context.frame_locals(@state.frame_pos).sort.map { |key, value| [key, value] }
160
+ print prv(locals, 'instance')
144
161
  end
145
162
 
146
163
  class << self
@@ -11,15 +11,15 @@ module Debugger
11
11
  begin
12
12
  int = Integer(str)
13
13
  if min and int < min
14
- print "%s argument '%s' needs to at least %s.\n" % [cmd, str, min]
14
+ print Debugger.printer.print("parse.errors.int.too_low", cmd: cmd, str: str, min: min)
15
15
  return nil
16
16
  elsif max and int > max
17
- print "%s argument '%s' needs to at most %s.\n" % [cmd, str, max]
17
+ print Debugger.printer.print("parse.errors.int.too_high", cmd: cmd, str: str, max: max)
18
18
  return nil
19
19
  end
20
20
  return int
21
21
  rescue
22
- print "%s argument '%s' needs to be a number.\n" % [cmd, str]
22
+ print Debugger.printer.print("parse.errors.int.not_number", cmd: cmd, str: str)
23
23
  return nil
24
24
  end
25
25
  end
@@ -30,7 +30,7 @@ module Debugger
30
30
  if arg.nil? or arg == ''
31
31
  if default.nil?
32
32
  if print_error
33
- print "Expecting 'on', 1, 'off', or 0. Got nothing.\n"
33
+ print Debugger.printer.print("parse.errors.onoff.syntax", arg: "nothing")
34
34
  raise RuntimeError
35
35
  end
36
36
  return default
@@ -43,7 +43,7 @@ module Debugger
43
43
  return false
44
44
  else
45
45
  if print_error
46
- print "Expecting 'on', 1, 'off', or 0. Got: %s.\n" % arg.to_s
46
+ print Debugger.printer.print("parse.errors.onoff.syntax", arg: arg)
47
47
  raise RuntimeError
48
48
  end
49
49
  end
@@ -28,6 +28,18 @@ module Debugger
28
28
  print afmt(msg)
29
29
  end
30
30
 
31
+ def print_debug(msg)
32
+ print(msg)
33
+ end
34
+
35
+ private
36
+
37
+ def escape_input(args)
38
+ new_args = args.dup
39
+ new_args.first.gsub!("%", "%%") if args.first.is_a?(String)
40
+ new_args
41
+ end
42
+
31
43
  end
32
44
 
33
45
  class LocalInterface < Interface # :nodoc:
@@ -67,7 +79,7 @@ module Debugger
67
79
  end
68
80
 
69
81
  def print(*args)
70
- STDOUT.printf(*args)
82
+ STDOUT.printf(*escape_input(args))
71
83
  end
72
84
 
73
85
  def close
@@ -169,7 +181,7 @@ module Debugger
169
181
  end
170
182
 
171
183
  def print(*args)
172
- @socket.printf(*args)
184
+ @socket.printf(*escape_input(args))
173
185
  end
174
186
 
175
187
  private
@@ -222,7 +234,7 @@ module Debugger
222
234
  end
223
235
 
224
236
  def print(*args)
225
- @out.printf(*args)
237
+ @out.printf(*escape_input(args))
226
238
  end
227
239
 
228
240
  def close
@@ -0,0 +1,58 @@
1
+ require 'yaml'
2
+ module Printers
3
+ class Base
4
+ class MissedPath < StandardError; end
5
+ class MissedArgument < StandardError; end
6
+
7
+ SEPARATOR = "."
8
+
9
+ def type
10
+ self.class.name.split("::").last.downcase
11
+ end
12
+
13
+ private
14
+
15
+ def locate(path)
16
+ result = nil
17
+ contents.each do |_, contents|
18
+ result = parts(path).inject(contents) do |r, part|
19
+ r && r.has_key?(part) ? r[part] : nil
20
+ end
21
+ break if result
22
+ end
23
+ raise MissedPath, "Can't find part path '#{path}'" unless result
24
+ result
25
+ end
26
+
27
+ def translate(string, args = {})
28
+ string.gsub(/\|\w+$/, '').gsub(/{([^}]*)}/) do
29
+ key = $1.to_s.to_sym
30
+ raise MissedArgument, "Missed argument #{$1} for '#{string}'" unless args.has_key?(key)
31
+ args[key]
32
+ end
33
+ end
34
+
35
+ def parts(path)
36
+ path.split(SEPARATOR)
37
+ end
38
+
39
+ def contents
40
+ @contents ||= contents_files.inject({}) do |hash, filename|
41
+ hash[filename] = YAML.load_file(filename) || {}
42
+ hash
43
+ end
44
+ end
45
+
46
+ def array_of_args(collection, &block)
47
+ collection.each.with_index.inject([]) do |array, (item, index)|
48
+ args = block.call(item, index)
49
+ array << args if args
50
+ array
51
+ end
52
+ end
53
+
54
+ def contents_files
55
+ [File.expand_path(File.join("..", "texts", "base.yml"), __FILE__)]
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'base'
2
+ module Printers
3
+ class Plain < Base
4
+ include Columnize
5
+
6
+ def print(path, args = {})
7
+ message = translate(locate(path), args)
8
+ message << " (y/n) " if parts(path).include?("confirmations")
9
+ message << "\n"
10
+ end
11
+
12
+ def print_collection(path, collection, &block)
13
+ modifier = get_modifier(path)
14
+ lines = array_of_args(collection, &block).map { |args| print(path, args) }
15
+ if modifier == 'c'
16
+ columnize(lines.map { |l| l.gsub(/\n$/, '') }, Debugger.settings[:width])
17
+ else
18
+ lines.join("")
19
+ end
20
+ end
21
+
22
+ def print_variables(variables, _kind)
23
+ print_collection("variable.variable", variables) do |(key, value), _|
24
+ {key: key, value: value.nil? ? "nil" : value.to_s}
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def get_modifier(path)
31
+ modifier_regexp = /\|(\w+)$/
32
+ modifier_match = locate(path).match(modifier_regexp)
33
+ modifier_match && modifier_match[1]
34
+ end
35
+
36
+ def contents_files
37
+ [File.expand_path(File.join("..", "texts", "plain.yml"), __FILE__)] + super
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,146 @@
1
+ base:
2
+ errors:
3
+ no_suspended_thread: "There is no thread suspended at the time and therefore no context to execute '{input}'"
4
+ command_unavailable: "Command is unavailable"
5
+ unknown_command: "Unknown command: {input}"
6
+
7
+ breakpoints:
8
+ errors:
9
+ if: "Expecting 'if' in breakpoint condition; got: {expr}"
10
+ location: "Invalid breakpoint location: {expr}"
11
+ state: "We are not in a state that has an associated file"
12
+ class: "Unknown class {file}"
13
+ far_line: "There are only {lines} lines in file '{file}'"
14
+ source: "No source file named {file}"
15
+ state_add: "We are not in a state we can add breakpoints"
16
+ state_delete: "We are not in a state we can delete breakpoints"
17
+ expression: "Expression '{expr}' syntactically incorrect; breakpoint disabled"
18
+ no_breakpoint: "No breakpoint number {id}"
19
+ confirmations:
20
+ set_breakpoint: "Set breakpoint anyway?"
21
+ delete_all: "Delete all breakpoints?"
22
+
23
+ condition:
24
+ errors:
25
+ syntax: "'condition' must be followed a breakpoint number and expression"
26
+ no_breakpoints: "No breakpoints have been set"
27
+
28
+ continue:
29
+ errors:
30
+ unstopped_line: "Line {line} is not a stopping point in file '{file}'"
31
+
32
+ display:
33
+ confirmations:
34
+ clear_all: "Clear all expressions?"
35
+ errors:
36
+ undefined: "Display expression {expr} is not defined"
37
+
38
+ edit:
39
+ errors:
40
+ state: "We are not in a state that has an associated file"
41
+ file_line: "Invalid file/line number specification: {file_line}"
42
+ not_readable: "File '{file}' is not readable"
43
+
44
+ frame:
45
+ errors:
46
+ too_low: "Adjusting would put us beyond the oldest (initial) frame"
47
+ too_high: "Adjusting would put us beyond the newest (innermost) frame"
48
+
49
+ jump:
50
+ errors:
51
+ no_line_number: "'jump' must be followed by a line number"
52
+ bad_line_number: "Bad line number: {line}"
53
+ not_possible: "Not possible to jump from here"
54
+ no_frame: "Couldn't find debugged frame"
55
+ no_active_code: "Couldn't find active code at {file}:{line}"
56
+
57
+ quit:
58
+ confirmations:
59
+ really: "Really quit?"
60
+
61
+ reload:
62
+ messages:
63
+ done: "Source code is reloaded. Automatic reloading is {source_reloading}"
64
+
65
+ restart:
66
+ errors:
67
+ undefined: "Don't know name of debugged program"
68
+ not_exist: "Ruby program {prog} doesn't exist"
69
+ no_args: "Arguments have not been set. Use 'set args' to set them"
70
+ not_available: "Restart command is not available at this time"
71
+ debug:
72
+ outset: "Debugger was not called from the outset..."
73
+ change_initial_dir: "Failed to change initial directory {dir}"
74
+ not_executable: "Ruby program {prog} doesn't seem to be executable...\nWe'll add a call to Ruby"
75
+
76
+ save:
77
+ messages:
78
+ done: "Saved to '{path}'"
79
+
80
+ set:
81
+ errors:
82
+ invalid_call_style: "Invalid call style {style}. Should be one of: 'short' or 'last'"
83
+ wrong_history_arg: "Invalid history parameter {arg}. Should be 'filename', 'save' or 'size'"
84
+ wrong_history_args_number: "Need two parameters for 'set history'; got {size}"
85
+ unknown_setting: "Unknown setting {setting}"
86
+ unknown_subcommand: "Unknown set command {subcmd}"
87
+
88
+ show:
89
+ messages:
90
+ annotation: "Annotation level is {level}"
91
+ args: "Argument list to give program being debugged when it is started is '{args}'"
92
+ general: "{setting} is {status}"
93
+ call_style: "Frame call-display style is {style}"
94
+ debuggertesting: "Currently testing the debugger is {status}"
95
+ fullpath: "Displaying frame's full file names is {status}"
96
+ history:
97
+ filename: "{prefix}The filename in which to record the command history is '{filename}'"
98
+ save: "{prefix}Saving of history save is {status}"
99
+ size: "{prefix}Debugger history size is {size}"
100
+ tracing_plus:
101
+ 'on': "line tracing style is different consecutive lines"
102
+ 'off': "line tracing style is every line"
103
+ listsize: "Number of source lines to list by default is {size}"
104
+ port: "server port is {port}"
105
+ version: "ruby-debug {version}"
106
+ errors:
107
+ no_readline: "No readline support"
108
+ unknown_subcommand: "Unknown show subcommand {name}"
109
+ unknown: "Unknown show command {name}"
110
+
111
+ skip:
112
+ messages:
113
+ ok: "ok"
114
+
115
+ source:
116
+ errors:
117
+ not_found: "Command file '{file}' is not found"
118
+
119
+ thread:
120
+ errors:
121
+ no_number: "'{subcmd}' needs a thread number"
122
+ no_thread: "No such thread"
123
+ current_thread: "It's the current thread"
124
+ wrong_action: "Can't {subcmd} to the debugger thread {arg}"
125
+ already_running: "Already running"
126
+ debug_trace: "DebuggerThread are not supposed to be traced ({thread})"
127
+
128
+ toggle:
129
+ errors:
130
+ no_breakpoints: "No breakpoints have been set"
131
+ no_display: "No display expressions have been set"
132
+ syntax: "'{toggle}' must be followed 'display', 'breakpoints' or breakpoint numbers"
133
+ expression: "Expression '{expr}' syntactically incorrect; breakpoint remains disabled"
134
+
135
+ parse:
136
+ errors:
137
+ int:
138
+ too_low: "{cmd} argument '{str}' needs to at least {min}"
139
+ too_high: "{cmd} argument '{str}' needs to at most {max}"
140
+ not_number: "{cmd} argument '{str}' needs to be a number"
141
+ onoff:
142
+ syntax: "Expecting 'on', 1, 'off', or 0. Got {arg}"
143
+
144
+ variable:
145
+ errors:
146
+ not_class_module: "Should be Class/Module: {object}"