ruby_tracer 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +44 -0
- data/lib/ruby_tracer/base.rb +2 -1
- data/lib/ruby_tracer/call_tracer.rb +11 -3
- data/lib/ruby_tracer/exception_tracer.rb +3 -1
- data/lib/ruby_tracer/helper.rb +3 -0
- data/lib/ruby_tracer/object_tracer.rb +4 -4
- data/lib/ruby_tracer/version.rb +1 -1
- data/lib/ruby_tracer.rb +23 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed2853558a9d7a761617ee215d7f46c9b146cdb4fcb431564052f0330d84069a
|
4
|
+
data.tar.gz: ad54ea0f5958215ea2271f782354539cf74907af3a53bb16cc6ce7412007eceb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e38ef5d999c9a01a32148cc6f5709fac2b6d19430ab345823dfa7896ec37a6349f759552623ae47e6c12d61dabddde71cc9647d1ffd3213d2457bacbdff90363
|
7
|
+
data.tar.gz: ae263df3f94d33ae886e4d1966fc06265349839f05b9fd8538e48f81e3b7d9cb4ab7c84ae0c8299567f031480d0d53c03d645e2e97351fc7f41b64c3ad14de58
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -24,6 +24,46 @@ $ gem install ruby_tracer
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
+
```rb
|
28
|
+
Tracer.trace(object) { ... } # trace object's activities in the given block
|
29
|
+
Tracer.trace_call { ... } # trace method calls in the given block
|
30
|
+
Tracer.trace_exception { ... } # trace exceptions in the given block
|
31
|
+
```
|
32
|
+
|
33
|
+
**Example**
|
34
|
+
|
35
|
+
```rb
|
36
|
+
require "ruby_tracer"
|
37
|
+
|
38
|
+
obj = Object.new
|
39
|
+
|
40
|
+
def obj.foo
|
41
|
+
100
|
42
|
+
end
|
43
|
+
|
44
|
+
def bar(obj)
|
45
|
+
obj.foo
|
46
|
+
end
|
47
|
+
|
48
|
+
Tracer.trace(obj) { bar(obj) }
|
49
|
+
#depth:1 #<Object:0x000000010903c190> is used as a parameter obj of Object#bar at test.rb:13:in `block in <main>'
|
50
|
+
#depth:2 #<Object:0x000000010903c190> receives .foo at test.rb:10:in `bar'
|
51
|
+
```
|
52
|
+
|
53
|
+
### `ruby_tracer/helper`
|
54
|
+
|
55
|
+
If you want to avoid the `Tracer` namespace, you can do `require "ruby_tracer/helper"` instead:
|
56
|
+
|
57
|
+
```rb
|
58
|
+
require "ruby_tracer/helper"
|
59
|
+
|
60
|
+
trace(object) { ... } # trace object's activities in the given block
|
61
|
+
trace_call { ... } # trace method calls in the given block
|
62
|
+
trace_exception { ... } # trace exceptions in the given block
|
63
|
+
```
|
64
|
+
|
65
|
+
If you want to have more control over individual traces, you can use individual tracer classes:
|
66
|
+
|
27
67
|
### ObjectTracer
|
28
68
|
|
29
69
|
```rb
|
@@ -120,6 +160,10 @@ end
|
|
120
160
|
#depth:5 at test.rb:8
|
121
161
|
```
|
122
162
|
|
163
|
+
## Customization
|
164
|
+
|
165
|
+
TBD
|
166
|
+
|
123
167
|
## Acknowledgement
|
124
168
|
|
125
169
|
[@ko1](https://github.com/ko1) (Koichi Sasada) implemented the majority of [`ruby/debug`](https://github.com/ruby/debug), including its tracers. So this project wouldn't exist without his amazing work there.
|
data/lib/ruby_tracer/base.rb
CHANGED
@@ -70,10 +70,11 @@ module Tracer
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
def initialize(output: STDOUT, pattern: nil, colorize: nil)
|
73
|
+
def initialize(output: STDOUT, pattern: nil, colorize: nil, depth_offset: 0)
|
74
74
|
@name = self.class.name
|
75
75
|
@type = @name.sub(/Tracer\z/, "")
|
76
76
|
@output = output
|
77
|
+
@depth_offset = depth_offset
|
77
78
|
@colorize = colorize || colorizable?
|
78
79
|
|
79
80
|
if pattern
|
@@ -7,22 +7,30 @@ class CallTracer < Tracer::Base
|
|
7
7
|
TracePoint.new(:a_call, :a_return) do |tp|
|
8
8
|
next if skip?(tp)
|
9
9
|
|
10
|
+
location = caller_locations(2, 1).first
|
11
|
+
next if location.to_s.match?(/<internal:/)
|
12
|
+
|
10
13
|
depth = caller.size
|
11
14
|
|
12
15
|
call_identifier_str = (tp.defined_class ? minfo(tp) : "block")
|
13
|
-
|
14
16
|
call_identifier_str = colorize_blue(call_identifier_str)
|
15
17
|
|
16
18
|
case tp.event
|
17
19
|
when :call, :c_call, :b_call
|
18
20
|
depth += 1 if tp.event == :c_call
|
19
21
|
sp = " " * depth
|
20
|
-
out tp,
|
22
|
+
out tp,
|
23
|
+
">#{sp}#{call_identifier_str}",
|
24
|
+
depth: depth - 2 - @depth_offset,
|
25
|
+
location: location
|
21
26
|
when :return, :c_return, :b_return
|
22
27
|
depth += 1 if tp.event == :c_return
|
23
28
|
sp = " " * depth
|
24
29
|
return_str = colorize_magenta(safe_inspect(tp.return_value))
|
25
|
-
out tp,
|
30
|
+
out tp,
|
31
|
+
"<#{sp}#{call_identifier_str} #=> #{return_str}",
|
32
|
+
depth: depth - 2 - @depth_offset,
|
33
|
+
location: location
|
26
34
|
end
|
27
35
|
end
|
28
36
|
end
|
@@ -65,7 +65,7 @@ class ObjectTracer < Tracer::Base
|
|
65
65
|
out tp,
|
66
66
|
" #{colorized_target_label} receives #{colorize_blue(method_info)}",
|
67
67
|
location: caller_locations(internal_depth, 1).first,
|
68
|
-
depth: caller.size - internal_depth
|
68
|
+
depth: caller.size - internal_depth - @depth_offset
|
69
69
|
elsif !tp.parameters.empty?
|
70
70
|
b = tp.binding
|
71
71
|
method_info = colorize_blue(minfo(tp))
|
@@ -82,7 +82,7 @@ class ObjectTracer < Tracer::Base
|
|
82
82
|
out tp,
|
83
83
|
" #{colorized_target_label} is used as a parameter #{colorized_name} of #{method_info}",
|
84
84
|
location: caller_locations(internal_depth, 1).first,
|
85
|
-
depth: caller.size - internal_depth
|
85
|
+
depth: caller.size - internal_depth - @depth_offset
|
86
86
|
end
|
87
87
|
when :rest
|
88
88
|
next if name == :"*"
|
@@ -94,7 +94,7 @@ class ObjectTracer < Tracer::Base
|
|
94
94
|
out tp,
|
95
95
|
" #{colorized_target_label} is used as a parameter in #{colorized_name} of #{method_info}",
|
96
96
|
location: caller_locations(internal_depth, 1).first,
|
97
|
-
depth: caller.size - internal_depth
|
97
|
+
depth: caller.size - internal_depth - @depth_offset
|
98
98
|
end
|
99
99
|
end
|
100
100
|
when :keyrest
|
@@ -106,7 +106,7 @@ class ObjectTracer < Tracer::Base
|
|
106
106
|
out tp,
|
107
107
|
" #{colorized_target_label} is used as a parameter in #{colorized_name} of #{method_info}",
|
108
108
|
location: caller_locations(internal_depth, 1).first,
|
109
|
-
depth: caller.size - internal_depth
|
109
|
+
depth: caller.size - internal_depth - @depth_offset
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|
data/lib/ruby_tracer/version.rb
CHANGED
data/lib/ruby_tracer.rb
CHANGED
@@ -5,3 +5,26 @@ require_relative "ruby_tracer/line_tracer"
|
|
5
5
|
require_relative "ruby_tracer/call_tracer"
|
6
6
|
require_relative "ruby_tracer/exception_tracer"
|
7
7
|
require_relative "ruby_tracer/object_tracer"
|
8
|
+
|
9
|
+
module Tracer
|
10
|
+
module Helper
|
11
|
+
DEPTH_OFFSET = 3
|
12
|
+
|
13
|
+
def trace_exception(&block)
|
14
|
+
tracer = ExceptionTracer.new(depth_offset: DEPTH_OFFSET)
|
15
|
+
tracer.start(&block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def trace_call(&block)
|
19
|
+
tracer = CallTracer.new(depth_offset: DEPTH_OFFSET)
|
20
|
+
tracer.start(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def trace(target, &block)
|
24
|
+
tracer = ObjectTracer.new(target, depth_offset: DEPTH_OFFSET)
|
25
|
+
tracer.start(&block)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
extend Helper
|
30
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stan Lo
|
@@ -29,6 +29,7 @@ files:
|
|
29
29
|
- lib/ruby_tracer/call_tracer.rb
|
30
30
|
- lib/ruby_tracer/color.rb
|
31
31
|
- lib/ruby_tracer/exception_tracer.rb
|
32
|
+
- lib/ruby_tracer/helper.rb
|
32
33
|
- lib/ruby_tracer/line_tracer.rb
|
33
34
|
- lib/ruby_tracer/object_tracer.rb
|
34
35
|
- lib/ruby_tracer/version.rb
|