stackprof 0.2.20 → 0.2.21
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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/Rakefile +14 -4
- data/ext/stackprof/extconf.rb +6 -0
- data/ext/stackprof/stackprof.c +8 -8
- data/lib/stackprof/report.rb +3 -3
- data/lib/stackprof/truffleruby.rb +37 -0
- data/lib/stackprof.rb +6 -2
- data/stackprof.gemspec +1 -1
- data/test/test_stackprof.rb +1 -1
- data/test/test_truffleruby.rb +18 -0
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33a342cae97be870781375a647e95936c6a6016ae711f27d60e41a891cb809f4
|
4
|
+
data.tar.gz: 867d55b7c7cdfc928ae35b3c36474bdda41ed4c4dc8e8b661b0c6580890b0b28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 255835983ab93b52f7d1118a076f1881511c27b82a6db9e3f5db909f888bb563b26b855fc49dacbd0ef0b41f77af6c7638bf15721ff5085d012e916d4871592f
|
7
|
+
data.tar.gz: 7520e06a5bdf8fb240538b9a333f265675cc4056bc24b88c06d0d8c2e7cd5185346be6268707fe00f7f41bf6f8c8d70abc3925e53ac6684889ef4dc9e3ef6afd
|
data/.github/workflows/ci.yml
CHANGED
@@ -8,7 +8,7 @@ jobs:
|
|
8
8
|
strategy:
|
9
9
|
fail-fast: false
|
10
10
|
matrix:
|
11
|
-
ruby: [ ruby-head, '3.1', '3.0', '2.7', '2.6', '2.5', '2.4', '2.3', '2.2' ]
|
11
|
+
ruby: [ ruby-head, '3.1', '3.0', '2.7', '2.6', '2.5', '2.4', '2.3', '2.2', truffleruby ]
|
12
12
|
steps:
|
13
13
|
- name: Checkout
|
14
14
|
uses: actions/checkout@v2
|
data/Rakefile
CHANGED
@@ -7,11 +7,21 @@ Rake::TestTask.new(:test) do |t|
|
|
7
7
|
t.test_files = FileList["test/**/test_*.rb"]
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
if RUBY_ENGINE == "truffleruby"
|
11
|
+
task :compile do
|
12
|
+
# noop
|
13
|
+
end
|
11
14
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
+
task :clean do
|
16
|
+
# noop
|
17
|
+
end
|
18
|
+
else
|
19
|
+
require "rake/extensiontask"
|
20
|
+
|
21
|
+
Rake::ExtensionTask.new("stackprof") do |ext|
|
22
|
+
ext.ext_dir = "ext/stackprof"
|
23
|
+
ext.lib_dir = "lib/stackprof"
|
24
|
+
end
|
15
25
|
end
|
16
26
|
|
17
27
|
task default: %i(compile test)
|
data/ext/stackprof/extconf.rb
CHANGED
data/ext/stackprof/stackprof.c
CHANGED
@@ -146,6 +146,7 @@ stackprof_start(int argc, VALUE *argv, VALUE self)
|
|
146
146
|
VALUE opts = Qnil, mode = Qnil, interval = Qnil, metadata = rb_hash_new(), out = Qfalse;
|
147
147
|
int ignore_gc = 0;
|
148
148
|
int raw = 0, aggregate = 1;
|
149
|
+
VALUE metadata_val;
|
149
150
|
|
150
151
|
if (_stackprof.running)
|
151
152
|
return Qfalse;
|
@@ -160,7 +161,7 @@ stackprof_start(int argc, VALUE *argv, VALUE self)
|
|
160
161
|
ignore_gc = 1;
|
161
162
|
}
|
162
163
|
|
163
|
-
|
164
|
+
metadata_val = rb_hash_aref(opts, sym_metadata);
|
164
165
|
if (RTEST(metadata_val)) {
|
165
166
|
if (!RB_TYPE_P(metadata_val, T_HASH))
|
166
167
|
rb_raise(rb_eArgError, "metadata should be a hash");
|
@@ -597,14 +598,15 @@ stackprof_record_sample_for_stack(int num, uint64_t sample_timestamp, int64_t ti
|
|
597
598
|
void
|
598
599
|
stackprof_buffer_sample(void)
|
599
600
|
{
|
601
|
+
uint64_t start_timestamp = 0;
|
602
|
+
int64_t timestamp_delta = 0;
|
603
|
+
int num;
|
604
|
+
|
600
605
|
if (_stackprof.buffer_count > 0) {
|
601
606
|
// Another sample is already pending
|
602
607
|
return;
|
603
608
|
}
|
604
609
|
|
605
|
-
uint64_t start_timestamp = 0;
|
606
|
-
int64_t timestamp_delta = 0;
|
607
|
-
int num;
|
608
610
|
if (_stackprof.raw) {
|
609
611
|
struct timestamp_t t;
|
610
612
|
capture_timestamp(&t);
|
@@ -828,15 +830,13 @@ stackprof_use_postponed_job_l(VALUE self)
|
|
828
830
|
void
|
829
831
|
Init_stackprof(void)
|
830
832
|
{
|
833
|
+
size_t i;
|
831
834
|
/*
|
832
835
|
* As of Ruby 3.0, it should be safe to read stack frames at any time, unless YJIT is enabled
|
833
836
|
* See https://github.com/ruby/ruby/commit/0e276dc458f94d9d79a0f7c7669bde84abe80f21
|
834
837
|
*/
|
835
|
-
|
836
|
-
stackprof_use_postponed_job = 0;
|
837
|
-
#endif
|
838
|
+
stackprof_use_postponed_job = RUBY_API_VERSION_MAJOR < 3;
|
838
839
|
|
839
|
-
size_t i;
|
840
840
|
#define S(name) sym_##name = ID2SYM(rb_intern(#name));
|
841
841
|
S(object);
|
842
842
|
S(custom);
|
data/lib/stackprof/report.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'pp'
|
4
|
-
require 'digest/
|
4
|
+
require 'digest/sha2'
|
5
5
|
require 'json'
|
6
6
|
|
7
7
|
module StackProf
|
@@ -52,7 +52,7 @@ module StackProf
|
|
52
52
|
def normalized_frames
|
53
53
|
id2hash = {}
|
54
54
|
@data[:frames].each do |frame, info|
|
55
|
-
id2hash[frame.to_s] = info[:hash] = Digest::
|
55
|
+
id2hash[frame.to_s] = info[:hash] = Digest::SHA256.hexdigest("#{info[:name]}#{info[:file]}#{info[:line]}")
|
56
56
|
end
|
57
57
|
@data[:frames].inject(Hash.new) do |hash, (frame, info)|
|
58
58
|
info = hash[id2hash[frame.to_s]] = info.dup
|
@@ -225,7 +225,7 @@ module StackProf
|
|
225
225
|
end
|
226
226
|
else
|
227
227
|
frame = @data[:frames][val]
|
228
|
-
child_name = "#{ frame[:name] } : #{ frame[:file] }"
|
228
|
+
child_name = "#{ frame[:name] } : #{ frame[:file] } : #{ frame[:line] }"
|
229
229
|
child_data = convert_to_d3_flame_graph_format(child_name, child_stacks, depth + 1)
|
230
230
|
weight += child_data["value"]
|
231
231
|
children << child_data
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module StackProf
|
2
|
+
# Define the same methods as stackprof.c
|
3
|
+
class << self
|
4
|
+
def running?
|
5
|
+
false
|
6
|
+
end
|
7
|
+
|
8
|
+
def run(*args)
|
9
|
+
unimplemented
|
10
|
+
end
|
11
|
+
|
12
|
+
def start(*args)
|
13
|
+
unimplemented
|
14
|
+
end
|
15
|
+
|
16
|
+
def stop
|
17
|
+
unimplemented
|
18
|
+
end
|
19
|
+
|
20
|
+
def results(*args)
|
21
|
+
unimplemented
|
22
|
+
end
|
23
|
+
|
24
|
+
def sample
|
25
|
+
unimplemented
|
26
|
+
end
|
27
|
+
|
28
|
+
def use_postponed_job!
|
29
|
+
# noop
|
30
|
+
end
|
31
|
+
|
32
|
+
private def unimplemented
|
33
|
+
raise "Use --cpusampler=flamegraph or --cpusampler instead of StackProf on TruffleRuby.\n" \
|
34
|
+
"See https://www.graalvm.org/tools/profiling/ and `ruby --help:cpusampler` for more details."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/stackprof.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
|
1
|
+
if RUBY_ENGINE == 'truffleruby'
|
2
|
+
require "stackprof/truffleruby"
|
3
|
+
else
|
4
|
+
require "stackprof/stackprof"
|
5
|
+
end
|
2
6
|
|
3
7
|
if defined?(RubyVM::YJIT) && RubyVM::YJIT.enabled?
|
4
8
|
StackProf.use_postponed_job!
|
5
9
|
end
|
6
10
|
|
7
11
|
module StackProf
|
8
|
-
VERSION = '0.2.
|
12
|
+
VERSION = '0.2.21'
|
9
13
|
end
|
10
14
|
|
11
15
|
StackProf.autoload :Report, "stackprof/report.rb"
|
data/stackprof.gemspec
CHANGED
data/test/test_stackprof.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'stackprof'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
|
5
|
+
if RUBY_ENGINE == 'truffleruby'
|
6
|
+
class StackProfTruffleRubyTest < MiniTest::Test
|
7
|
+
def test_error
|
8
|
+
error = assert_raises RuntimeError do
|
9
|
+
StackProf.run(mode: :cpu) do
|
10
|
+
unreacheable
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
assert_match(/TruffleRuby/, error.message)
|
15
|
+
assert_match(/--cpusampler/, error.message)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackprof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aman Gupta
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/stackprof/flamegraph/viewer.html
|
81
81
|
- lib/stackprof/middleware.rb
|
82
82
|
- lib/stackprof/report.rb
|
83
|
+
- lib/stackprof/truffleruby.rb
|
83
84
|
- sample.rb
|
84
85
|
- stackprof.gemspec
|
85
86
|
- test/fixtures/profile.dump
|
@@ -87,6 +88,7 @@ files:
|
|
87
88
|
- test/test_middleware.rb
|
88
89
|
- test/test_report.rb
|
89
90
|
- test/test_stackprof.rb
|
91
|
+
- test/test_truffleruby.rb
|
90
92
|
- vendor/FlameGraph/README
|
91
93
|
- vendor/FlameGraph/flamegraph.pl
|
92
94
|
- vendor/gprof2dot/gprof2dot.py
|
@@ -96,10 +98,10 @@ licenses:
|
|
96
98
|
- MIT
|
97
99
|
metadata:
|
98
100
|
bug_tracker_uri: https://github.com/tmm1/stackprof/issues
|
99
|
-
changelog_uri: https://github.com/tmm1/stackprof/blob/v0.2.
|
100
|
-
documentation_uri: https://www.rubydoc.info/gems/stackprof/0.2.
|
101
|
-
source_code_uri: https://github.com/tmm1/stackprof/tree/v0.2.
|
102
|
-
post_install_message:
|
101
|
+
changelog_uri: https://github.com/tmm1/stackprof/blob/v0.2.21/CHANGELOG.md
|
102
|
+
documentation_uri: https://www.rubydoc.info/gems/stackprof/0.2.21
|
103
|
+
source_code_uri: https://github.com/tmm1/stackprof/tree/v0.2.21
|
104
|
+
post_install_message:
|
103
105
|
rdoc_options: []
|
104
106
|
require_paths:
|
105
107
|
- lib
|
@@ -114,8 +116,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
116
|
- !ruby/object:Gem::Version
|
115
117
|
version: '0'
|
116
118
|
requirements: []
|
117
|
-
rubygems_version: 3.0.
|
118
|
-
signing_key:
|
119
|
+
rubygems_version: 3.4.0.dev
|
120
|
+
signing_key:
|
119
121
|
specification_version: 4
|
120
122
|
summary: sampling callstack-profiler for ruby 2.2+
|
121
123
|
test_files: []
|