stackprof 0.2.19 → 0.2.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/bin/stackprof +1 -1
- data/ext/stackprof/stackprof.c +27 -19
- data/lib/stackprof/report.rb +34 -0
- data/lib/stackprof.rb +5 -1
- data/stackprof.gemspec +1 -1
- data/test/fixtures/profile.dump +1 -0
- data/test/fixtures/profile.json +1 -0
- data/test/test_report.rb +24 -0
- data/test/test_stackprof.rb +4 -0
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e627bf7fbeca0cb94e8be863b0a1db9160534d5172c1409ba4306e0f16a57ae0
|
4
|
+
data.tar.gz: f881ec5ab3267f3b48f57794c3bce910b39f890db32817655b4e5253733fc466
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 514c6697e4465fbce7990fffc2a71ca5aa544e1f526b338fde343c14bc801bb5056534e371e4d8fd5642f1b73b92126b2a5e476eb5292dde23bd0da734d7e236
|
7
|
+
data.tar.gz: bed130e196f1004b3e74d2db466732fa8b23e582df3fcf944161112036053e95a5a05a3ed2ac175a6603e1f3b28b6062491aef89f4d30b764be3886aaf586b19
|
data/.github/workflows/ci.yml
CHANGED
data/bin/stackprof
CHANGED
@@ -42,7 +42,7 @@ reports = []
|
|
42
42
|
while ARGV.size > 0
|
43
43
|
begin
|
44
44
|
file = ARGV.pop
|
45
|
-
reports << StackProf::Report.
|
45
|
+
reports << StackProf::Report.from_file(file)
|
46
46
|
rescue TypeError => e
|
47
47
|
STDERR.puts "** error parsing #{file}: #{e.inspect}"
|
48
48
|
end
|
data/ext/stackprof/stackprof.c
CHANGED
@@ -25,20 +25,14 @@
|
|
25
25
|
#define FAKE_FRAME_MARK INT2FIX(1)
|
26
26
|
#define FAKE_FRAME_SWEEP INT2FIX(2)
|
27
27
|
|
28
|
-
/*
|
29
|
-
* As of Ruby 3.0, it should be safe to read stack frames at any time
|
30
|
-
* See https://github.com/ruby/ruby/commit/0e276dc458f94d9d79a0f7c7669bde84abe80f21
|
31
|
-
*/
|
32
|
-
#if RUBY_API_VERSION_MAJOR < 3
|
33
|
-
#define USE_POSTPONED_JOB
|
34
|
-
#endif
|
35
|
-
|
36
28
|
static const char *fake_frame_cstrs[] = {
|
37
29
|
"(garbage collection)",
|
38
30
|
"(marking)",
|
39
31
|
"(sweeping)",
|
40
32
|
};
|
41
33
|
|
34
|
+
static int stackprof_use_postponed_job = 1;
|
35
|
+
|
42
36
|
#define TOTAL_FAKE_FRAMES (sizeof(fake_frame_cstrs) / sizeof(char *))
|
43
37
|
|
44
38
|
#ifdef _POSIX_MONOTONIC_CLOCK
|
@@ -701,7 +695,6 @@ stackprof_job_record_gc(void *data)
|
|
701
695
|
stackprof_record_gc_samples();
|
702
696
|
}
|
703
697
|
|
704
|
-
#ifdef USE_POSTPONED_JOB
|
705
698
|
static void
|
706
699
|
stackprof_job_sample_and_record(void *data)
|
707
700
|
{
|
@@ -709,7 +702,6 @@ stackprof_job_sample_and_record(void *data)
|
|
709
702
|
|
710
703
|
stackprof_sample_and_record();
|
711
704
|
}
|
712
|
-
#endif
|
713
705
|
|
714
706
|
static void
|
715
707
|
stackprof_job_record_buffer(void *data)
|
@@ -740,15 +732,15 @@ stackprof_signal_handler(int sig, siginfo_t *sinfo, void *ucontext)
|
|
740
732
|
_stackprof.unrecorded_gc_samples++;
|
741
733
|
rb_postponed_job_register_one(0, stackprof_job_record_gc, (void*)0);
|
742
734
|
} else {
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
735
|
+
if (stackprof_use_postponed_job) {
|
736
|
+
rb_postponed_job_register_one(0, stackprof_job_sample_and_record, (void*)0);
|
737
|
+
} else {
|
738
|
+
// Buffer a sample immediately, if an existing sample exists this will
|
739
|
+
// return immediately
|
740
|
+
stackprof_buffer_sample();
|
741
|
+
// Enqueue a job to record the sample
|
742
|
+
rb_postponed_job_register_one(0, stackprof_job_record_buffer, (void*)0);
|
743
|
+
}
|
752
744
|
}
|
753
745
|
pthread_mutex_unlock(&lock);
|
754
746
|
}
|
@@ -826,9 +818,24 @@ stackprof_atfork_child(void)
|
|
826
818
|
stackprof_stop(rb_mStackProf);
|
827
819
|
}
|
828
820
|
|
821
|
+
static VALUE
|
822
|
+
stackprof_use_postponed_job_l(VALUE self)
|
823
|
+
{
|
824
|
+
stackprof_use_postponed_job = 1;
|
825
|
+
return Qnil;
|
826
|
+
}
|
827
|
+
|
829
828
|
void
|
830
829
|
Init_stackprof(void)
|
831
830
|
{
|
831
|
+
/*
|
832
|
+
* As of Ruby 3.0, it should be safe to read stack frames at any time, unless YJIT is enabled
|
833
|
+
* See https://github.com/ruby/ruby/commit/0e276dc458f94d9d79a0f7c7669bde84abe80f21
|
834
|
+
*/
|
835
|
+
#if RUBY_API_VERSION_MAJOR < 3
|
836
|
+
stackprof_use_postponed_job = 0;
|
837
|
+
#endif
|
838
|
+
|
832
839
|
size_t i;
|
833
840
|
#define S(name) sym_##name = ID2SYM(rb_intern(#name));
|
834
841
|
S(object);
|
@@ -890,6 +897,7 @@ Init_stackprof(void)
|
|
890
897
|
rb_define_singleton_method(rb_mStackProf, "stop", stackprof_stop, 0);
|
891
898
|
rb_define_singleton_method(rb_mStackProf, "results", stackprof_results, -1);
|
892
899
|
rb_define_singleton_method(rb_mStackProf, "sample", stackprof_sample, 0);
|
900
|
+
rb_define_singleton_method(rb_mStackProf, "use_postponed_job!", stackprof_use_postponed_job_l, 0);
|
893
901
|
|
894
902
|
pthread_atfork(stackprof_atfork_prepare, stackprof_atfork_parent, stackprof_atfork_child);
|
895
903
|
}
|
data/lib/stackprof/report.rb
CHANGED
@@ -2,9 +2,43 @@
|
|
2
2
|
|
3
3
|
require 'pp'
|
4
4
|
require 'digest/md5'
|
5
|
+
require 'json'
|
5
6
|
|
6
7
|
module StackProf
|
7
8
|
class Report
|
9
|
+
MARSHAL_SIGNATURE = "\x04\x08"
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def from_file(file)
|
13
|
+
if (content = IO.binread(file)).start_with?(MARSHAL_SIGNATURE)
|
14
|
+
new(Marshal.load(content))
|
15
|
+
else
|
16
|
+
from_json(JSON.parse(content))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def from_json(json)
|
21
|
+
new(parse_json(json))
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_json(json)
|
25
|
+
json.keys.each do |key|
|
26
|
+
value = json.delete(key)
|
27
|
+
from_json(value) if value.is_a?(Hash)
|
28
|
+
|
29
|
+
new_key = case key
|
30
|
+
when /\A[0-9]*\z/
|
31
|
+
key.to_i
|
32
|
+
else
|
33
|
+
key.to_sym
|
34
|
+
end
|
35
|
+
|
36
|
+
json[new_key] = value
|
37
|
+
end
|
38
|
+
json
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
8
42
|
def initialize(data)
|
9
43
|
@data = data
|
10
44
|
end
|
data/lib/stackprof.rb
CHANGED
data/stackprof.gemspec
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
{: modeI"cpu:ET
|
@@ -0,0 +1 @@
|
|
1
|
+
{ "mode": "cpu" }
|
data/test/test_report.rb
CHANGED
@@ -32,3 +32,27 @@ class ReportDumpTest < MiniTest::Test
|
|
32
32
|
assert_equal expected, Marshal.load(marshal_data)
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
class ReportReadTest < MiniTest::Test
|
37
|
+
require 'pathname'
|
38
|
+
|
39
|
+
def test_from_file_read_json
|
40
|
+
file = fixture("profile.json")
|
41
|
+
report = StackProf::Report.from_file(file)
|
42
|
+
|
43
|
+
assert_equal({ mode: "cpu" }, report.data)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_from_file_read_marshal
|
47
|
+
file = fixture("profile.dump")
|
48
|
+
report = StackProf::Report.from_file(file)
|
49
|
+
|
50
|
+
assert_equal({ mode: "cpu" }, report.data)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def fixture(name)
|
56
|
+
Pathname.new(__dir__).join("fixtures", name)
|
57
|
+
end
|
58
|
+
end
|
data/test/test_stackprof.rb
CHANGED
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.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aman Gupta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -82,6 +82,8 @@ files:
|
|
82
82
|
- lib/stackprof/report.rb
|
83
83
|
- sample.rb
|
84
84
|
- stackprof.gemspec
|
85
|
+
- test/fixtures/profile.dump
|
86
|
+
- test/fixtures/profile.json
|
85
87
|
- test/test_middleware.rb
|
86
88
|
- test/test_report.rb
|
87
89
|
- test/test_stackprof.rb
|
@@ -94,9 +96,9 @@ licenses:
|
|
94
96
|
- MIT
|
95
97
|
metadata:
|
96
98
|
bug_tracker_uri: https://github.com/tmm1/stackprof/issues
|
97
|
-
changelog_uri: https://github.com/tmm1/stackprof/blob/v0.2.
|
98
|
-
documentation_uri: https://www.rubydoc.info/gems/stackprof/0.2.
|
99
|
-
source_code_uri: https://github.com/tmm1/stackprof/tree/v0.2.
|
99
|
+
changelog_uri: https://github.com/tmm1/stackprof/blob/v0.2.20/CHANGELOG.md
|
100
|
+
documentation_uri: https://www.rubydoc.info/gems/stackprof/0.2.20
|
101
|
+
source_code_uri: https://github.com/tmm1/stackprof/tree/v0.2.20
|
100
102
|
post_install_message:
|
101
103
|
rdoc_options: []
|
102
104
|
require_paths:
|