debug 1.3.4 → 1.6.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.
data/lib/debug/color.rb CHANGED
@@ -48,33 +48,29 @@ module DEBUGGER__
48
48
 
49
49
  if defined? IRB::ColorPrinter.pp
50
50
  def color_pp obj, width
51
- if !CONFIG[:no_color]
52
- IRB::ColorPrinter.pp(obj, "".dup, width)
53
- else
54
- obj.pretty_inspect
51
+ with_inspection_error_guard do
52
+ if !CONFIG[:no_color]
53
+ IRB::ColorPrinter.pp(obj, "".dup, width)
54
+ else
55
+ obj.pretty_inspect
56
+ end
55
57
  end
56
58
  end
57
59
  else
58
60
  def color_pp obj, width
59
- obj.pretty_inspect
61
+ with_inspection_error_guard do
62
+ obj.pretty_inspect
63
+ end
60
64
  end
61
65
  end
62
66
 
63
67
  def colored_inspect obj, width: SESSION.width, no_color: false
64
- if !no_color
65
- color_pp obj, width
66
- else
67
- obj.pretty_inspect
68
- end
69
- rescue => ex
70
- err_msg = "#{ex.inspect} rescued during inspection"
71
- string_result = obj.to_s rescue nil
72
-
73
- # don't colorize the string here because it's not from user's application
74
- if string_result
75
- %Q{"#{string_result}" from #to_s because #{err_msg}}
76
- else
77
- err_msg
68
+ with_inspection_error_guard do
69
+ if !no_color
70
+ color_pp obj, width
71
+ else
72
+ obj.pretty_inspect
73
+ end
78
74
  end
79
75
  end
80
76
 
@@ -109,5 +105,19 @@ module DEBUGGER__
109
105
  def colorize_dim(str)
110
106
  colorize(str, [:DIM])
111
107
  end
108
+
109
+ def with_inspection_error_guard
110
+ yield
111
+ rescue Exception => ex
112
+ err_msg = "#{ex.inspect} rescued during inspection"
113
+ string_result = obj.to_s rescue nil
114
+
115
+ # don't colorize the string here because it's not from user's application
116
+ if string_result
117
+ %Q{"#{string_result}" from #to_s because #{err_msg}}
118
+ else
119
+ err_msg
120
+ end
121
+ end
112
122
  end
113
123
  end
data/lib/debug/config.rb CHANGED
@@ -7,60 +7,79 @@ module DEBUGGER__
7
7
  ERROR: 2,
8
8
  WARN: 3,
9
9
  INFO: 4,
10
+ DEBUG: 5
10
11
  }.freeze
11
12
 
12
13
  CONFIG_SET = {
13
14
  # UI setting
14
- log_level: ['RUBY_DEBUG_LOG_LEVEL', "UI: Log level same as Logger (default: WARN)", :loglevel],
15
- show_src_lines: ['RUBY_DEBUG_SHOW_SRC_LINES', "UI: Show n lines source code on breakpoint (default: 10 lines)", :int],
16
- show_frames: ['RUBY_DEBUG_SHOW_FRAMES', "UI: Show n frames on breakpoint (default: 2 frames)", :int],
17
- use_short_path: ['RUBY_DEBUG_USE_SHORT_PATH', "UI: Show shorten PATH (like $(Gem)/foo.rb)", :bool],
18
- no_color: ['RUBY_DEBUG_NO_COLOR', "UI: Do not use colorize (default: false)", :bool],
19
- no_sigint_hook: ['RUBY_DEBUG_NO_SIGINT_HOOK', "UI: Do not suspend on SIGINT (default: false)", :bool],
20
- no_reline: ['RUBY_DEBUG_NO_RELINE', "UI: Do not use Reline library (default: false)", :bool],
15
+ log_level: ['RUBY_DEBUG_LOG_LEVEL', "UI: Log level same as Logger", :loglevel, "WARN"],
16
+ show_src_lines: ['RUBY_DEBUG_SHOW_SRC_LINES', "UI: Show n lines source code on breakpoint", :int, "10"],
17
+ show_frames: ['RUBY_DEBUG_SHOW_FRAMES', "UI: Show n frames on breakpoint", :int, "2"],
18
+ use_short_path: ['RUBY_DEBUG_USE_SHORT_PATH', "UI: Show shorten PATH (like $(Gem)/foo.rb)", :bool, "false"],
19
+ no_color: ['RUBY_DEBUG_NO_COLOR', "UI: Do not use colorize", :bool, "false"],
20
+ no_sigint_hook: ['RUBY_DEBUG_NO_SIGINT_HOOK', "UI: Do not suspend on SIGINT", :bool, "false"],
21
+ no_reline: ['RUBY_DEBUG_NO_RELINE', "UI: Do not use Reline library", :bool, "false"],
22
+ no_hint: ['RUBY_DEBUG_NO_HINT', "UI: Do not show the hint on the REPL", :bool, "false"],
21
23
 
22
24
  # control setting
23
- skip_path: ['RUBY_DEBUG_SKIP_PATH', "CONTROL: Skip showing/entering frames for given paths (default: [])", :path],
24
- skip_nosrc: ['RUBY_DEBUG_SKIP_NOSRC', "CONTROL: Skip on no source code lines (default: false)", :bool],
25
- keep_alloc_site:['RUBY_DEBUG_KEEP_ALLOC_SITE',"CONTROL: Keep allocation site and p, pp shows it (default: false)", :bool],
26
- postmortem: ['RUBY_DEBUG_POSTMORTEM', "CONTROL: Enable postmortem debug (default: false)", :bool],
27
- fork_mode: ['RUBY_DEBUG_FORK_MODE', "CONTROL: Control which process activates a debugger after fork (both/parent/child) (default: both)", :forkmode],
28
- sigdump_sig: ['RUBY_DEBUG_SIGDUMP_SIG', "CONTROL: Sigdump signal (default: disabled)"],
25
+ skip_path: ['RUBY_DEBUG_SKIP_PATH', "CONTROL: Skip showing/entering frames for given paths", :path],
26
+ skip_nosrc: ['RUBY_DEBUG_SKIP_NOSRC', "CONTROL: Skip on no source code lines", :bool, "false"],
27
+ keep_alloc_site:['RUBY_DEBUG_KEEP_ALLOC_SITE',"CONTROL: Keep allocation site and p, pp shows it", :bool, "false"],
28
+ postmortem: ['RUBY_DEBUG_POSTMORTEM', "CONTROL: Enable postmortem debug", :bool, "false"],
29
+ fork_mode: ['RUBY_DEBUG_FORK_MODE', "CONTROL: Control which process activates a debugger after fork (both/parent/child)", :forkmode, "both"],
30
+ sigdump_sig: ['RUBY_DEBUG_SIGDUMP_SIG', "CONTROL: Sigdump signal", :bool, "false"],
29
31
 
30
32
  # boot setting
31
- nonstop: ['RUBY_DEBUG_NONSTOP', "BOOT: Nonstop mode", :bool],
32
- stop_at_load: ['RUBY_DEBUG_STOP_AT_LOAD',"BOOT: Stop at just loading location", :bool],
33
+ nonstop: ['RUBY_DEBUG_NONSTOP', "BOOT: Nonstop mode", :bool, "false"],
34
+ stop_at_load: ['RUBY_DEBUG_STOP_AT_LOAD',"BOOT: Stop at just loading location", :bool, "false"],
33
35
  init_script: ['RUBY_DEBUG_INIT_SCRIPT', "BOOT: debug command script path loaded at first stop"],
34
36
  commands: ['RUBY_DEBUG_COMMANDS', "BOOT: debug commands invoked at first stop. commands should be separated by ';;'"],
35
- no_rc: ['RUBY_DEBUG_NO_RC', "BOOT: ignore loading ~/.rdbgrc(.rb)", :bool],
36
- history_file: ['RUBY_DEBUG_HISTORY_FILE',"BOOT: history file (default: ~/.rdbg_history)"],
37
- save_history: ['RUBY_DEBUG_SAVE_HISTORY',"BOOT: maximum save history lines (default: 10,000)"],
37
+ no_rc: ['RUBY_DEBUG_NO_RC', "BOOT: ignore loading ~/.rdbgrc(.rb)", :bool, "false"],
38
+ history_file: ['RUBY_DEBUG_HISTORY_FILE',"BOOT: history file", :string, "~/.rdbg_history"],
39
+ save_history: ['RUBY_DEBUG_SAVE_HISTORY',"BOOT: maximum save history lines", :int, "10000"],
38
40
 
39
41
  # remote setting
40
42
  port: ['RUBY_DEBUG_PORT', "REMOTE: TCP/IP remote debugging: port"],
41
- host: ['RUBY_DEBUG_HOST', "REMOTE: TCP/IP remote debugging: host (localhost if not given)"],
43
+ host: ['RUBY_DEBUG_HOST', "REMOTE: TCP/IP remote debugging: host", :string, "127.0.0.1"],
42
44
  sock_path: ['RUBY_DEBUG_SOCK_PATH', "REMOTE: UNIX Domain Socket remote debugging: socket path"],
43
45
  sock_dir: ['RUBY_DEBUG_SOCK_DIR', "REMOTE: UNIX Domain Socket remote debugging: socket directory"],
46
+ local_fs_map: ['RUBY_DEBUG_LOCAL_FS_MAP', "REMOTE: Specify local fs map", :path_map],
47
+ skip_bp: ['RUBY_DEBUG_SKIP_BP', "REMOTE: Skip breakpoints if no clients are attached", :bool, 'false'],
44
48
  cookie: ['RUBY_DEBUG_COOKIE', "REMOTE: Cookie for negotiation"],
45
49
  open_frontend: ['RUBY_DEBUG_OPEN_FRONTEND',"REMOTE: frontend used by open command (vscode, chrome, default: rdbg)."],
50
+ chrome_path: ['RUBY_DEBUG_CHROME_PATH', "REMOTE: Platform dependent path of Chrome (For more information, See [here](https://github.com/ruby/debug/pull/334/files#diff-5fc3d0a901379a95bc111b86cf0090b03f857edfd0b99a0c1537e26735698453R55-R64))"],
46
51
 
47
52
  # obsolete
48
- parent_on_fork: ['RUBY_DEBUG_PARENT_ON_FORK', "OBSOLETE: Keep debugging parent process on fork (default: false)", :bool],
53
+ parent_on_fork: ['RUBY_DEBUG_PARENT_ON_FORK', "OBSOLETE: Keep debugging parent process on fork", :bool, "false"],
49
54
  }.freeze
50
55
 
51
- CONFIG_MAP = CONFIG_SET.map{|k, (ev, desc)| [k, ev]}.to_h.freeze
56
+ CONFIG_MAP = CONFIG_SET.map{|k, (ev, _)| [k, ev]}.to_h.freeze
52
57
 
53
58
  class Config
59
+ @config = nil
60
+
54
61
  def self.config
55
62
  @config
56
63
  end
57
64
 
58
65
  def initialize argv
59
- if self.class.instance_variable_defined? :@config
66
+ @skip_all = false
67
+
68
+ if self.class.config
60
69
  raise 'Can not make multiple configurations in one process'
61
70
  end
62
71
 
63
- update self.class.parse_argv(argv)
72
+ config = self.class.parse_argv(argv)
73
+
74
+ # apply defaults
75
+ CONFIG_SET.each do |k, config_detail|
76
+ unless config.key?(k)
77
+ default_value = config_detail[3]
78
+ config[k] = parse_config_value(k, default_value)
79
+ end
80
+ end
81
+
82
+ update config
64
83
  end
65
84
 
66
85
  def inspect
@@ -75,6 +94,14 @@ module DEBUGGER__
75
94
  set_config(key => val)
76
95
  end
77
96
 
97
+ def skip_all
98
+ @skip_all = true
99
+ end
100
+
101
+ def skip?
102
+ @skip_all
103
+ end
104
+
78
105
  def set_config(**kw)
79
106
  conf = config.dup
80
107
  kw.each{|k, v|
@@ -111,11 +138,13 @@ module DEBUGGER__
111
138
  self.class.instance_variable_set(:@config, conf.freeze)
112
139
 
113
140
  # Post process
114
- if_updated old_conf, conf, :keep_alloc_site do |_, new|
141
+ if_updated old_conf, conf, :keep_alloc_site do |old, new|
115
142
  if new
116
143
  require 'objspace'
117
144
  ObjectSpace.trace_object_allocations_start
118
- else
145
+ end
146
+
147
+ if old && !new
119
148
  ObjectSpace.trace_object_allocations_stop
120
149
  end
121
150
  end
@@ -212,6 +241,8 @@ module DEBUGGER__
212
241
  e
213
242
  end
214
243
  }
244
+ when :path_map
245
+ valstr.split(',').map{|e| e.split(':')}
215
246
  else
216
247
  valstr
217
248
  end
@@ -220,6 +251,7 @@ module DEBUGGER__
220
251
  def self.parse_argv argv
221
252
  config = {
222
253
  mode: :start,
254
+ no_color: (nc = ENV['NO_COLOR']) && !nc.empty?,
223
255
  }
224
256
  CONFIG_MAP.each{|key, evname|
225
257
  if val = ENV[evname]
@@ -358,6 +390,8 @@ module DEBUGGER__
358
390
  case CONFIG_SET[key][2]
359
391
  when :path
360
392
  valstr = config[key].map{|e| e.kind_of?(Regexp) ? e.inspect : e}.join(':')
393
+ when :path_map
394
+ valstr = config[key].map{|e| e.join(':')}.join(',')
361
395
  else
362
396
  valstr = config[key].to_s
363
397
  end
@@ -425,7 +459,7 @@ module DEBUGGER__
425
459
  end
426
460
 
427
461
  def self.create_unix_domain_socket_name_prefix(base_dir = unix_domain_socket_dir)
428
- user = ENV['USER'] || 'ruby-debug'
462
+ user = ENV['USER'] || 'UnknownUser'
429
463
  File.join(base_dir, "ruby-debug-#{user}")
430
464
  end
431
465
 
@@ -480,7 +514,7 @@ module DEBUGGER__
480
514
  self.helps.each{|cat, cmds|
481
515
  r << "### #{cat}"
482
516
  r << ''
483
- cmds.each{|ws, desc|
517
+ cmds.each{|_, desc|
484
518
  r << desc
485
519
  }
486
520
  r << ''
data/lib/debug/console.rb CHANGED
@@ -30,10 +30,38 @@ module DEBUGGER__
30
30
  prepend m
31
31
  end if SIGWINCH_SUPPORTED
32
32
 
33
+ def parse_input buff, commands
34
+ c, rest = get_command buff
35
+ case
36
+ when commands.keys.include?(c)
37
+ :command
38
+ when !rest && /\A\s*[a-z]*\z/ =~ c
39
+ nil
40
+ else
41
+ :ruby
42
+ end
43
+ end
44
+
33
45
  def readline_setup prompt
34
46
  load_history_if_not_loaded
35
47
  commands = DEBUGGER__.commands
36
48
 
49
+ prev_completion_proc = Reline.completion_proc
50
+ prev_output_modifier_proc = Reline.output_modifier_proc
51
+ prev_prompt_proc = Reline.prompt_proc
52
+
53
+ # prompt state
54
+ state = nil # :command, :ruby, nil (unknown)
55
+
56
+ Reline.prompt_proc = -> args, *kw do
57
+ case state = parse_input(args.first, commands)
58
+ when nil, :command
59
+ [prompt, prompt]
60
+ when :ruby
61
+ [prompt.sub('rdbg'){colorize('ruby', [:RED])}] * 2
62
+ end
63
+ end
64
+
37
65
  Reline.completion_proc = -> given do
38
66
  buff = Reline.line_buffer
39
67
  Reline.completion_append_character= ' '
@@ -46,17 +74,16 @@ module DEBUGGER__
46
74
  end
47
75
  files
48
76
  else
49
- commands.keys.grep(/\A#{given}/)
77
+ commands.keys.grep(/\A#{Regexp.escape(given)}/)
50
78
  end
51
79
  end
52
80
 
53
81
  Reline.output_modifier_proc = -> buff, **kw do
54
82
  c, rest = get_command buff
55
83
 
56
- case
57
- when commands.keys.include?(c = c.strip)
58
- # [:DIM, :CYAN, :BLUE, :CLEAR, :UNDERLINE, :REVERSE, :RED, :GREEN, :MAGENTA, :BOLD, :YELLOW]
59
- cmd = colorize(c.strip, [:CYAN, :UNDERLINE])
84
+ case state
85
+ when :command
86
+ cmd = colorize(c, [:CYAN, :UNDERLINE])
60
87
 
61
88
  if commands[c] == c
62
89
  rprompt = colorize(" # command", [:DIM])
@@ -64,28 +91,36 @@ module DEBUGGER__
64
91
  rprompt = colorize(" # #{commands[c]} command", [:DIM])
65
92
  end
66
93
 
67
- rest = (rest ? colorize_code(rest) : '') + rprompt
68
- cmd + rest
69
- when !rest && /\A\s*[a-z]*\z/ =~ c
94
+ rest = rest ? colorize_code(rest) : ''
95
+ cmd + rest + rprompt
96
+ when nil
70
97
  buff
71
- else
72
- colorize_code(buff.chomp) + colorize(" # ruby", [:DIM])
98
+ when :ruby
99
+ colorize_code(buff.chomp)
73
100
  end
74
- end
101
+ end unless CONFIG[:no_hint]
102
+
103
+ yield
104
+
105
+ ensure
106
+ Reline.completion_proc = prev_completion_proc
107
+ Reline.output_modifier_proc = prev_output_modifier_proc
108
+ Reline.prompt_proc = prev_prompt_proc
75
109
  end
76
110
 
77
111
  private def get_command line
78
112
  case line.chomp
79
113
  when /\A(\s*[a-z]+)(\s.*)?\z$/
80
- return $1, $2
114
+ return $1.strip, $2
81
115
  else
82
- line.chomp
116
+ line.strip
83
117
  end
84
118
  end
85
119
 
86
120
  def readline prompt
87
- readline_setup prompt
88
- Reline.readmultiline(prompt, true){ true }
121
+ readline_setup prompt do
122
+ Reline.readmultiline(prompt, true){ true }
123
+ end
89
124
  end
90
125
 
91
126
  def history
@@ -139,13 +174,19 @@ module DEBUGGER__
139
174
  end
140
175
 
141
176
  def history_file
142
- CONFIG[:history_file] || File.expand_path("~/.rdbg_history")
177
+ history_file = CONFIG[:history_file]
178
+
179
+ if !history_file.empty?
180
+ File.expand_path(history_file)
181
+ else
182
+ history_file
183
+ end
143
184
  end
144
185
 
145
186
  FH = "# Today's OMIKUJI: "
146
187
 
147
188
  def read_history_file
148
- if history && File.exists?(path = history_file)
189
+ if history && File.exist?(path = history_file)
149
190
  f = (['', 'DAI-', 'CHU-', 'SHO-'].map{|e| e+'KICHI'}+['KYO']).sample
150
191
  ["#{FH}#{f}".dup] + File.readlines(path)
151
192
  else
@@ -167,7 +208,7 @@ module DEBUGGER__
167
208
  if history && @init_history_lines
168
209
  added_records = history.to_a[@init_history_lines .. -1]
169
210
  path = history_file
170
- max = CONFIG[:save_history] || 10_000
211
+ max = CONFIG[:save_history]
171
212
 
172
213
  if !added_records.empty? && !path.empty?
173
214
  orig_records = read_history_file
@@ -2,10 +2,11 @@
2
2
 
3
3
  module DEBUGGER__
4
4
  FrameInfo = Struct.new(:location, :self, :binding, :iseq, :class, :frame_depth,
5
- :has_return_value, :return_value,
5
+ :has_return_value, :return_value,
6
6
  :has_raised_exception, :raised_exception,
7
7
  :show_line,
8
- :_local_variables, :_callee # for recorder
8
+ :_local_variables, :_callee, # for recorder
9
+ :dupped_binding,
9
10
  )
10
11
 
11
12
  # extend FrameInfo with debug.so
@@ -26,12 +27,12 @@ module DEBUGGER__
26
27
  location.absolute_path
27
28
  end
28
29
 
29
- def pretty_path
30
- return '#<none>' unless path = self.path
30
+ def self.pretty_path path
31
+ return '#<none>' unless path
31
32
  use_short_path = CONFIG[:use_short_path]
32
33
 
33
34
  case
34
- when use_short_path && path.start_with?(dir = CONFIG["rubylibdir"] + '/')
35
+ when use_short_path && path.start_with?(dir = RbConfig::CONFIG["rubylibdir"] + '/')
35
36
  path.sub(dir, '$(rubylibdir)/')
36
37
  when use_short_path && Gem.path.any? do |gp|
37
38
  path.start_with?(dir = gp + '/gems/')
@@ -44,15 +45,18 @@ module DEBUGGER__
44
45
  end
45
46
  end
46
47
 
48
+ def pretty_path
49
+ FrameInfo.pretty_path path
50
+ end
51
+
47
52
  def name
48
53
  # p frame_type: frame_type, self: self
49
54
  case frame_type
50
55
  when :block
51
- level, block_loc, _args = block_identifier
56
+ level, block_loc = block_identifier
52
57
  "block in #{block_loc}#{level}"
53
58
  when :method
54
- ci, _args = method_identifier
55
- "#{ci}"
59
+ method_identifier
56
60
  when :c
57
61
  c_identifier
58
62
  when :other
@@ -82,16 +86,13 @@ module DEBUGGER__
82
86
 
83
87
  def block_identifier
84
88
  return unless frame_type == :block
85
- args = parameters_info(iseq.argc)
86
89
  _, level, block_loc = location.label.match(BLOCK_LABL_REGEXP).to_a
87
- [level || "", block_loc, args]
90
+ [level || "", block_loc]
88
91
  end
89
92
 
90
93
  def method_identifier
91
94
  return unless frame_type == :method
92
- args = parameters_info(iseq.argc)
93
- ci = "#{klass_sig}#{callee}"
94
- [ci, args]
95
+ "#{klass_sig}#{callee}"
95
96
  end
96
97
 
97
98
  def c_identifier
@@ -105,32 +106,34 @@ module DEBUGGER__
105
106
  end
106
107
 
107
108
  def callee
108
- self._callee ||= self.binding&.eval('__callee__')
109
+ self._callee ||= begin
110
+ self.binding&.eval('__callee__')
111
+ rescue NameError # BasicObject
112
+ nil
113
+ end
109
114
  end
110
115
 
111
116
  def return_str
112
117
  if self.binding && iseq && has_return_value
113
- DEBUGGER__.short_inspect(return_value)
118
+ DEBUGGER__.safe_inspect(return_value, short: true)
114
119
  end
115
120
  end
116
121
 
117
- def location_str
118
- "#{pretty_path}:#{location.lineno}"
122
+ def matchable_location
123
+ # realpath can sometimes be nil so we can't use it here
124
+ "#{path}:#{location.lineno}"
119
125
  end
120
126
 
121
- private def make_binding
122
- __newb__ = self.self.instance_eval('binding')
123
- self.local_variables.each{|var, val|
124
- __newb__.local_variable_set(var, val)
125
- }
126
- __newb__
127
+ def location_str
128
+ "#{pretty_path}:#{location.lineno}"
127
129
  end
128
130
 
129
131
  def eval_binding
130
- if b = self.binding
132
+ if b = self.dupped_binding
131
133
  b
132
- elsif self.local_variables
133
- make_binding
134
+ else
135
+ b = self.binding || TOPLEVEL_BINDING
136
+ self.dupped_binding = b.dup
134
137
  end
135
138
  end
136
139
 
@@ -144,9 +147,18 @@ module DEBUGGER__
144
147
  end
145
148
  end
146
149
 
147
- private
150
+ def parameters_info
151
+ vars = iseq.parameters_symbols
152
+ vars.map{|var|
153
+ begin
154
+ { name: var, value: DEBUGGER__.safe_inspect(local_variable_get(var), short: true) }
155
+ rescue NameError, TypeError
156
+ nil
157
+ end
158
+ }.compact
159
+ end
148
160
 
149
- def get_singleton_class obj
161
+ private def get_singleton_class obj
150
162
  obj.singleton_class # TODO: don't use it
151
163
  rescue TypeError
152
164
  nil
@@ -156,18 +168,7 @@ module DEBUGGER__
156
168
  local_variables[var]
157
169
  end
158
170
 
159
- def parameters_info(argc)
160
- vars = iseq.locals[0...argc]
161
- vars.map{|var|
162
- begin
163
- { name: var, value: DEBUGGER__.short_inspect(local_variable_get(var)) }
164
- rescue NameError, TypeError
165
- nil
166
- end
167
- }.compact
168
- end
169
-
170
- def klass_sig
171
+ private def klass_sig
171
172
  if self.class == get_singleton_class(self.self)
172
173
  "#{self.self}."
173
174
  else
data/lib/debug/local.rb CHANGED
@@ -98,7 +98,7 @@ module DEBUGGER__
98
98
  # only check child process from its parent
99
99
  begin
100
100
  # wait for all child processes to keep terminal
101
- loop{ Process.waitpid }
101
+ Process.waitpid
102
102
  rescue Errno::ESRCH, Errno::ECHILD
103
103
  end
104
104
  end
data/lib/debug/prelude.rb CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  return if defined?(::DEBUGGER__)
4
4
 
5
+ # Put the following line in your login script (e.g. ~/.bash_profile) with modified path:
5
6
  #
6
- # put the following line in .bash_profile
7
- # export RUBYOPT="-r .../debug/prelude $(RUBYOPT)"
7
+ # export RUBYOPT="-r /path/to/debug/prelude $(RUBYOPT)"
8
8
  #
9
9
  module Kernel
10
10
  def debugger(*a, up_level: 0, **kw)