Class Debugger::AddBreakpoint
In: cli/ruby-debug/commands/breakpoints.rb
Parent: Command

Implements debugger "break" command.

Methods

execute   help   help_command   regexp  

Public Class methods

[Source]

     # File cli/ruby-debug/commands/breakpoints.rb, line 104
104:       def help(cmd)
105:         %{
106:           b[reak] file:line [if expr]
107:           b[reak] class(.|#)method [if expr]
108:           \tset breakpoint to some position, (optionally) if expr == true
109:         }
110:       end

[Source]

     # File cli/ruby-debug/commands/breakpoints.rb, line 100
100:       def help_command
101:         'break'
102:       end

Public Instance methods

[Source]

    # File cli/ruby-debug/commands/breakpoints.rb, line 16
16:     def execute
17:       if @match[1]
18:         line, _, _, expr = @match.captures
19:       else
20:         _, file, line, expr = @match.captures
21:       end
22:       if expr 
23:         if expr !~ /^\s*if\s+(.+)/
24:           if file or line
25:             errmsg "Expecting 'if' in breakpoint condition; got: #{expr}.\n"
26:           else
27:             errmsg "Invalid breakpoint location: #{expr}.\n"
28:           end
29:           return
30:         else
31:           expr = $1
32:         end
33:       end
34: 
35:       brkpt_filename = nil
36:       if file.nil?
37:         unless @state.context
38:           errmsg "We are not in a state that has an associated file.\n"
39:           return 
40:         end
41:         brkpt_filename = @state.file
42:         file = File.basename(@state.file)
43:         if line.nil? 
44:           # Set breakpoint at current line
45:           line = @state.line.to_s
46:         end
47:       elsif line !~ /^\d+$/
48:         # See if "line" is a method/function name
49:         klass = debug_silent_eval(file)
50:         if klass && klass.kind_of?(Module)
51:           class_name = klass.name if klass
52:         else
53:           errmsg "Unknown class #{file}.\n"
54:           throw :debug_error
55:         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:       end
62:       
63:       if line =~ /^\d+$/
64:         line = line.to_i
65:         if LineCache.cache(brkpt_filename, Command.settings[:reload_source_on_change])
66:           last_line = LineCache.size(brkpt_filename)
67:           if line > last_line
68:             errmsg("There are only %d lines in file \"%s\".\n", last_line, file) 
69:             return
70:           end
71:           unless LineCache.trace_line_numbers(brkpt_filename).member?(line)
72:             errmsg("Line %d is not a stopping point in file \"%s\".\n", line, file) 
73:             return
74:           end
75:         else
76:           errmsg("No source file named %s\n" % file)
77:           return unless confirm("Set breakpoint anyway? (y/n) ")
78:         end
79: 
80:         unless @state.context
81:           errmsg "We are not in a state we can add breakpoints.\n"
82:           return 
83:         end
84:         brkpt_filename = File.basename(brkpt_filename) if 
85:           Command.settings[:basename]
86:         b = Debugger.add_breakpoint brkpt_filename, line, expr
87:         print "Breakpoint %d file %s, line %s\n", b.id, brkpt_filename, line.to_s
88:         unless syntax_valid?(expr)
89:           errmsg("Expression \"#{expr}\" syntactically incorrect; breakpoint disabled.\n")
90:           b.enabled = false
91:         end
92:       else
93:         method = line.intern.id2name
94:         b = Debugger.add_breakpoint class_name, method, expr
95:         print "Breakpoint %d at %s::%s\n", b.id, class_name, method.to_s
96:       end
97:     end

[Source]

    # File cli/ruby-debug/commands/breakpoints.rb, line 7
 7:     def regexp
 8:       / ^\s*
 9:         b(?:reak)?
10:         (?: \s+ #{Position_regexp})? \s*
11:         (?: \s+ (.*))? \s*
12:         $
13:       /x
14:     end

[Validate]