debug 1.4.0 → 1.9.2
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.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +210 -6
- data/Gemfile +2 -0
- data/LICENSE.txt +0 -0
- data/README.md +161 -85
- data/Rakefile +33 -10
- data/TODO.md +8 -8
- data/debug.gemspec +9 -7
- data/exe/rdbg +23 -4
- data/ext/debug/debug.c +111 -21
- data/ext/debug/extconf.rb +23 -0
- data/ext/debug/iseq_collector.c +2 -0
- data/lib/debug/abbrev_command.rb +77 -0
- data/lib/debug/breakpoint.rb +102 -74
- data/lib/debug/client.rb +46 -12
- data/lib/debug/color.rb +0 -0
- data/lib/debug/config.rb +129 -36
- data/lib/debug/console.rb +46 -40
- data/lib/debug/dap_custom/traceInspector.rb +336 -0
- data/lib/debug/frame_info.rb +40 -25
- data/lib/debug/irb_integration.rb +37 -0
- data/lib/debug/local.rb +17 -11
- data/lib/debug/open.rb +0 -0
- data/lib/debug/open_nonstop.rb +0 -0
- data/lib/debug/prelude.rb +3 -2
- data/lib/debug/server.rb +126 -56
- data/lib/debug/server_cdp.rb +673 -248
- data/lib/debug/server_dap.rb +497 -261
- data/lib/debug/session.rb +899 -441
- data/lib/debug/source_repository.rb +122 -49
- data/lib/debug/start.rb +1 -1
- data/lib/debug/thread_client.rb +460 -155
- data/lib/debug/tracer.rb +10 -16
- data/lib/debug/version.rb +1 -1
- data/lib/debug.rb +7 -2
- data/misc/README.md.erb +106 -56
- metadata +14 -24
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -24
- data/.github/ISSUE_TEMPLATE/custom.md +0 -10
- data/.github/ISSUE_TEMPLATE/feature_request.md +0 -14
- data/.github/pull_request_template.md +0 -9
- data/.github/workflows/ruby.yml +0 -34
- data/.gitignore +0 -12
- data/bin/console +0 -14
- data/bin/gentest +0 -30
- data/bin/setup +0 -8
- data/lib/debug/bp.vim +0 -68
data/lib/debug/config.rb
CHANGED
@@ -7,46 +7,54 @@ 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
|
15
|
-
show_src_lines: ['RUBY_DEBUG_SHOW_SRC_LINES', "UI: Show n lines source code on breakpoint
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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_evaledsrc: ['RUBY_DEBUG_SHOW_EVALEDSRC', "UI: Show actually evaluated source", :bool, "false"],
|
18
|
+
show_frames: ['RUBY_DEBUG_SHOW_FRAMES', "UI: Show n frames on breakpoint", :int, "2"],
|
19
|
+
use_short_path: ['RUBY_DEBUG_USE_SHORT_PATH', "UI: Show shorten PATH (like $(Gem)/foo.rb)", :bool, "false"],
|
20
|
+
no_color: ['RUBY_DEBUG_NO_COLOR', "UI: Do not use colorize", :bool, "false"],
|
21
|
+
no_sigint_hook: ['RUBY_DEBUG_NO_SIGINT_HOOK', "UI: Do not suspend on SIGINT", :bool, "false"],
|
22
|
+
no_reline: ['RUBY_DEBUG_NO_RELINE', "UI: Do not use Reline library", :bool, "false"],
|
23
|
+
no_hint: ['RUBY_DEBUG_NO_HINT', "UI: Do not show the hint on the REPL", :bool, "false"],
|
24
|
+
no_lineno: ['RUBY_DEBUG_NO_LINENO', "UI: Do not show line numbers", :bool, "false"],
|
25
|
+
irb_console: ["RUBY_DEBUG_IRB_CONSOLE", "UI: Use IRB as the console", :bool, "false"],
|
21
26
|
|
22
27
|
# control setting
|
23
|
-
skip_path: ['RUBY_DEBUG_SKIP_PATH', "CONTROL: Skip showing/entering frames for given paths
|
24
|
-
skip_nosrc: ['RUBY_DEBUG_SKIP_NOSRC', "CONTROL: Skip on no source code lines
|
25
|
-
keep_alloc_site:['RUBY_DEBUG_KEEP_ALLOC_SITE',"CONTROL: Keep allocation site and p, pp shows it
|
26
|
-
postmortem: ['RUBY_DEBUG_POSTMORTEM', "CONTROL: Enable postmortem debug
|
27
|
-
fork_mode: ['RUBY_DEBUG_FORK_MODE', "CONTROL: Control which process activates a debugger after fork (both/parent/child)
|
28
|
-
sigdump_sig: ['RUBY_DEBUG_SIGDUMP_SIG', "CONTROL: Sigdump signal
|
28
|
+
skip_path: ['RUBY_DEBUG_SKIP_PATH', "CONTROL: Skip showing/entering frames for given paths", :path],
|
29
|
+
skip_nosrc: ['RUBY_DEBUG_SKIP_NOSRC', "CONTROL: Skip on no source code lines", :bool, "false"],
|
30
|
+
keep_alloc_site:['RUBY_DEBUG_KEEP_ALLOC_SITE',"CONTROL: Keep allocation site and p, pp shows it", :bool, "false"],
|
31
|
+
postmortem: ['RUBY_DEBUG_POSTMORTEM', "CONTROL: Enable postmortem debug", :bool, "false"],
|
32
|
+
fork_mode: ['RUBY_DEBUG_FORK_MODE', "CONTROL: Control which process activates a debugger after fork (both/parent/child)", :forkmode, "both"],
|
33
|
+
sigdump_sig: ['RUBY_DEBUG_SIGDUMP_SIG', "CONTROL: Sigdump signal", :bool, "false"],
|
29
34
|
|
30
35
|
# 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],
|
36
|
+
nonstop: ['RUBY_DEBUG_NONSTOP', "BOOT: Nonstop mode", :bool, "false"],
|
37
|
+
stop_at_load: ['RUBY_DEBUG_STOP_AT_LOAD',"BOOT: Stop at just loading location", :bool, "false"],
|
33
38
|
init_script: ['RUBY_DEBUG_INIT_SCRIPT', "BOOT: debug command script path loaded at first stop"],
|
34
|
-
commands: ['RUBY_DEBUG_COMMANDS', "BOOT: debug commands invoked at first stop.
|
35
|
-
no_rc: ['RUBY_DEBUG_NO_RC', "BOOT: ignore loading ~/.rdbgrc(.rb)", :bool],
|
36
|
-
history_file: ['RUBY_DEBUG_HISTORY_FILE',"BOOT: history file
|
37
|
-
save_history: ['RUBY_DEBUG_SAVE_HISTORY',"BOOT: maximum save history lines
|
39
|
+
commands: ['RUBY_DEBUG_COMMANDS', "BOOT: debug commands invoked at first stop. Commands should be separated by `;;`"],
|
40
|
+
no_rc: ['RUBY_DEBUG_NO_RC', "BOOT: ignore loading ~/.rdbgrc(.rb)", :bool, "false"],
|
41
|
+
history_file: ['RUBY_DEBUG_HISTORY_FILE',"BOOT: history file", :string, "~/.rdbg_history"],
|
42
|
+
save_history: ['RUBY_DEBUG_SAVE_HISTORY',"BOOT: maximum save history lines", :int, "10000"],
|
38
43
|
|
39
44
|
# remote setting
|
45
|
+
open: ['RUBY_DEBUG_OPEN', "REMOTE: Open remote port (same as `rdbg --open` option)"],
|
40
46
|
port: ['RUBY_DEBUG_PORT', "REMOTE: TCP/IP remote debugging: port"],
|
41
|
-
host: ['RUBY_DEBUG_HOST', "REMOTE: TCP/IP remote debugging: host
|
47
|
+
host: ['RUBY_DEBUG_HOST', "REMOTE: TCP/IP remote debugging: host", :string, "127.0.0.1"],
|
42
48
|
sock_path: ['RUBY_DEBUG_SOCK_PATH', "REMOTE: UNIX Domain Socket remote debugging: socket path"],
|
43
49
|
sock_dir: ['RUBY_DEBUG_SOCK_DIR', "REMOTE: UNIX Domain Socket remote debugging: socket directory"],
|
50
|
+
local_fs_map: ['RUBY_DEBUG_LOCAL_FS_MAP', "REMOTE: Specify local fs map", :path_map],
|
51
|
+
skip_bp: ['RUBY_DEBUG_SKIP_BP', "REMOTE: Skip breakpoints if no clients are attached", :bool, 'false'],
|
44
52
|
cookie: ['RUBY_DEBUG_COOKIE', "REMOTE: Cookie for negotiation"],
|
45
|
-
|
53
|
+
session_name: ['RUBY_DEBUG_SESSION_NAME', "REMOTE: Session name for differentiating multiple sessions"],
|
46
54
|
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))"],
|
47
55
|
|
48
56
|
# obsolete
|
49
|
-
parent_on_fork: ['RUBY_DEBUG_PARENT_ON_FORK', "OBSOLETE: Keep debugging parent process on fork
|
57
|
+
parent_on_fork: ['RUBY_DEBUG_PARENT_ON_FORK', "OBSOLETE: Keep debugging parent process on fork", :bool, "false"],
|
50
58
|
}.freeze
|
51
59
|
|
52
60
|
CONFIG_MAP = CONFIG_SET.map{|k, (ev, _)| [k, ev]}.to_h.freeze
|
@@ -63,7 +71,17 @@ module DEBUGGER__
|
|
63
71
|
raise 'Can not make multiple configurations in one process'
|
64
72
|
end
|
65
73
|
|
66
|
-
|
74
|
+
config = self.class.parse_argv(argv)
|
75
|
+
|
76
|
+
# apply defaults
|
77
|
+
CONFIG_SET.each do |k, config_detail|
|
78
|
+
unless config.key?(k)
|
79
|
+
default_value = config_detail[3]
|
80
|
+
config[k] = parse_config_value(k, default_value)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
update config
|
67
85
|
end
|
68
86
|
|
69
87
|
def inspect
|
@@ -114,11 +132,13 @@ module DEBUGGER__
|
|
114
132
|
self.class.instance_variable_set(:@config, conf.freeze)
|
115
133
|
|
116
134
|
# Post process
|
117
|
-
if_updated old_conf, conf, :keep_alloc_site do |
|
135
|
+
if_updated old_conf, conf, :keep_alloc_site do |old, new|
|
118
136
|
if new
|
119
137
|
require 'objspace'
|
120
138
|
ObjectSpace.trace_object_allocations_start
|
121
|
-
|
139
|
+
end
|
140
|
+
|
141
|
+
if old && !new
|
122
142
|
ObjectSpace.trace_object_allocations_stop
|
123
143
|
end
|
124
144
|
end
|
@@ -132,6 +152,28 @@ module DEBUGGER__
|
|
132
152
|
if_updated old_conf, conf, :sigdump_sig do |old_sig, new_sig|
|
133
153
|
setup_sigdump old_sig, new_sig
|
134
154
|
end
|
155
|
+
|
156
|
+
if_updated old_conf, conf, :no_sigint_hook do |old, new|
|
157
|
+
if defined?(SESSION)
|
158
|
+
SESSION.set_no_sigint_hook old, new
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
if_updated old_conf, conf, :irb_console do |old, new|
|
163
|
+
if defined?(SESSION) && SESSION.active?
|
164
|
+
# irb_console is switched from true to false
|
165
|
+
if old
|
166
|
+
SESSION.deactivate_irb_integration
|
167
|
+
# irb_console is switched from false to true
|
168
|
+
else
|
169
|
+
if CONFIG[:open]
|
170
|
+
SESSION.instance_variable_get(:@ui).puts "\nIRB is not supported on the remote console."
|
171
|
+
else
|
172
|
+
SESSION.activate_irb_integration
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
135
177
|
end
|
136
178
|
|
137
179
|
private def if_updated old_conf, new_conf, key
|
@@ -215,6 +257,8 @@ module DEBUGGER__
|
|
215
257
|
e
|
216
258
|
end
|
217
259
|
}
|
260
|
+
when :path_map
|
261
|
+
valstr.split(',').map{|e| e.split(':')}
|
218
262
|
else
|
219
263
|
valstr
|
220
264
|
end
|
@@ -223,6 +267,7 @@ module DEBUGGER__
|
|
223
267
|
def self.parse_argv argv
|
224
268
|
config = {
|
225
269
|
mode: :start,
|
270
|
+
no_color: (nc = ENV['NO_COLOR']) && !nc.empty?,
|
226
271
|
}
|
227
272
|
CONFIG_MAP.each{|key, evname|
|
228
273
|
if val = ENV[evname]
|
@@ -239,6 +284,8 @@ module DEBUGGER__
|
|
239
284
|
require 'optparse'
|
240
285
|
require_relative 'version'
|
241
286
|
|
287
|
+
have_shown_version = false
|
288
|
+
|
242
289
|
opt = OptionParser.new do |o|
|
243
290
|
o.banner = "#{$0} [options] -- [debuggee options]"
|
244
291
|
o.separator ''
|
@@ -279,8 +326,25 @@ module DEBUGGER__
|
|
279
326
|
'If TCP/IP options are not given, a UNIX domain socket will be used.',
|
280
327
|
'If FRONTEND is given, prepare for the FRONTEND.',
|
281
328
|
'Now rdbg, vscode and chrome is supported.') do |f|
|
282
|
-
|
283
|
-
|
329
|
+
|
330
|
+
case f # some format patterns are not documented yet
|
331
|
+
when nil
|
332
|
+
config[:open] = true
|
333
|
+
when /\A\d\z/
|
334
|
+
config[:open] = true
|
335
|
+
config[:port] = f.to_i
|
336
|
+
when /\A(\S+):(\d+)\z/
|
337
|
+
config[:open] = true
|
338
|
+
config[:host] = $1
|
339
|
+
config[:port] = $2.to_i
|
340
|
+
when 'tcp'
|
341
|
+
config[:open] = true
|
342
|
+
config[:port] ||= 0
|
343
|
+
when 'vscode', 'chrome', 'cdp'
|
344
|
+
config[:open] = f&.downcase
|
345
|
+
else
|
346
|
+
raise "Unknown option for --open: #{f}"
|
347
|
+
end
|
284
348
|
end
|
285
349
|
o.on('--sock-path=SOCK_PATH', 'UNIX Domain socket path') do |path|
|
286
350
|
config[:sock_path] = path
|
@@ -294,6 +358,9 @@ module DEBUGGER__
|
|
294
358
|
o.on('--cookie=COOKIE', 'Set a cookie for connection') do |c|
|
295
359
|
config[:cookie] = c
|
296
360
|
end
|
361
|
+
o.on('--session-name=NAME', 'Session name') do |name|
|
362
|
+
config[:session_name] = name
|
363
|
+
end
|
297
364
|
|
298
365
|
rdbg = 'rdbg'
|
299
366
|
|
@@ -329,6 +396,16 @@ module DEBUGGER__
|
|
329
396
|
o.separator ''
|
330
397
|
o.separator 'Other options:'
|
331
398
|
|
399
|
+
o.on('-v', 'Show version number') do
|
400
|
+
puts o.ver
|
401
|
+
have_shown_version = true
|
402
|
+
end
|
403
|
+
|
404
|
+
o.on('--version', 'Show version number and exit') do
|
405
|
+
puts o.ver
|
406
|
+
exit
|
407
|
+
end
|
408
|
+
|
332
409
|
o.on("-h", "--help", "Print help") do
|
333
410
|
puts o
|
334
411
|
exit
|
@@ -352,6 +429,13 @@ module DEBUGGER__
|
|
352
429
|
|
353
430
|
opt.parse!(argv)
|
354
431
|
|
432
|
+
if argv.empty?
|
433
|
+
case
|
434
|
+
when have_shown_version && config[:mode] == :start
|
435
|
+
exit
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
355
439
|
config
|
356
440
|
end
|
357
441
|
|
@@ -361,6 +445,8 @@ module DEBUGGER__
|
|
361
445
|
case CONFIG_SET[key][2]
|
362
446
|
when :path
|
363
447
|
valstr = config[key].map{|e| e.kind_of?(Regexp) ? e.inspect : e}.join(':')
|
448
|
+
when :path_map
|
449
|
+
valstr = config[key].map{|e| e.join(':')}.join(',')
|
364
450
|
else
|
365
451
|
valstr = config[key].to_s
|
366
452
|
end
|
@@ -380,8 +466,9 @@ module DEBUGGER__
|
|
380
466
|
unless (dir_uid = fs.uid) == (uid = Process.uid)
|
381
467
|
raise "#{path} uid is #{dir_uid}, but Process.uid is #{uid}"
|
382
468
|
end
|
383
|
-
|
384
|
-
|
469
|
+
|
470
|
+
if fs.world_writable? && !fs.sticky?
|
471
|
+
raise "#{path} is world writable but not sticky"
|
385
472
|
end
|
386
473
|
|
387
474
|
path
|
@@ -391,7 +478,7 @@ module DEBUGGER__
|
|
391
478
|
require 'tmpdir'
|
392
479
|
|
393
480
|
if tmpdir = Dir.tmpdir
|
394
|
-
path = File.join(tmpdir, "
|
481
|
+
path = File.join(tmpdir, "rdbg-#{Process.uid}")
|
395
482
|
|
396
483
|
unless File.exist?(path)
|
397
484
|
d = Dir.mktmpdir
|
@@ -404,7 +491,7 @@ module DEBUGGER__
|
|
404
491
|
|
405
492
|
def self.unix_domain_socket_homedir
|
406
493
|
if home = ENV['HOME']
|
407
|
-
path = File.join(home, '.
|
494
|
+
path = File.join(home, '.rdbg-sock')
|
408
495
|
|
409
496
|
unless File.exist?(path)
|
410
497
|
Dir.mkdir(path, 0700)
|
@@ -428,12 +515,14 @@ module DEBUGGER__
|
|
428
515
|
end
|
429
516
|
|
430
517
|
def self.create_unix_domain_socket_name_prefix(base_dir = unix_domain_socket_dir)
|
431
|
-
|
432
|
-
File.join(base_dir, "ruby-debug-#{user}")
|
518
|
+
File.join(base_dir, "rdbg")
|
433
519
|
end
|
434
520
|
|
435
521
|
def self.create_unix_domain_socket_name(base_dir = unix_domain_socket_dir)
|
436
|
-
|
522
|
+
suffix = "-#{Process.pid}"
|
523
|
+
name = CONFIG[:session_name]
|
524
|
+
suffix << "-#{name}" if name
|
525
|
+
create_unix_domain_socket_name_prefix(base_dir) + suffix
|
437
526
|
end
|
438
527
|
|
439
528
|
## Help
|
@@ -448,10 +537,14 @@ module DEBUGGER__
|
|
448
537
|
when /\A\s*### (.+)/
|
449
538
|
cat = $1
|
450
539
|
break if $1 == 'END'
|
451
|
-
when /\A
|
540
|
+
when /\A register_command (.+)/
|
452
541
|
next unless cat
|
453
542
|
next unless desc
|
454
|
-
|
543
|
+
|
544
|
+
ws = []
|
545
|
+
$1.gsub(/'([a-z]+)'/){|w|
|
546
|
+
ws << $1
|
547
|
+
}
|
455
548
|
helps[cat] << [ws, desc]
|
456
549
|
desc = nil
|
457
550
|
max_w = ws.max_by{|w| w.length}
|
data/lib/debug/console.rb
CHANGED
@@ -5,30 +5,21 @@ module DEBUGGER__
|
|
5
5
|
raise LoadError if CONFIG[:no_reline]
|
6
6
|
require 'reline'
|
7
7
|
|
8
|
-
# reline 0.2.7 or later is required.
|
9
|
-
raise LoadError if Reline::VERSION < '0.2.7'
|
10
|
-
|
11
8
|
require_relative 'color'
|
12
|
-
include Color
|
13
9
|
|
14
|
-
|
15
|
-
prev = trap(:SIGWINCH, nil)
|
16
|
-
trap(:SIGWINCH, prev)
|
17
|
-
SIGWINCH_SUPPORTED = true
|
18
|
-
rescue ArgumentError
|
19
|
-
SIGWINCH_SUPPORTED = false
|
20
|
-
end
|
10
|
+
include Color
|
21
11
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
12
|
+
def parse_input buff, commands
|
13
|
+
c, rest = get_command buff
|
14
|
+
case
|
15
|
+
when commands.keys.include?(c)
|
16
|
+
:command
|
17
|
+
when !rest && /\A\s*[a-z]*\z/ =~ c
|
18
|
+
nil
|
19
|
+
else
|
20
|
+
:ruby
|
29
21
|
end
|
30
|
-
|
31
|
-
end if SIGWINCH_SUPPORTED
|
22
|
+
end
|
32
23
|
|
33
24
|
def readline_setup prompt
|
34
25
|
load_history_if_not_loaded
|
@@ -38,7 +29,17 @@ module DEBUGGER__
|
|
38
29
|
prev_output_modifier_proc = Reline.output_modifier_proc
|
39
30
|
prev_prompt_proc = Reline.prompt_proc
|
40
31
|
|
41
|
-
|
32
|
+
# prompt state
|
33
|
+
state = nil # :command, :ruby, nil (unknown)
|
34
|
+
|
35
|
+
Reline.prompt_proc = -> args, *kw do
|
36
|
+
case state = parse_input(args.first, commands)
|
37
|
+
when nil, :command
|
38
|
+
[prompt]
|
39
|
+
when :ruby
|
40
|
+
[prompt.sub('rdbg'){colorize('ruby', [:RED])}]
|
41
|
+
end * args.size
|
42
|
+
end
|
42
43
|
|
43
44
|
Reline.completion_proc = -> given do
|
44
45
|
buff = Reline.line_buffer
|
@@ -52,17 +53,16 @@ module DEBUGGER__
|
|
52
53
|
end
|
53
54
|
files
|
54
55
|
else
|
55
|
-
commands.keys.grep(/\A#{given}/)
|
56
|
+
commands.keys.grep(/\A#{Regexp.escape(given)}/)
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
59
60
|
Reline.output_modifier_proc = -> buff, **kw do
|
60
61
|
c, rest = get_command buff
|
61
62
|
|
62
|
-
case
|
63
|
-
when
|
64
|
-
|
65
|
-
cmd = colorize(c.strip, [:CYAN, :UNDERLINE])
|
63
|
+
case state
|
64
|
+
when :command
|
65
|
+
cmd = colorize(c, [:CYAN, :UNDERLINE])
|
66
66
|
|
67
67
|
if commands[c] == c
|
68
68
|
rprompt = colorize(" # command", [:DIM])
|
@@ -70,14 +70,14 @@ module DEBUGGER__
|
|
70
70
|
rprompt = colorize(" # #{commands[c]} command", [:DIM])
|
71
71
|
end
|
72
72
|
|
73
|
-
rest =
|
74
|
-
cmd + rest
|
75
|
-
when
|
73
|
+
rest = rest ? colorize_code(rest) : ''
|
74
|
+
cmd + rest + rprompt
|
75
|
+
when nil
|
76
76
|
buff
|
77
|
-
|
78
|
-
colorize_code(buff
|
77
|
+
when :ruby
|
78
|
+
colorize_code(buff)
|
79
79
|
end
|
80
|
-
end
|
80
|
+
end unless CONFIG[:no_hint]
|
81
81
|
|
82
82
|
yield
|
83
83
|
|
@@ -90,9 +90,9 @@ module DEBUGGER__
|
|
90
90
|
private def get_command line
|
91
91
|
case line.chomp
|
92
92
|
when /\A(\s*[a-z]+)(\s.*)?\z$/
|
93
|
-
return $1, $2
|
93
|
+
return $1.strip, $2
|
94
94
|
else
|
95
|
-
line.
|
95
|
+
line.strip
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
@@ -143,7 +143,7 @@ module DEBUGGER__
|
|
143
143
|
rescue LoadError
|
144
144
|
def readline prompt
|
145
145
|
print prompt
|
146
|
-
gets
|
146
|
+
$stdin.gets
|
147
147
|
end
|
148
148
|
|
149
149
|
def history
|
@@ -153,7 +153,13 @@ module DEBUGGER__
|
|
153
153
|
end
|
154
154
|
|
155
155
|
def history_file
|
156
|
-
CONFIG[:history_file]
|
156
|
+
history_file = CONFIG[:history_file]
|
157
|
+
|
158
|
+
if !history_file.empty?
|
159
|
+
File.expand_path(history_file)
|
160
|
+
else
|
161
|
+
history_file
|
162
|
+
end
|
157
163
|
end
|
158
164
|
|
159
165
|
FH = "# Today's OMIKUJI: "
|
@@ -181,7 +187,7 @@ module DEBUGGER__
|
|
181
187
|
if history && @init_history_lines
|
182
188
|
added_records = history.to_a[@init_history_lines .. -1]
|
183
189
|
path = history_file
|
184
|
-
max = CONFIG[:save_history]
|
190
|
+
max = CONFIG[:save_history]
|
185
191
|
|
186
192
|
if !added_records.empty? && !path.empty?
|
187
193
|
orig_records = read_history_file
|
@@ -197,11 +203,11 @@ module DEBUGGER__
|
|
197
203
|
end
|
198
204
|
|
199
205
|
def load_history
|
200
|
-
read_history_file.
|
206
|
+
read_history_file.each{|line|
|
201
207
|
line.strip!
|
202
208
|
history << line unless line.empty?
|
203
|
-
}
|
209
|
+
} if history.empty?
|
210
|
+
history.count
|
204
211
|
end
|
205
212
|
end # class Console
|
206
213
|
end
|
207
|
-
|