rbbcc 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 181f92fbe4475f87b329107f70fc1e15ac0cbfa044560e6c030dab5cd2456dab
4
- data.tar.gz: 8699282acb475db5d641d2aa46234fb341461db78b105bc4520c5dba92226f13
3
+ metadata.gz: 83335da3fa30d52d38210f68efa6cf19cb5d44143ecc58ecdc6d4df30560303e
4
+ data.tar.gz: 75d0c97a8624a72928b4195bd830257c79e6a5e883058d9ae5c6c53512fccb1b
5
5
  SHA512:
6
- metadata.gz: 93c042656a0023f11759e27fa04bd6d7a8533c0edcf0b2cbf33b99e669792dbec304c6af13f257cee35a35ae80d190d7c42f11e3e99993ec42708747a886f556
7
- data.tar.gz: 39127d19ed85575e4bc0563802e7523d3bbad4f15541ed6f372d5e29d4036be784c1b881c4a9604b65a631230a5868786116cb7da63ceef73bded49a81703f72
6
+ metadata.gz: a634d67b7b8a322ac433825bdbf376e7ef3ebe30f2e43dc477eb6f52c14fbc812bf04a286a6e9af30ad3ffc999fe370c2bdfe0fee56608e501618973873f74a7
7
+ data.tar.gz: 9b9cc3a877ab56ec8ceb516b0fc576fe981784e8689ec026974e429cecbe6e82d6da06e74d7473d9e38819b50e2d430c01801d1deecaee3bc197900a91d93684
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbbcc (0.0.1.pre)
4
+ rbbcc (0.0.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,6 +1,7 @@
1
1
  require "rbbcc/bcc"
2
2
  require "rbbcc/clib"
3
3
  require "rbbcc/usdt"
4
+ require "rbbcc/symbol_cache"
4
5
  require "rbbcc/version"
5
6
 
6
7
  module RbBCC
@@ -1,4 +1,5 @@
1
1
  require 'rbbcc/consts'
2
+ require 'rbbcc/symbol_cache'
2
3
 
3
4
  module RbBCC
4
5
  SYSCALL_PREFIXES = [
@@ -42,6 +43,7 @@ module RbBCC
42
43
 
43
44
  at_exit { self.cleanup }
44
45
  end
46
+ attr_reader :module
45
47
 
46
48
  def gen_args_from_usdt
47
49
  ptr = Clib.bcc_usdt_genargs(@usdt_contexts.map(&:context).pack('J*'), @usdt_contexts.size)
@@ -204,8 +206,14 @@ module RbBCC
204
206
  def fix_syscall_fnname(name)
205
207
  SYSCALL_PREFIXES.each do |prefix|
206
208
  if name.start_with?(prefix)
207
- # TODO resolution from sym cache
208
- return SYSCALL_PREFIXES[0] + name.sub(prefix, "")
209
+ real = SYSCALL_PREFIXES.find { |candidate|
210
+ SymbolCache.resolve_global(name.sub(prefix, candidate))
211
+ }
212
+ unless real
213
+ real = prefix
214
+ end
215
+
216
+ return name.sub(prefix, real)
209
217
  end
210
218
  end
211
219
  return name
@@ -37,5 +37,18 @@ module RbBCC
37
37
  extern 'int bcc_usdt_enable_probe(void *, char *, char *)'
38
38
  extern 'char * bcc_usdt_genargs(void **, int)'
39
39
  extern 'void bcc_usdt_foreach_uprobe(void *, void *)'
40
+
41
+ BCCSymbol = struct([
42
+ "const char *name",
43
+ "const char *demangle_name",
44
+ "const char *module",
45
+ "unsigned long offset"
46
+ ])
47
+
48
+ extern 'void * bcc_symcache_new(int, void *)'
49
+ extern 'void bcc_free_symcache(void *, int)'
50
+ extern 'int bcc_symcache_resolve(void *, unsigned long, void *)'
51
+ extern 'int bcc_symcache_resolve_no_demangle(void *, unsigned long, void *)'
52
+ extern 'int bcc_symcache_resolve_name(void *, char *, char *, unsigned long long *)'
40
53
  end
41
54
  end
@@ -0,0 +1,55 @@
1
+ require 'rbbcc/clib'
2
+
3
+ module RbBCC
4
+ class SymbolCache
5
+ class << self
6
+ def caches
7
+ @caches ||= {}
8
+ end
9
+
10
+ def cache(pid)
11
+ pid = -1 if pid < 0 && pid != -1
12
+ caches[pid] ||= SymbolCache.new(pid)
13
+ caches[pid]
14
+ end
15
+ alias [] cache
16
+
17
+ def resolve_global(name)
18
+ self[-1].resolve_name(nil, name)
19
+ end
20
+ end
21
+
22
+ def initialize(pid)
23
+ @cache = Clib.bcc_symcache_new(pid, nil)
24
+ end
25
+
26
+ def resolve(addr, demangle)
27
+ sym = Clib::BCCSymcache.malloc
28
+ ret = if demangle
29
+ Clib.bcc_symcache_resolve(@cache, addr, sym)
30
+ else
31
+ Clib.bcc_symcache_resolve_no_demangle(@cache, addr, sym)
32
+ end
33
+ if res < 0
34
+ return [nil, addr, nil]
35
+ end
36
+
37
+ if demangle
38
+ name_res = sym.demangle_name
39
+ # Clib.bcc_symbol_free_demangle_name(sym)
40
+ else
41
+ name_res = sym.name
42
+ end
43
+
44
+ return [name_res, sym.offset, Clib.__extract_char(sym.module)]
45
+ end
46
+
47
+ def resolve_name(_module, name)
48
+ addr_p = Fiddle::Pointer.malloc(Fiddle::SIZEOF_UINTPTR_T)
49
+ if Clib.bcc_symcache_resolve_name(@cache, _module, name, addr_p) < 0
50
+ return false
51
+ end
52
+ return addr_p
53
+ end
54
+ end
55
+ end
@@ -1,3 +1,3 @@
1
1
  module RbBCC
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbcc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio Kondo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-31 00:00:00.000000000 Z
11
+ date: 2019-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -62,6 +62,7 @@ files:
62
62
  - lib/rbbcc/bcc.rb
63
63
  - lib/rbbcc/clib.rb
64
64
  - lib/rbbcc/consts.rb
65
+ - lib/rbbcc/symbol_cache.rb
65
66
  - lib/rbbcc/usdt.rb
66
67
  - lib/rbbcc/version.rb
67
68
  - rbbcc.gemspec