| Class | Tracer |
| In: |
lib/debug.rb
lib/tracer.rb |
| Parent: | Object |
tracer main class
| EVENT_SYMBOL | = | { "line" => "-", "call" => ">", "return" => "<", "class" => "C", "end" => "E", "c-call" => ">", "c-return" => "<", } |
| Single | = | new |
| verbose | -> | verbose? |
| stdout | [RW] | |
| verbose | [RW] |
# File lib/tracer.rb, line 150
150: def Tracer.add_filter(p = proc)
151: Single.add_filter(p)
152: end
# File lib/tracer.rb, line 37
37: def initialize
38: @threads = Hash.new
39: if defined? Thread.main
40: @threads[Thread.main.object_id] = 0
41: else
42: @threads[Thread.current.object_id] = 0
43: end
44:
45: @get_line_procs = {}
46:
47: @filters = []
48: end
# File lib/tracer.rb, line 134
134: def Tracer.on
135: if block_given?
136: Single.on{yield}
137: else
138: Single.on
139: end
140: end
# File lib/tracer.rb, line 146
146: def Tracer.set_get_line_procs(file_name, p = proc)
147: Single.set_get_line_procs(file_name, p)
148: end
# File lib/tracer.rb, line 81
81: def get_line(file, line)
82: if p = @get_line_procs[file]
83: return p.call(line)
84: end
85:
86: unless list = SCRIPT_LINES__[file]
87: begin
88: f = open(file)
89: begin
90: SCRIPT_LINES__[file] = list = f.readlines
91: ensure
92: f.close
93: end
94: rescue
95: SCRIPT_LINES__[file] = list = []
96: end
97: end
98:
99: if l = list[line - 1]
100: l
101: else
102: "-\n"
103: end
104: end
# File lib/tracer.rb, line 106
106: def get_thread_no
107: if no = @threads[Thread.current.object_id]
108: no
109: else
110: @threads[Thread.current.object_id] = @threads.size
111: end
112: end
# File lib/tracer.rb, line 68
68: def off
69: set_trace_func nil
70: stdout.print "Trace off\n" if Tracer.verbose?
71: end
# File lib/tracer.rb, line 54
54: def on
55: if block_given?
56: on
57: begin
58: yield
59: ensure
60: off
61: end
62: else
63: set_trace_func method(:trace_func).to_proc
64: stdout.print "Trace on\n" if Tracer.verbose?
65: end
66: end
# File lib/tracer.rb, line 77
77: def set_get_line_procs(file, p = proc)
78: @get_line_procs[file] = p
79: end
# File lib/tracer.rb, line 114
114: def trace_func(event, file, line, id, binding, klass, *)
115: return if file == __FILE__
116:
117: for p in @filters
118: return unless p.call event, file, line, id, binding, klass
119: end
120:
121: saved_crit = Thread.critical
122: Thread.critical = true
123: stdout.printf("#%d:%s:%d:%s:%s: %s",
124: get_thread_no,
125: file,
126: line,
127: klass || '',
128: EVENT_SYMBOL[event],
129: get_line(file, line))
130: Thread.critical = saved_crit
131: end