rbbcc 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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