stackprof 0.2.23 → 0.2.25
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/CHANGELOG.md +4 -0
- data/bin/stackprof +7 -8
- data/ext/stackprof/stackprof.c +20 -0
- data/lib/stackprof.rb +6 -1
- data/stackprof.gemspec +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b299eb696cf0c2748e931532afab3f90bab1c94447ff1c844bce0eda878a93c6
|
4
|
+
data.tar.gz: bd2c389baa8253fc06beda425abc87762b9bca425c6bc5046655610fb9852e79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 322e506fc77bd964f39e7b3f0c5584e57efdec8e1dcc432cdea924536e334234d916a1d5e1ff085e2e5210a49751897ca36a4b1bd007468a5b16184151129be3
|
7
|
+
data.tar.gz: 3234d4159c78119a9238200d1f4516280cbd1e0cfe3affca1c4fa4827b805ecf154e38857c917fafe7aed042d67525bb7e6c5fce85a039e30cde4672ae08f97e
|
data/CHANGELOG.md
CHANGED
data/bin/stackprof
CHANGED
@@ -2,13 +2,15 @@
|
|
2
2
|
require 'optparse'
|
3
3
|
require 'stackprof'
|
4
4
|
|
5
|
+
banner = <<-END
|
6
|
+
Usage: stackprof run [--mode=MODE|--out=FILE|--interval=INTERVAL|--format=FORMAT] -- COMMAND
|
7
|
+
Usage: stackprof [file.dump]+ [--text|--method=NAME|--callgrind|--graphviz]
|
8
|
+
END
|
9
|
+
|
5
10
|
if ARGV.first == "run"
|
6
11
|
ARGV.shift
|
7
12
|
env = {}
|
8
|
-
parser = OptionParser.new(
|
9
|
-
o.banner = "Usage: stackprof run [--mode=MODE|--out=FILE|--interval=INTERVAL|--format=FORMAT] -- COMMAND"
|
10
|
-
o.banner = "Usage: stackprof [file.dump]+ [--text|--method=NAME|--callgrind|--graphviz]"
|
11
|
-
|
13
|
+
parser = OptionParser.new(banner) do |o|
|
12
14
|
o.on('--mode [MODE]', String, 'Mode of sampling: cpu, wall, object, default to wall') do |mode|
|
13
15
|
env["STACKPROF_MODE"] = mode
|
14
16
|
end
|
@@ -37,10 +39,7 @@ if ARGV.first == "run"
|
|
37
39
|
else
|
38
40
|
options = {}
|
39
41
|
|
40
|
-
parser = OptionParser.new(
|
41
|
-
o.banner = "Usage: stackprof run [--mode|--out|--interval] -- COMMAND"
|
42
|
-
o.banner = "Usage: stackprof [file.dump]+ [--text|--method=NAME|--callgrind|--graphviz]"
|
43
|
-
|
42
|
+
parser = OptionParser.new(banner) do |o|
|
44
43
|
o.on('--text', 'Text summary per method (default)'){ options[:format] = :text }
|
45
44
|
o.on('--json', 'JSON output (use with web viewers)'){ options[:format] = :json }
|
46
45
|
o.on('--files', 'List of files'){ |f| options[:format] = :files }
|
data/ext/stackprof/stackprof.c
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
#include <ruby/st.h>
|
13
13
|
#include <ruby/io.h>
|
14
14
|
#include <ruby/intern.h>
|
15
|
+
#include <ruby/vm.h>
|
15
16
|
#include <signal.h>
|
16
17
|
#include <sys/time.h>
|
17
18
|
#include <time.h>
|
@@ -32,6 +33,7 @@ static const char *fake_frame_cstrs[] = {
|
|
32
33
|
};
|
33
34
|
|
34
35
|
static int stackprof_use_postponed_job = 1;
|
36
|
+
static int ruby_vm_running = 0;
|
35
37
|
|
36
38
|
#define TOTAL_FAKE_FRAMES (sizeof(fake_frame_cstrs) / sizeof(char *))
|
37
39
|
|
@@ -725,6 +727,11 @@ stackprof_signal_handler(int sig, siginfo_t *sinfo, void *ucontext)
|
|
725
727
|
|
726
728
|
if (!_stackprof.running) return;
|
727
729
|
|
730
|
+
// There's a possibility that the signal handler is invoked *after* the Ruby
|
731
|
+
// VM has been shut down (e.g. after ruby_cleanup(0)). In this case, things
|
732
|
+
// that rely on global VM state (e.g. rb_during_gc) will segfault.
|
733
|
+
if (!ruby_vm_running) return;
|
734
|
+
|
728
735
|
if (_stackprof.mode == sym_wall) {
|
729
736
|
// In "wall" mode, the SIGALRM signal will arrive at an arbitrary thread.
|
730
737
|
// In order to provide more useful results, especially under threaded web
|
@@ -804,6 +811,10 @@ stackprof_gc_mark(void *data)
|
|
804
811
|
|
805
812
|
if (_stackprof.frames)
|
806
813
|
st_foreach(_stackprof.frames, frame_mark_i, 0);
|
814
|
+
|
815
|
+
for (int i = 0; i < _stackprof.buffer_count; i++) {
|
816
|
+
rb_gc_mark(_stackprof.frames_buffer[i]);
|
817
|
+
}
|
807
818
|
}
|
808
819
|
|
809
820
|
static void
|
@@ -845,6 +856,12 @@ stackprof_use_postponed_job_l(VALUE self)
|
|
845
856
|
return Qnil;
|
846
857
|
}
|
847
858
|
|
859
|
+
static void
|
860
|
+
stackprof_at_exit(ruby_vm_t* vm)
|
861
|
+
{
|
862
|
+
ruby_vm_running = 0;
|
863
|
+
}
|
864
|
+
|
848
865
|
void
|
849
866
|
Init_stackprof(void)
|
850
867
|
{
|
@@ -855,6 +872,9 @@ Init_stackprof(void)
|
|
855
872
|
*/
|
856
873
|
stackprof_use_postponed_job = RUBY_API_VERSION_MAJOR < 3;
|
857
874
|
|
875
|
+
ruby_vm_running = 1;
|
876
|
+
ruby_vm_at_exit(stackprof_at_exit);
|
877
|
+
|
858
878
|
#define S(name) sym_##name = ID2SYM(rb_intern(#name));
|
859
879
|
S(object);
|
860
880
|
S(custom);
|
data/lib/stackprof.rb
CHANGED
@@ -6,10 +6,15 @@ end
|
|
6
6
|
|
7
7
|
if defined?(RubyVM::YJIT) && RubyVM::YJIT.enabled?
|
8
8
|
StackProf.use_postponed_job!
|
9
|
+
elsif RUBY_VERSION == "3.2.0"
|
10
|
+
# 3.2.0 crash is the signal is received at the wrong time.
|
11
|
+
# Fixed in https://github.com/ruby/ruby/pull/7116
|
12
|
+
# The fix is backported in 3.2.1: https://bugs.ruby-lang.org/issues/19336
|
13
|
+
StackProf.use_postponed_job!
|
9
14
|
end
|
10
15
|
|
11
16
|
module StackProf
|
12
|
-
VERSION = '0.2.
|
17
|
+
VERSION = '0.2.25'
|
13
18
|
end
|
14
19
|
|
15
20
|
StackProf.autoload :Report, "stackprof/report.rb"
|
data/stackprof.gemspec
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.25
|
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:
|
11
|
+
date: 2023-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -99,10 +99,10 @@ licenses:
|
|
99
99
|
- MIT
|
100
100
|
metadata:
|
101
101
|
bug_tracker_uri: https://github.com/tmm1/stackprof/issues
|
102
|
-
changelog_uri: https://github.com/tmm1/stackprof/blob/v0.2.
|
103
|
-
documentation_uri: https://www.rubydoc.info/gems/stackprof/0.2.
|
104
|
-
source_code_uri: https://github.com/tmm1/stackprof/tree/v0.2.
|
105
|
-
post_install_message:
|
102
|
+
changelog_uri: https://github.com/tmm1/stackprof/blob/v0.2.25/CHANGELOG.md
|
103
|
+
documentation_uri: https://www.rubydoc.info/gems/stackprof/0.2.25
|
104
|
+
source_code_uri: https://github.com/tmm1/stackprof/tree/v0.2.25
|
105
|
+
post_install_message:
|
106
106
|
rdoc_options: []
|
107
107
|
require_paths:
|
108
108
|
- lib
|
@@ -117,8 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: '0'
|
119
119
|
requirements: []
|
120
|
-
rubygems_version: 3.3.
|
121
|
-
signing_key:
|
120
|
+
rubygems_version: 3.0.3.1
|
121
|
+
signing_key:
|
122
122
|
specification_version: 4
|
123
123
|
summary: sampling callstack-profiler for ruby 2.2+
|
124
124
|
test_files: []
|