byebug 0.0.1 → 1.0.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 (63) hide show
  1. data/.gitignore +4 -0
  2. data/.travis.yml +0 -5
  3. data/CHANGELOG.md +6 -0
  4. data/Gemfile +1 -1
  5. data/LICENSE +23 -20
  6. data/byebug.gemspec +5 -5
  7. data/ext/byebug/breakpoint.c +102 -134
  8. data/ext/byebug/byebug.c +110 -64
  9. data/ext/byebug/byebug.h +2 -3
  10. data/ext/byebug/context.c +72 -39
  11. data/lib/byebug.rb +34 -38
  12. data/lib/byebug/command.rb +19 -24
  13. data/lib/byebug/commands/breakpoints.rb +11 -12
  14. data/lib/byebug/commands/catchpoint.rb +1 -1
  15. data/lib/byebug/commands/control.rb +2 -4
  16. data/lib/byebug/commands/finish.rb +1 -1
  17. data/lib/byebug/commands/frame.rb +15 -17
  18. data/lib/byebug/commands/info.rb +29 -28
  19. data/lib/byebug/commands/irb.rb +23 -21
  20. data/lib/byebug/commands/method.rb +4 -4
  21. data/lib/byebug/commands/reload.rb +8 -6
  22. data/lib/byebug/commands/set.rb +27 -23
  23. data/lib/byebug/commands/show.rb +6 -4
  24. data/lib/byebug/commands/stepping.rb +2 -2
  25. data/lib/byebug/commands/threads.rb +10 -10
  26. data/lib/byebug/commands/trace.rb +13 -14
  27. data/lib/byebug/commands/variables.rb +14 -12
  28. data/lib/byebug/context.rb +2 -15
  29. data/lib/byebug/interface.rb +5 -0
  30. data/lib/byebug/processor.rb +59 -64
  31. data/lib/byebug/version.rb +2 -1
  32. data/old_doc/Makefile +20 -0
  33. data/{man/rdebug.1 → old_doc/byebug.1} +5 -5
  34. data/old_doc/byebug.html +6178 -0
  35. data/old_doc/byebug.texi +3775 -0
  36. data/{doc → old_doc}/hanoi.rb +0 -0
  37. data/{doc → old_doc}/primes.rb +0 -0
  38. data/{doc → old_doc}/test-tri2.rb +0 -0
  39. data/{doc → old_doc}/tri3.rb +0 -0
  40. data/{doc → old_doc}/triangle.rb +0 -0
  41. data/test/breakpoints_test.rb +96 -60
  42. data/test/conditions_test.rb +15 -12
  43. data/test/examples/info.rb +5 -5
  44. data/test/examples/stepping.rb +1 -1
  45. data/test/frame_test.rb +40 -39
  46. data/test/info_test.rb +105 -96
  47. data/test/irb_test.rb +66 -61
  48. data/test/jump_test.rb +18 -9
  49. data/test/list_test.rb +114 -107
  50. data/test/restart_test.rb +51 -58
  51. data/test/save_test.rb +8 -7
  52. data/test/set_test.rb +8 -11
  53. data/test/show_test.rb +3 -5
  54. data/test/stepping_test.rb +43 -53
  55. data/test/support/context.rb +1 -0
  56. data/test/support/processor.rb +10 -4
  57. data/test/support/test_dsl.rb +46 -18
  58. data/test/support/test_interface.rb +8 -5
  59. data/test/test_helper.rb +2 -2
  60. data/test/trace_test.rb +123 -124
  61. metadata +39 -17
  62. data/AUTHORS +0 -10
  63. data/doc/rdebug-emacs.texi +0 -1030
@@ -16,9 +16,8 @@ typedef struct rb_trace_arg_struct rb_trace_point_t;
16
16
  #define CTX_FL_DEAD (1<<5)
17
17
  #define CTX_FL_WAS_RUNNING (1<<6)
18
18
  #define CTX_FL_ENABLE_BKPT (1<<7)
19
- #define CTX_FL_STEPPED (1<<8)
20
- #define CTX_FL_FORCE_MOVE (1<<9)
21
- #define CTX_FL_CATCHING (1<<10)
19
+ #define CTX_FL_FORCE_MOVE (1<<8)
20
+ #define CTX_FL_CATCHING (1<<9)
22
21
 
23
22
  /* macro functions */
24
23
  #define CTX_FL_TEST(c,f) ((c)->flags & (f))
@@ -162,22 +162,17 @@ context_create(VALUE thread, VALUE cDebugThread) {
162
162
  return Data_Wrap_Struct(cContext, Context_mark, Context_free, context);
163
163
  }
164
164
 
165
- static inline void
166
- check_frame_number_valid(debug_context_t *context, int frame_no)
167
- {
168
- if (frame_no < 0 || frame_no >= context->stack_size) {
169
- rb_raise(rb_eArgError, "Invalid frame number %d, stack (0...%d)",
170
- frame_no, context->stack_size);
171
- }
172
- }
173
-
174
165
  static debug_frame_t*
175
166
  get_frame_no(debug_context_t *context, int frame_n)
176
167
  {
177
168
  debug_frame_t *frame;
178
169
  int i;
179
170
 
180
- check_frame_number_valid(context, frame_n);
171
+ if (frame_n < 0 || frame_n >= context->stack_size) {
172
+ rb_raise(rb_eArgError, "Invalid frame number %d, stack (0...%d)",
173
+ frame_n, context->stack_size);
174
+ }
175
+
181
176
  frame = context->stack;
182
177
  for (i = 0; i < frame_n; i++) {
183
178
  frame = frame->prev;
@@ -255,22 +250,39 @@ Context_frame_self(int argc, VALUE *argv, VALUE self)
255
250
  return frame->self;
256
251
  }
257
252
 
258
- /*
253
+ static VALUE
254
+ Context_frame_locals(int argc, VALUE *argv, VALUE self)
255
+ {
256
+ VALUE binding = Context_frame_binding(argc, argv, self);
257
+ const char src[] =
258
+ "local_variables.inject({}){|h, v| h[v] = eval(\"#{v}\"); h}";
259
+ return NIL_P(binding) ?
260
+ rb_hash_new() :
261
+ rb_funcall(binding, rb_intern("eval"), 1, rb_str_new2(src));
262
+ }
263
+
259
264
  static VALUE
260
265
  Context_frame_args(int argc, VALUE *argv, VALUE self)
261
266
  {
262
- debug_context_t *context;
263
- debug_frame_t *frame;
264
- VALUE frame_no;
265
- int frame_n;
267
+ VALUE binding = Context_frame_binding(argc, argv, self);
268
+ const char src[] =
269
+ "__method__ ? " \
270
+ "self.method(__method__).parameters.map{|(attr, mid)| mid} : []";
271
+ return NIL_P(binding) ?
272
+ rb_ary_new() :
273
+ rb_funcall(binding, rb_intern("eval"), 1, rb_str_new2(src));
274
+ }
266
275
 
267
- Data_Get_Struct(self, debug_context_t, context);
268
- frame_n = rb_scan_args(argc, argv, "01", &frame_no) == 0 ? 0 : FIX2INT(frame_no);
269
- frame = get_frame_no(context, frame_n);
276
+ static VALUE
277
+ Context_frame_args_info(int argc, VALUE *argv, VALUE self)
278
+ {
279
+ VALUE binding = Context_frame_binding(argc, argv, self);
280
+ const char src[] = "method(__method__).parameters";
270
281
 
271
- return frame->arg_ary;
282
+ return NIL_P(binding) ?
283
+ rb_ary_new() :
284
+ rb_funcall(binding, rb_intern("eval"), 1, rb_str_new2(src));
272
285
  }
273
- */
274
286
 
275
287
  static VALUE
276
288
  Context_tracing(VALUE self)
@@ -324,6 +336,30 @@ Context_stop_reason(VALUE self)
324
336
  return ID2SYM(rb_intern(symbol));
325
337
  }
326
338
 
339
+ #if 0
340
+
341
+ static VALUE
342
+ Context_jump(VALUE self, VALUE line, VALUE file)
343
+ {
344
+ debug_context_t *context;
345
+ debug_frame_t *frame;
346
+ int i, lineno;
347
+
348
+ Data_Get_Struct(self, debug_context_t, context);
349
+
350
+ frame = context->stack;
351
+ lineno = FIX2INT(line);
352
+
353
+ for (i = 0; i < context->stack_size; i++) {
354
+ if (strcmp(frame->file, RSTRING_PTR(file))) {
355
+ /* And now? */
356
+ }
357
+ frame = frame->prev;
358
+ }
359
+ }
360
+
361
+ #endif
362
+
327
363
  static VALUE
328
364
  Context_stop_next(int argc, VALUE *argv, VALUE self)
329
365
  {
@@ -332,7 +368,8 @@ Context_stop_next(int argc, VALUE *argv, VALUE self)
332
368
  debug_context_t *context;
333
369
 
334
370
  rb_scan_args(argc, argv, "11", &steps, &force);
335
- if(FIX2INT(steps) < 0) rb_raise(rb_eRuntimeError, "Steps argument can't be negative.");
371
+ if (FIX2INT(steps) < 0)
372
+ rb_raise(rb_eRuntimeError, "Steps argument can't be negative.");
336
373
 
337
374
  Data_Get_Struct(self, debug_context_t, context);
338
375
  context->stop_next = FIX2INT(steps);
@@ -351,23 +388,17 @@ Context_step_over(int argc, VALUE *argv, VALUE self)
351
388
  debug_context_t *context;
352
389
 
353
390
  Data_Get_Struct(self, debug_context_t, context);
354
- if(context->stack_size == 0)
391
+ if (context->stack_size == 0)
355
392
  rb_raise(rb_eRuntimeError, "No frames collected.");
356
393
 
357
394
  rb_scan_args(argc, argv, "12", &lines, &frame, &force);
358
395
  context->stop_line = FIX2INT(lines);
359
- CTX_FL_UNSET(context, CTX_FL_STEPPED);
360
- if(frame == Qnil)
361
- {
362
- context->dest_frame = context->stack_size;
363
- }
364
- else
365
- {
366
- if(FIX2INT(frame) < 0 && FIX2INT(frame) >= context->stack_size)
367
- rb_raise(rb_eRuntimeError, "Destination frame is out of range.");
368
- context->dest_frame = context->stack_size - FIX2INT(frame);
369
- }
370
- if(RTEST(force))
396
+
397
+ if (FIX2INT(frame) < 0 && FIX2INT(frame) >= context->stack_size)
398
+ rb_raise(rb_eRuntimeError, "Destination frame is out of range.");
399
+ context->dest_frame = context->stack_size - FIX2INT(frame);
400
+
401
+ if (RTEST(force))
371
402
  CTX_FL_SET(context, CTX_FL_FORCE_MOVE);
372
403
  else
373
404
  CTX_FL_UNSET(context, CTX_FL_FORCE_MOVE);
@@ -378,12 +409,12 @@ Context_step_over(int argc, VALUE *argv, VALUE self)
378
409
  static VALUE
379
410
  Context_stop_frame(VALUE self, VALUE frame)
380
411
  {
381
- debug_context_t *debug_context;
412
+ debug_context_t *context;
382
413
 
383
- Data_Get_Struct(self, debug_context_t, debug_context);
384
- if(FIX2INT(frame) < 0 && FIX2INT(frame) >= debug_context->stack_size)
414
+ Data_Get_Struct(self, debug_context_t, context);
415
+ if(FIX2INT(frame) < 0 && FIX2INT(frame) >= context->stack_size)
385
416
  rb_raise(rb_eRuntimeError, "Stop frame is out of range.");
386
- debug_context->stop_frame = debug_context->stack_size - FIX2INT(frame);
417
+ context->stop_frame = context->stack_size - FIX2INT(frame);
387
418
 
388
419
  return frame;
389
420
  }
@@ -412,7 +443,9 @@ Init_context(VALUE mByebug)
412
443
  rb_define_method(cContext, "frame_method", Context_frame_method, -1);
413
444
  rb_define_method(cContext, "frame_binding", Context_frame_binding, -1);
414
445
  rb_define_method(cContext, "frame_self", Context_frame_self, -1);
415
- //rb_define_method(cContext, "frame_args", Context_frame_args, -1);
446
+ rb_define_method(cContext, "frame_args", Context_frame_args, -1);
447
+ rb_define_method(cContext, "frame_args_info", Context_frame_args_info, -1);
448
+ rb_define_method(cContext, "frame_locals", Context_frame_locals, -1);
416
449
  rb_define_method(cContext, "stop_next=", Context_stop_next, -1);
417
450
  rb_define_method(cContext, "step", Context_stop_next, -1);
418
451
  rb_define_method(cContext, "step_over", Context_step_over, -1);
@@ -11,7 +11,6 @@ require 'linecache19'
11
11
  module Byebug
12
12
 
13
13
  @reload_source_on_change = false
14
- @tracing_started = false
15
14
 
16
15
  self.handler = CommandProcessor.new
17
16
 
@@ -19,21 +18,19 @@ module Byebug
19
18
  DEFAULT_START_SETTINGS = {
20
19
  :init => true, # Set $0 and save ARGV?
21
20
  :post_mortem => false, # post-mortem debugging on uncaught exception?
22
- :tracing => nil # Byebug.tracing value. true/false resets,
21
+ :tracing => nil # Byebug.tracing value. true/false resets
23
22
  } unless defined?(DEFAULT_START_SETTINGS)
24
23
 
25
- # the port number used for remote debugging
24
+ # Port number used for remote debugging
26
25
  PORT = 8989 unless defined?(PORT)
27
26
 
28
- # What file is used for byebug startup commands.
29
- unless defined?(INITFILE)
30
- INITFILE = '.rdebugrc'
31
- HOME_DIR = ENV['HOME'].to_s
32
- end
27
+ # Configuration file used for startup commands. Default value is .byebugrc
28
+ INITFILE = '.byebugrc' unless defined?(INITFILE)
33
29
 
34
30
  class << self
35
31
 
36
- # if true, checks the modification time of source files and reloads if it was modified
32
+ # If true, checks the modification time of source files and reloads them if
33
+ # they were modified
37
34
  attr_accessor :reload_source_on_change
38
35
 
39
36
  attr_accessor :last_exception
@@ -42,11 +39,10 @@ module Byebug
42
39
  # gdb-style annotation mode. Used in GNU Emacs interface
43
40
  attr_accessor :annotate
44
41
 
45
- # in remote mode, wait for the remote connection
42
+ # If in remote mode, wait for the remote connection
46
43
  attr_accessor :wait_connection
47
44
 
48
- # If set, a string to look for in caller() and is used to see
49
- # if the call stack is truncated.
45
+ # A string to look for in caller() to see if the call stack is truncated
50
46
  attr_accessor :start_sentinal
51
47
 
52
48
  attr_reader :thread, :control_thread, :cmd_port, :ctrl_port
@@ -75,13 +71,13 @@ module Byebug
75
71
  LineCache::clear_file_cache
76
72
  end
77
73
 
78
- # Get line +line_number+ from file named +filename+. Return "\n" if
79
- # there was a problem. Leaking blanks are stripped off.
80
- def line_at(filename, line_number) # :nodoc:
81
- @reload_on_change=nil unless defined?(@reload_on_change)
74
+ # Get line +line_number+ from file named +filename+.
75
+ # @return "\n" if there was a problem. Leaking blanks are stripped off.
76
+ def line_at(filename, line_number)
77
+ @reload_on_change = nil unless defined?(@reload_on_change)
82
78
  line = LineCache::getline(filename, line_number, @reload_on_change)
83
79
  return "\n" unless line
84
- return "#{line.gsub(/^\s+/, '').chomp}\n"
80
+ return "#{line.gsub(/^\s+/, '').chomp}"
85
81
  end
86
82
 
87
83
  alias stop remove_tracepoints
@@ -110,16 +106,14 @@ module Byebug
110
106
  # If it's called without a block it returns +true+, unless byebug was
111
107
  # already started.
112
108
  #
113
- # If a block is given, it starts byebug and yields to block. When the
114
- # block is finished executing it stops the byebug with Byebug.stop
115
- # method. Inside the block you will probably want to have a call to
116
- # Byebug.byebug. For example:
109
+ # If a block is given, it starts byebug and yields block. When the block is
110
+ # executed it stops byebug with Byebug.stop method. Inside the block you
111
+ # will probably want to have a call to Byebug.byebug. For example:
117
112
  #
118
113
  # Byebug.start{byebug; foo} # Stop inside of foo
119
114
  #
120
115
  # Also, byebug only allows one invocation of byebug at a time; nested
121
- # Byebug.start's have no effect and you can't use this inside the byebug
122
- # itself.
116
+ # Byebug.start's have no effect and you can't use this inside byebug itself.
123
117
  #
124
118
  # <i>Note that if you want to stop byebug, you must call Byebug.stop as
125
119
  # many times as you called Byebug.start method.</i>
@@ -141,15 +135,15 @@ module Byebug
141
135
  Byebug.const_set('PROG_SCRIPT', $0) unless defined? Byebug::PROG_SCRIPT
142
136
  Byebug.const_set('INITIAL_DIR', Dir.pwd) unless defined? Byebug::INITIAL_DIR
143
137
  end
144
- #Byebug.tracing = options[:tracing] unless options[:tracing].nil?
138
+ Byebug.tracing = options[:tracing] unless options[:tracing].nil?
145
139
  if Byebug.started?
146
140
  retval = block && block.call(self)
147
141
  else
148
142
  retval = Byebug._start(&block)
149
143
  end
150
- if options[:post_mortem]
151
- post_mortem
152
- end
144
+ #if options[:post_mortem]
145
+ # post_mortem
146
+ #end
153
147
  return retval
154
148
  end
155
149
 
@@ -247,12 +241,13 @@ module Byebug
247
241
  # program you are debugging, in the directory where you invoke byebug.
248
242
  #
249
243
  def run_init_script(out = handler.interface)
250
- cwd_script_file = File.expand_path(File.join(".", INITFILE))
251
- run_script(cwd_script_file, out) if File.exists?(cwd_script_file)
244
+ cwd_script = File.expand_path(File.join(".", INITFILE))
245
+ run_script(cwd_script, out) if File.exists?(script_file)
252
246
 
253
- home_script_file = File.expand_path(File.join(HOME_DIR, INITFILE))
254
- run_script(home_script_file, out) if File.exists?(home_script_file) and
255
- cwd_script_file != home_script_file
247
+ home_script = File.expand_path(File.join(ENV['HOME'].to_s, INITFILE))
248
+ if File.exists?(home_script) and cwd_script != home_script
249
+ run_script(home_script_file, out)
250
+ end
256
251
  end
257
252
 
258
253
  #
@@ -374,14 +369,15 @@ class Module
374
369
  end
375
370
  module Kernel
376
371
 
372
+ ##
377
373
  # Enters byebug in the current thread after _steps_ line events occur.
378
374
  #
379
- # Before entering byebug startup, the init script is read. Setting _steps_ to 0
380
- # will cause a break in the byebug subroutine and not wait for a line event to
381
- # occur. You will have to go "up 1" in order to be back to your debugged program
382
- # from byebug program. Setting _steps_ to 0 could be useful if you want to stop
383
- # right after the last statement in some scope, because the next step will take
384
- # you out of some scope.
375
+ # Before entering byebug startup, the init script is read. Setting _steps_ to
376
+ # 0 will cause a break in byebug's subroutine and not wait for a line event to
377
+ # occur. You will have to go "up 1" in order to be back to your debugged
378
+ # program from byebug. Setting _steps_ to 0 could be useful if you want to
379
+ # stop right after the last statement in some scope, because the next step
380
+ # will take you out of some scope.
385
381
  def byebug(steps = 1)
386
382
  Byebug.start
387
383
  Byebug.run_init_script(StringIO.new)
@@ -1,12 +1,15 @@
1
1
  require 'columnize'
2
+ require 'forwardable'
2
3
  require_relative 'helper'
3
4
 
4
5
  module Byebug
5
6
 
7
+ # Root dir for byebug
6
8
  BYEBUG_DIR = File.expand_path(File.dirname(__FILE__)) unless
7
9
  defined?(BYEBUG_DIR)
8
10
 
9
- class Command # :nodoc:
11
+ class Command
12
+
10
13
  SubcmdStruct = Struct.new(:name, :min, :short_help, :long_help) unless
11
14
  defined?(SubcmdStruct)
12
15
 
@@ -32,11 +35,11 @@ module Byebug
32
35
 
33
36
  DEF_OPTIONS = {
34
37
  :allow_in_control => false,
35
- :allow_in_post_mortem => true,
36
- :event => true,
37
- :always_run => 0,
38
- :unknown => false,
39
- :need_context => false,
38
+ :allow_in_post_mortem => true ,
39
+ :event => true ,
40
+ :always_run => 0 ,
41
+ :unknown => false,
42
+ :need_context => false,
40
43
  } unless defined?(DEF_OPTIONS)
41
44
 
42
45
  def inherited(klass)
@@ -47,12 +50,10 @@ module Byebug
47
50
  end
48
51
 
49
52
  def load_commands
50
- Dir[File.join(Byebug.const_get(:BYEBUG_DIR), 'commands', '*')].each do |file|
51
- require file if file =~ /\.rb$/
52
- end
53
- Byebug.constants.grep(/Functions$/).map { |name| Byebug.const_get(name) }.each do |mod|
54
- include mod
55
- end
53
+ Dir[File.join(Byebug.const_get(:BYEBUG_DIR), 'commands', '*')].each {
54
+ |file| require file if file =~ /\.rb$/ }
55
+ Byebug.constants.grep(/Functions$/).map {
56
+ |name| Byebug.const_get(name) }.each { |mod| include mod }
56
57
  end
57
58
 
58
59
  def method_missing(meth, *args, &block)
@@ -155,14 +156,8 @@ module Byebug
155
156
 
156
157
  protected
157
158
 
158
- # FIXME: use delegate?
159
- def errmsg(*args)
160
- @state.errmsg(*args)
161
- end
162
-
163
- def print(*args)
164
- @state.print(*args)
165
- end
159
+ extend Forwardable
160
+ def_delegators :@state, :errmsg, :print
166
161
 
167
162
  def confirm(msg)
168
163
  @state.confirm(msg) == 'y'
@@ -197,9 +192,9 @@ module Byebug
197
192
  @state.context.frame_binding(@state.frame_pos)
198
193
  end
199
194
 
200
- def line_at(file, line)
201
- Byebug.line_at(file, line)
202
- end
195
+ #def line_at(file, line)
196
+ # Byebug.line_at(file, line)
197
+ #end
203
198
 
204
199
  def get_context(thnum)
205
200
  Byebug.contexts.find{|c| c.thnum == thnum}
@@ -208,7 +203,7 @@ module Byebug
208
203
 
209
204
  Command.load_commands
210
205
 
211
- #
206
+ ##
212
207
  # Returns ths settings object.
213
208
  # Use Byebug.settings[] and Byebug.settings[]= methods to query and set
214
209
  # byebug settings. These settings are available:
@@ -32,14 +32,13 @@ module Byebug
32
32
  end
33
33
  end
34
34
 
35
- brkpt_filename = nil
35
+ brkpt_filename = file
36
36
  if file.nil?
37
37
  unless @state.context
38
38
  errmsg "We are not in a state that has an associated file.\n"
39
39
  return
40
40
  end
41
41
  brkpt_filename = @state.file
42
- file = File.basename(@state.file)
43
42
  if line.nil?
44
43
  # Set breakpoint at current line
45
44
  line = @state.line.to_s
@@ -53,11 +52,6 @@ module Byebug
53
52
  errmsg "Unknown class #{file}.\n"
54
53
  throw :debug_error
55
54
  end
56
- else
57
- # FIXME: This should be done in LineCache.
58
- file = File.expand_path(file) if file.index(File::SEPARATOR) || \
59
- File::ALT_SEPARATOR && file.index(File::ALT_SEPARATOR)
60
- brkpt_filename = file
61
55
  end
62
56
 
63
57
  if line =~ /^\d+$/
@@ -65,15 +59,19 @@ module Byebug
65
59
  if LineCache.cache(brkpt_filename, Command.settings[:reload_source_on_change])
66
60
  last_line = LineCache.size(brkpt_filename)
67
61
  if line > last_line
68
- errmsg("There are only %d lines in file \"%s\".\n", last_line, file)
62
+ errmsg \
63
+ "There are only %d lines in file %s\n",
64
+ last_line, brkpt_filename
69
65
  return
70
66
  end
71
67
  unless LineCache.trace_line_numbers(brkpt_filename).member?(line)
72
- errmsg("Line %d is not a stopping point in file \"%s\".\n", line, file)
68
+ errmsg \
69
+ "Line %d is not a stopping point in file %s\n",
70
+ line, brkpt_filename
73
71
  return
74
72
  end
75
73
  else
76
- errmsg("No source file named %s\n" % file)
74
+ errmsg("No source file named %s\n", brkpt_filename)
77
75
  return unless confirm("Set breakpoint anyway? (y/n) ")
78
76
  end
79
77
 
@@ -82,7 +80,8 @@ module Byebug
82
80
  return
83
81
  end
84
82
  b = Byebug.add_breakpoint brkpt_filename, line, expr
85
- print "Breakpoint %d file %s, line %s\n", b.id, brkpt_filename, line.to_s
83
+ print "Created breakpoint #{b.id} at " \
84
+ "#{CommandProcessor.canonic_file(brkpt_filename)}:#{line.to_s}"
86
85
  unless syntax_valid?(expr)
87
86
  errmsg("Expression \"#{expr}\" syntactically incorrect; breakpoint disabled.\n")
88
87
  b.enabled = false
@@ -90,7 +89,7 @@ module Byebug
90
89
  else
91
90
  method = line.intern
92
91
  b = Byebug.add_breakpoint class_name, method, expr
93
- print "Breakpoint %d at %s::%s\n", b.id, class_name, method.to_s
92
+ print "Created breakpoint #{b.id} at #{class_name}::#{method.to_s}"
94
93
  end
95
94
  end
96
95