xref: /aosp_15_r20/external/bcc/examples/lua/usdt_ruby.lua (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env bcc-lua
2*387f9dfdSAndroid Build Coastguard Worker--[[
3*387f9dfdSAndroid Build Coastguard WorkerCopyright 2016 GitHub, Inc
4*387f9dfdSAndroid Build Coastguard Worker
5*387f9dfdSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License");
6*387f9dfdSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License.
7*387f9dfdSAndroid Build Coastguard WorkerYou may obtain a copy of the License at
8*387f9dfdSAndroid Build Coastguard Worker
9*387f9dfdSAndroid Build Coastguard Workerhttp://www.apache.org/licenses/LICENSE-2.0
10*387f9dfdSAndroid Build Coastguard Worker
11*387f9dfdSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software
12*387f9dfdSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS,
13*387f9dfdSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*387f9dfdSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and
15*387f9dfdSAndroid Build Coastguard Workerlimitations under the License.
16*387f9dfdSAndroid Build Coastguard Worker]]
17*387f9dfdSAndroid Build Coastguard Worker
18*387f9dfdSAndroid Build Coastguard Workerlocal program = [[
19*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
20*387f9dfdSAndroid Build Coastguard Workerint trace_method(struct pt_regs *ctx) {
21*387f9dfdSAndroid Build Coastguard Worker  uint64_t addr;
22*387f9dfdSAndroid Build Coastguard Worker  bpf_usdt_readarg(2, ctx, &addr);
23*387f9dfdSAndroid Build Coastguard Worker
24*387f9dfdSAndroid Build Coastguard Worker  char fn_name[128] = {};
25*387f9dfdSAndroid Build Coastguard Worker  bpf_probe_read_user(&fn_name, sizeof(fn_name), (void *)addr);
26*387f9dfdSAndroid Build Coastguard Worker
27*387f9dfdSAndroid Build Coastguard Worker  bpf_trace_printk("%s(...)\n", fn_name);
28*387f9dfdSAndroid Build Coastguard Worker  return 0;
29*387f9dfdSAndroid Build Coastguard Worker};
30*387f9dfdSAndroid Build Coastguard Worker]]
31*387f9dfdSAndroid Build Coastguard Worker
32*387f9dfdSAndroid Build Coastguard Workerreturn function(BPF, util)
33*387f9dfdSAndroid Build Coastguard Worker  if not arg[1] then
34*387f9dfdSAndroid Build Coastguard Worker    print("usage: rubysyms.lua PID")
35*387f9dfdSAndroid Build Coastguard Worker    return
36*387f9dfdSAndroid Build Coastguard Worker  end
37*387f9dfdSAndroid Build Coastguard Worker
38*387f9dfdSAndroid Build Coastguard Worker  local u = util.USDT:new{pid=tonumber(arg[1])}
39*387f9dfdSAndroid Build Coastguard Worker  u:enable_probe{probe="method__entry", fn_name="trace_method"}
40*387f9dfdSAndroid Build Coastguard Worker
41*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=program, usdt=u}
42*387f9dfdSAndroid Build Coastguard Worker  local pipe = b:pipe()
43*387f9dfdSAndroid Build Coastguard Worker  while true do
44*387f9dfdSAndroid Build Coastguard Worker    print(pipe:trace_fields())
45*387f9dfdSAndroid Build Coastguard Worker  end
46*387f9dfdSAndroid Build Coastguard Workerend
47