debugger 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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}"