vernier 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/vernier/vernier.cc +27 -6
- data/lib/vernier/output/firefox.rb +17 -1
- data/lib/vernier/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: faf587f758e0b9a68adc377bf27c0f35eb0605703b088e3e122f969f513c864d
|
4
|
+
data.tar.gz: 6cbefbfa78fb3ef1e92c7cfdd5ba0dd43f59b1f63cce6583fe18f4e667fd61db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 402ce92fbe0f408906fe368e0e2edc637dd68f08476a690877166cb1628068fd6bbfd11878d625276e8f3f785c20adc49ef19494d9e81162d201930b4c64c81f
|
7
|
+
data.tar.gz: 8b7d6c687873ed991b23a508231471b445d6960b47bac2045f1f9eee9f5d82584490a0278f2344d0001e3f5367fffcdfc29fbc284bed448c4155e4381aa26292
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ gem "vernier", "~> 1.0"
|
|
30
30
|
|
31
31
|
## Usage
|
32
32
|
|
33
|
-
The output can be viewed in the web app at https://vernier.prof, locally using the [`profile-viewer` gem](https://github.com/tenderlove/profiler/tree/ruby) (both lightly customized versions of the firefox profiler frontend, which profiles are also compatible with) or by using the `
|
33
|
+
The output can be viewed in the web app at https://vernier.prof, locally using the [`profile-viewer` gem](https://github.com/tenderlove/profiler/tree/ruby) (both lightly customized versions of the firefox profiler frontend, which profiles are also compatible with) or by using the `vernier view` command in the CLI.
|
34
34
|
|
35
35
|
- **Flame Graph**: Shows proportionally how much time is spent within particular stack frames. Frames are grouped together, which means that x-axis / left-to-right order is not meaningful.
|
36
36
|
- **Stack Chart**: Shows the stack at each sample with the x-axis representing time and can be read left-to-right.
|
data/ext/vernier/vernier.cc
CHANGED
@@ -30,6 +30,7 @@
|
|
30
30
|
#include "vernier.hh"
|
31
31
|
|
32
32
|
#include "ruby/ruby.h"
|
33
|
+
#include "ruby/encoding.h"
|
33
34
|
#include "ruby/debug.h"
|
34
35
|
#include "ruby/thread.h"
|
35
36
|
|
@@ -746,7 +747,20 @@ StackTable::stack_table_func_name(VALUE self, VALUE idxval) {
|
|
746
747
|
} else {
|
747
748
|
const auto &func_info = table[idx];
|
748
749
|
const std::string &label = func_info.label;
|
749
|
-
|
750
|
+
|
751
|
+
// Ruby constants are in an arbitrary (ASCII compatible) encoding and
|
752
|
+
// method names are in an arbitrary (ASCII compatible) encoding. These
|
753
|
+
// can be mixed in the same program.
|
754
|
+
//
|
755
|
+
// However, by this point we've lost the chain of what the correct
|
756
|
+
// encoding should be. Oops!
|
757
|
+
//
|
758
|
+
// Instead we'll just guess at UTF-8 which should satisfy most. It won't
|
759
|
+
// necessarily be valid but that can be scrubbed on the Ruby side.
|
760
|
+
//
|
761
|
+
// In the future we might keep class and method name separate for
|
762
|
+
// longer, preserve encodings, and defer formatting to the Ruby side.
|
763
|
+
return rb_enc_interned_str(label.c_str(), label.length(), rb_utf8_encoding());
|
750
764
|
}
|
751
765
|
}
|
752
766
|
|
@@ -761,7 +775,11 @@ StackTable::stack_table_func_filename(VALUE self, VALUE idxval) {
|
|
761
775
|
} else {
|
762
776
|
const auto &func_info = table[idx];
|
763
777
|
const std::string &filename = func_info.file;
|
764
|
-
|
778
|
+
|
779
|
+
// Technically filesystems are binary and then Ruby interprets that as
|
780
|
+
// default_external encoding. But to keep things simple for now we are
|
781
|
+
// going to assume UTF-8.
|
782
|
+
return rb_enc_interned_str(filename.c_str(), filename.length(), rb_utf8_encoding());
|
765
783
|
}
|
766
784
|
}
|
767
785
|
|
@@ -1397,11 +1415,13 @@ class CustomCollector : public BaseCollector {
|
|
1397
1415
|
VALUE threads = rb_hash_new();
|
1398
1416
|
rb_ivar_set(result, rb_intern("@threads"), threads);
|
1399
1417
|
|
1400
|
-
|
1401
|
-
|
1418
|
+
VALUE thread_hash = rb_hash_new();
|
1419
|
+
samples.write_result(thread_hash);
|
1402
1420
|
|
1403
|
-
|
1404
|
-
|
1421
|
+
rb_hash_aset(threads, ULL2NUM(0), thread_hash);
|
1422
|
+
rb_hash_aset(thread_hash, sym("tid"), ULL2NUM(0));
|
1423
|
+
rb_hash_aset(thread_hash, sym("name"), rb_str_new_cstr("custom"));
|
1424
|
+
rb_hash_aset(thread_hash, sym("started_at"), ULL2NUM(started_at.nanoseconds()));
|
1405
1425
|
|
1406
1426
|
return result;
|
1407
1427
|
}
|
@@ -2001,6 +2021,7 @@ static const rb_data_type_t rb_collector_type = {
|
|
2001
2021
|
//.dmemsize = rb_collector_memsize,
|
2002
2022
|
.dmark = collector_mark,
|
2003
2023
|
.dfree = collector_free,
|
2024
|
+
.dsize = NULL,
|
2004
2025
|
.dcompact = collector_compact,
|
2005
2026
|
},
|
2006
2027
|
};
|
@@ -525,7 +525,23 @@ module Vernier
|
|
525
525
|
end
|
526
526
|
|
527
527
|
def string_table
|
528
|
-
@strings.keys
|
528
|
+
@strings.keys.map do |string|
|
529
|
+
if string.ascii_only?
|
530
|
+
string
|
531
|
+
elsif string.encoding == Encoding::UTF_8
|
532
|
+
if string.valid_encoding?
|
533
|
+
string
|
534
|
+
else
|
535
|
+
string.scrub
|
536
|
+
end
|
537
|
+
elsif string.encoding == Encoding::BINARY
|
538
|
+
# TODO: We might want to guess UTF-8 and escape the binary more explicitly
|
539
|
+
string.dup.force_encoding("UTF-8").scrub
|
540
|
+
else
|
541
|
+
# TODO: ideally we should attempt to properly re-encode here, but right now I think this is dead code
|
542
|
+
string.dup.force_encoding("UTF-8").scrub
|
543
|
+
end
|
544
|
+
end
|
529
545
|
end
|
530
546
|
|
531
547
|
private
|
data/lib/vernier/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vernier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Hawthorn
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -117,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: '0'
|
119
119
|
requirements: []
|
120
|
-
rubygems_version: 3.5.
|
120
|
+
rubygems_version: 3.5.22
|
121
121
|
signing_key:
|
122
122
|
specification_version: 4
|
123
123
|
summary: A next generation CRuby profiler
|