xref: /aosp_15_r20/external/bcc/examples/lua/strlen_count.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 Workerassert(arg[1], "usage: strlen_count PID")
19*387f9dfdSAndroid Build Coastguard Worker
20*387f9dfdSAndroid Build Coastguard Workerlocal program = string.gsub([[
21*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
22*387f9dfdSAndroid Build Coastguard Workerint printarg(struct pt_regs *ctx) {
23*387f9dfdSAndroid Build Coastguard Worker  if (!PT_REGS_PARM1(ctx))
24*387f9dfdSAndroid Build Coastguard Worker    return 0;
25*387f9dfdSAndroid Build Coastguard Worker  u32 pid = bpf_get_current_pid_tgid();
26*387f9dfdSAndroid Build Coastguard Worker  if (pid != PID)
27*387f9dfdSAndroid Build Coastguard Worker    return 0;
28*387f9dfdSAndroid Build Coastguard Worker  char str[128] = {};
29*387f9dfdSAndroid Build Coastguard Worker  bpf_probe_read_user(&str, sizeof(str), (void *)PT_REGS_PARM1(ctx));
30*387f9dfdSAndroid Build Coastguard Worker  bpf_trace_printk("strlen(\"%s\")\n", &str);
31*387f9dfdSAndroid Build Coastguard Worker  return 0;
32*387f9dfdSAndroid Build Coastguard Worker};
33*387f9dfdSAndroid Build Coastguard Worker]], "PID", arg[1])
34*387f9dfdSAndroid Build Coastguard Worker
35*387f9dfdSAndroid Build Coastguard Workerreturn function(BPF)
36*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=program, debug=0}
37*387f9dfdSAndroid Build Coastguard Worker  b:attach_uprobe{name="c", sym="strlen", fn_name="printarg"}
38*387f9dfdSAndroid Build Coastguard Worker
39*387f9dfdSAndroid Build Coastguard Worker  local pipe = b:pipe()
40*387f9dfdSAndroid Build Coastguard Worker  while true do
41*387f9dfdSAndroid Build Coastguard Worker    local task, pid, cpu, flags, ts, msg = pipe:trace_fields()
42*387f9dfdSAndroid Build Coastguard Worker    print("%-18.9f %-16s %-6d %s" % {ts, task, pid, msg})
43*387f9dfdSAndroid Build Coastguard Worker  end
44*387f9dfdSAndroid Build Coastguard Workerend
45