debug 1.0.0.beta4 → 1.0.0.beta5

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -1,7 +1,8 @@
1
1
  require 'objspace'
2
2
  require 'pp'
3
- require 'irb/color'
3
+
4
4
  require_relative 'frame_info'
5
+ require_relative 'color'
5
6
 
6
7
  module DEBUGGER__
7
8
  class ThreadClient
@@ -12,23 +13,46 @@ module DEBUGGER__
12
13
  end
13
14
  end
14
15
 
16
+ include Color
17
+
15
18
  attr_reader :location, :thread, :mode, :id
16
19
 
17
- def colorize str, color
18
- if CONFIG[:use_colorize]
19
- IRB::Color.colorize str, color
20
- else
21
- str
22
- end
20
+ def assemble_arguments(args)
21
+ args.map do |arg|
22
+ "#{colorize_cyan(arg[:name])}=#{arg[:value]}"
23
+ end.join(", ")
23
24
  end
24
25
 
25
26
  def default_frame_formatter frame
26
- call_identifier_str = colorize(frame.call_identifier_str, [:BLUE, :BOLD])
27
- location_str = colorize(frame.location_str, [:YELLOW])
27
+ call_identifier_str =
28
+ case frame.frame_type
29
+ when :block
30
+ level, block_loc, args = frame.block_identifier
31
+
32
+ if !args.empty?
33
+ args_str = " {|#{assemble_arguments(args)}|}"
34
+ end
35
+
36
+ "#{colorize_blue("block")}#{args_str} in #{colorize_blue(block_loc + level)}"
37
+ when :method
38
+ ci, args = frame.method_identifier
39
+
40
+ if !args.empty?
41
+ args_str = "(#{assemble_arguments(args)})"
42
+ end
43
+
44
+ "#{colorize_blue(ci)}#{args_str}"
45
+ when :c
46
+ colorize_blue(frame.c_identifier)
47
+ when :other
48
+ colorize_blue(frame.other_identifier)
49
+ end
50
+
51
+ location_str = colorize(frame.location_str, [:GREEN])
28
52
  result = "#{call_identifier_str} at #{location_str}"
29
53
 
30
54
  if return_str = frame.return_str
31
- return_str = colorize(frame.return_str, [:MAGENTA])
55
+ return_str = colorize(frame.return_str, [:MAGENTA, :BOLD])
32
56
  result += " #=> #{return_str}"
33
57
  end
34
58
 
@@ -38,6 +62,7 @@ module DEBUGGER__
38
62
  def initialize id, q_evt, q_cmd, thr = Thread.current
39
63
  @id = id
40
64
  @thread = thr
65
+ @target_frames = nil
41
66
  @q_evt = q_evt
42
67
  @q_cmd = q_cmd
43
68
  @step_tp = nil
@@ -45,9 +70,14 @@ module DEBUGGER__
45
70
  @src_lines_on_stop = (::DEBUGGER__::CONFIG[:show_src_lines] || 10).to_i
46
71
  @show_frames_on_stop = (::DEBUGGER__::CONFIG[:show_frames] || 2).to_i
47
72
  @frame_formatter = method(:default_frame_formatter)
73
+ @var_map = {} # { thread_local_var_id => obj } for DAP
48
74
  set_mode nil
49
75
  end
50
76
 
77
+ def name
78
+ "##{@id} #{@thread.name || @thread.backtrace.last}"
79
+ end
80
+
51
81
  def close
52
82
  @q_cmd.close
53
83
  end
@@ -71,8 +101,14 @@ module DEBUGGER__
71
101
  @q_cmd << req
72
102
  end
73
103
 
104
+ def generate_info
105
+ return unless current_frame
106
+
107
+ { location: current_frame.location_str, line: current_frame.location.lineno }
108
+ end
109
+
74
110
  def event! ev, *args
75
- @q_evt << [self, @output, ev, *args]
111
+ @q_evt << [self, @output, ev, generate_info, *args]
76
112
  @output = []
77
113
  end
78
114
 
@@ -116,6 +152,11 @@ module DEBUGGER__
116
152
  cf.has_return_value = true
117
153
  cf.return_value = tp.return_value
118
154
  end
155
+
156
+ if CatchBreakpoint === bp
157
+ cf.has_raised_exception = true
158
+ cf.raised_exception = bp.last_exc
159
+ end
119
160
  end
120
161
 
121
162
  if event != :pause
@@ -187,7 +228,6 @@ module DEBUGGER__
187
228
  start_line: nil,
188
229
  end_line: nil,
189
230
  dir: +1)
190
-
191
231
  if @target_frames && frame = @target_frames[frame_index]
192
232
  if file_lines = frame.file_lines
193
233
  frame_line = frame.location.lineno - 1
@@ -229,6 +269,10 @@ module DEBUGGER__
229
269
  puts "# No sourcefile available for #{frame.path}"
230
270
  end
231
271
  end
272
+ rescue Exception => e
273
+ p e
274
+ pp e.backtrace
275
+ exit!
232
276
  end
233
277
 
234
278
  def show_by_editor path = nil
@@ -255,14 +299,18 @@ module DEBUGGER__
255
299
 
256
300
  def show_locals
257
301
  if s = current_frame&.self
258
- puts " %self => #{s}"
302
+ puts " #{colorize_cyan("%self")} => #{colored_inspect(s)}"
259
303
  end
260
304
  if current_frame&.has_return_value
261
- puts " %return => #{current_frame.return_value}"
305
+ puts " #{colorize_cyan("%return")} => #{colored_inspect(current_frame.return_value)}"
306
+ end
307
+ if current_frame&.has_raised_exception
308
+ puts " #{colorize_cyan("%raised")} => #{colored_inspect(current_frame.raised_exception)}"
262
309
  end
263
310
  if b = current_frame&.binding
264
311
  b.local_variables.each{|loc|
265
- puts " #{loc} => #{b.local_variable_get(loc).inspect}"
312
+ value = b.local_variable_get(loc)
313
+ puts " #{colorize_cyan(loc)} => #{colored_inspect(value)}"
266
314
  }
267
315
  end
268
316
  end
@@ -270,7 +318,8 @@ module DEBUGGER__
270
318
  def show_ivars
271
319
  if s = current_frame&.self
272
320
  s.instance_variables.each{|iv|
273
- puts " #{iv} => #{s.instance_variable_get(iv)}"
321
+ value = s.instance_variable_get(iv)
322
+ puts " #{colorize_cyan(iv)} => #{colored_inspect(value)}"
274
323
  }
275
324
  end
276
325
  end
@@ -281,7 +330,7 @@ module DEBUGGER__
281
330
 
282
331
  b = current_frame.binding
283
332
  result = if b
284
- f, l = b.source_location
333
+ f, _l = b.source_location
285
334
  b.eval(src, "(rdbg)/#{f}")
286
335
  else
287
336
  frame_self = current_frame.self
@@ -312,7 +361,7 @@ module DEBUGGER__
312
361
  end
313
362
 
314
363
  def show_frames max = (@target_frames || []).size
315
- if max > 0 && frames = @target_frames
364
+ if max > 0 && @target_frames
316
365
  size = @target_frames.size
317
366
  max += 1 if size == max + 1
318
367
  max.times{|i|
@@ -369,6 +418,8 @@ module DEBUGGER__
369
418
  def wait_next_action
370
419
  set_mode :wait_next_action
371
420
 
421
+ SESSION.check_forked
422
+
372
423
  while cmds = @q_cmd.pop
373
424
  # pp [self, cmds: cmds]
374
425
 
@@ -397,9 +448,13 @@ module DEBUGGER__
397
448
  loc = caller_locations(2, 1).first
398
449
  loc_path = loc.absolute_path || "!eval:#{loc.path}"
399
450
 
451
+ # same stack depth
452
+ (DEBUGGER__.frame_depth - 3 <= depth) ||
453
+
454
+ # different frame
400
455
  (next_line && loc_path == path &&
401
- (loc_lineno = loc.lineno) > line && loc_lineno <= next_line) ||
402
- (DEBUGGER__.frame_depth - 3 < depth)
456
+ (loc_lineno = loc.lineno) > line &&
457
+ loc_lineno <= next_line)
403
458
  }
404
459
  when :finish
405
460
  depth = @target_frames.first.frame_depth
@@ -426,7 +481,7 @@ module DEBUGGER__
426
481
  puts "=> " + result.inspect
427
482
  when :pp
428
483
  puts "=> "
429
- PP.pp(result, out = ''.dup)
484
+ PP.pp(result, out = ''.dup, SESSION.width)
430
485
  puts out
431
486
  when :call
432
487
  result = frame_eval(eval_src)
@@ -444,8 +499,17 @@ module DEBUGGER__
444
499
  result = failed_results
445
500
  when :watch
446
501
  if @success_last_eval
447
- puts "#{eval_src} = #{result}"
448
- result = WatchExprBreakpoint.new(eval_src, result)
502
+ if eval_src.match?(/@\w+/)
503
+ object =
504
+ if b = current_frame.binding
505
+ b.receiver
506
+ else
507
+ current_frame.self
508
+ end
509
+ puts "#{object} #{eval_src} = #{result}"
510
+ result = WatchIVarBreakpoint.new(eval_src, object, result)
511
+ end
512
+
449
513
  result_type = :watch
450
514
  else
451
515
  result = nil
@@ -515,6 +579,10 @@ module DEBUGGER__
515
579
 
516
580
  when :breakpoint
517
581
  add_breakpoint args
582
+
583
+ when :dap
584
+ process_dap args
585
+
518
586
  else
519
587
  raise [cmd, *args].inspect
520
588
  end
data/lib/debug/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module DEBUGGER__
2
- VERSION = "1.0.0.beta4"
2
+ VERSION = "1.0.0.beta5"
3
3
  end
data/misc/README.md.erb CHANGED
@@ -1,3 +1,5 @@
1
+ [![Ruby](https://github.com/ruby/debug/actions/workflows/ruby.yml/badge.svg?branch=master)](https://github.com/ruby/debug/actions/workflows/ruby.yml?query=branch%3Amaster)
2
+
1
3
  # debug.rb
2
4
 
3
5
  This library provides debugging functionality to Ruby.
@@ -49,28 +51,33 @@ To use debugging feature, you can have 3 ways.
49
51
 
50
52
  ### Local debug console
51
53
 
54
+ #### (1) Use `rdbg` command
55
+
52
56
  ```
53
- # (1) Use `rdbg` command
54
57
  $ rdbg target.rb
55
58
  $ rdbg -- -r foo -e expr # -- is required to make clear rdbg options and ruby's options
59
+ ```
56
60
 
57
- # (2) Use `-r debug/run` command line option
61
+ #### (2) Use `-r debug/run` command line option
58
62
 
63
+ ```
59
64
  $ ruby -r debug/run target.rb
65
+ ```
60
66
 
61
- # (3) Write `require 'debug...' in .rb files
67
+ #### (3) Write `require 'debug...'` in .rb files
62
68
 
63
- $ cat target.rb
69
+ ```ruby
70
+ # target.rb
64
71
  require 'debug/run' # start the debug console
65
- ... rest of program ...
66
72
 
67
73
  # or
68
74
 
69
- $ cat target.rb
70
75
  require 'debug/session' # introduce the functionality
71
76
  DEBUGGER__.console # and start the debug console
72
- ... rest of program ...
77
+ # ... rest of program ...
78
+ ```
73
79
 
80
+ ```
74
81
  $ ruby target.rb
75
82
  ```
76
83
 
@@ -144,33 +151,36 @@ $ rdbg ~/src/rb/target.rb
144
151
 
145
152
  ### Remote debug (1) UNIX domain socket
146
153
 
154
+ #### (1) Use `rdbg` command
155
+
147
156
  ```
148
- # (1) Use `rdbg` command
149
157
  $ rdbg --open target.rb # or rdbg -O target.rb for shorthand
150
158
  Debugger can attach via UNIX domain socket (/home/ko1/.ruby-debug-sock/ruby-debug-ko1-5042)
151
- ...
159
+ ```
152
160
 
153
- # (2) Use `-r debug/open` command line option
161
+ #### (2) Use `-r debug/open` command line option
154
162
 
163
+ ```
155
164
  $ ruby -r debug/open target.rb
156
165
  Debugger can attach via UNIX domain socket (/home/ko1/.ruby-debug-sock/ruby-debug-ko1-5042)
157
- ...
166
+ ```
167
+
168
+ #### (3) Write `require 'debug/open'` in .rb files
158
169
 
159
- # (3) Write `require 'debug/open' in .rb files
160
- $ cat target.rb
170
+ ```ruby
171
+ # target.rb
161
172
  require 'debug/open' # open the debugger entry point by UNIX domain socket.
162
- ...
163
173
 
164
174
  # or
165
175
 
166
- $ cat target.rb
167
176
  require 'debug/server' # introduce remote debugging feature
168
177
  DEBUGGER__.open # open the debugger entry point by UNIX domain socket.
169
178
  # or DEBUGGER__.open_unix to specify UNIX domain socket.
179
+ ```
170
180
 
181
+ ```
171
182
  $ ruby target.rb
172
183
  Debugger can attach via UNIX domain socket (/home/ko1/.ruby-debug-sock/ruby-debug-ko1-5042)
173
- ...
174
184
  ```
175
185
 
176
186
  It runs target.rb and accept debugger connection within UNIX domain socket.
@@ -234,40 +244,49 @@ The socket file is located at
234
244
 
235
245
  You can open the TCP/IP port instead of using UNIX domain socket.
236
246
 
247
+ #### (1) Use `rdbg` command
248
+
237
249
  ```
238
- # (1) Use `rdbg` command
239
250
  $ rdbg -O --port=12345 target.rb
240
251
  # or
241
252
  $ rdbg --open --port=12345 target.rb
242
253
  Debugger can attach via TCP/IP (localhost:12345)
243
- ...
254
+ ```
255
+
256
+ #### (2) Use `-r debug/open` command line option
244
257
 
245
- # (2) Use `-r debug/open` command line option
246
258
 
259
+ ```
247
260
  $ RUBY_DEBUG_PORT=12345 ruby -r debug/open target.rb
248
261
  Debugger can attach via TCP/IP (localhost:12345)
249
- ...
262
+ ```
250
263
 
251
- # (3) Write `require 'debug/open' in .rb files
252
- $ cat target.rb
264
+ #### (3) Write `require 'debug/open'` in .rb files
265
+
266
+ ```ruby
267
+ # target.rb
253
268
  require 'debug/open' # open the debugger entry point.
254
- ...
269
+ ```
270
+
271
+ and run with environment variable RUBY_DEBUG_PORT
255
272
 
256
- # and run with environment variable RUBY_DEBUG_PORT
273
+ ```
257
274
  $ RUBY_DEBUG_PORT=12345 ruby target.rb
258
275
  Debugger can attach via TCP/IP (localhost:12345)
259
- ...
276
+ ```
260
277
 
261
- # or
278
+ or
262
279
 
263
- $ cat target.rb
280
+ ```ruby
281
+ # target.rb
264
282
  require 'debug/server' # introduce remote debugging feature
265
283
  DEBUGGER__.open(port: 12345)
266
284
  # or DEBUGGER__.open_tcp(port: 12345)
285
+ ```
267
286
 
287
+ ```
268
288
  $ ruby target.rb
269
289
  Debugger can attach via TCP/IP (localhost:12345)
270
- ...
271
290
  ```
272
291
 
273
292
  You can also specify the host with the `RUBY_DEBUG_HOST` environment variable. And also `DEBUGGER__.open` method accepts a `host:` keyword parameter. If the host is not given, `localhost` will be used.
@@ -325,3 +344,7 @@ The `<...>` notation means the argument.
325
344
  Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/debug.
326
345
 
327
346
  Please also check the [contributing guideline](/CONTRIBUTING.md).
347
+
348
+ # Acknowledgement
349
+
350
+ * Some tests are based on [deivid-rodriguez/byebug: Debugging in Ruby 2](https://github.com/deivid-rodriguez/byebug)
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: debug
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta4
4
+ version: 1.0.0.beta5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koichi Sasada
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-25 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-06-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: irb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description: Debugging functionality for Ruby. This is completely rewritten debug.rb
14
28
  which was contained by the encient Ruby versions.
15
29
  email:
@@ -20,6 +34,7 @@ extensions:
20
34
  - ext/debug/extconf.rb
21
35
  extra_rdoc_files: []
22
36
  files:
37
+ - ".github/workflows/ruby.yml"
23
38
  - ".gitignore"
24
39
  - CONTRIBUTING.md
25
40
  - Gemfile
@@ -38,14 +53,17 @@ files:
38
53
  - lib/debug/bp.vim
39
54
  - lib/debug/breakpoint.rb
40
55
  - lib/debug/client.rb
56
+ - lib/debug/color.rb
41
57
  - lib/debug/config.rb
42
58
  - lib/debug/console.rb
43
59
  - lib/debug/frame_info.rb
44
60
  - lib/debug/open.rb
45
61
  - lib/debug/run.rb
46
62
  - lib/debug/server.rb
63
+ - lib/debug/server_dap.rb
47
64
  - lib/debug/session.rb
48
65
  - lib/debug/source_repository.rb
66
+ - lib/debug/test_console.rb
49
67
  - lib/debug/thread_client.rb
50
68
  - lib/debug/version.rb
51
69
  - misc/README.md.erb