xref: /aosp_15_r20/external/bcc/tests/lua/test_uprobes.lua (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Workerlocal suite = require("test_helper")
2*387f9dfdSAndroid Build Coastguard Workerlocal ffi = require("ffi")
3*387f9dfdSAndroid Build Coastguard Workerlocal TestUprobes = {}
4*387f9dfdSAndroid Build Coastguard Worker
5*387f9dfdSAndroid Build Coastguard Workerffi.cdef[[
6*387f9dfdSAndroid Build Coastguard Worker  int getpid(void);
7*387f9dfdSAndroid Build Coastguard Worker  void malloc_stats(void);
8*387f9dfdSAndroid Build Coastguard Worker]]
9*387f9dfdSAndroid Build Coastguard Worker
10*387f9dfdSAndroid Build Coastguard Workerfunction TestUprobes:test_simple_library()
11*387f9dfdSAndroid Build Coastguard Worker  local text = [[
12*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
13*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(stats, u64, 1);
14*387f9dfdSAndroid Build Coastguard Workerstatic void incr(int idx) {
15*387f9dfdSAndroid Build Coastguard Worker    u64 *ptr = stats.lookup(&idx);
16*387f9dfdSAndroid Build Coastguard Worker    if (ptr)
17*387f9dfdSAndroid Build Coastguard Worker        ++(*ptr);
18*387f9dfdSAndroid Build Coastguard Worker}
19*387f9dfdSAndroid Build Coastguard Workerint count(struct pt_regs *ctx) {
20*387f9dfdSAndroid Build Coastguard Worker    u32 pid = bpf_get_current_pid_tgid();
21*387f9dfdSAndroid Build Coastguard Worker    if (pid == PID)
22*387f9dfdSAndroid Build Coastguard Worker        incr(0);
23*387f9dfdSAndroid Build Coastguard Worker    return 0;
24*387f9dfdSAndroid Build Coastguard Worker}]]
25*387f9dfdSAndroid Build Coastguard Worker
26*387f9dfdSAndroid Build Coastguard Worker  local pid = tonumber(ffi.C.getpid())
27*387f9dfdSAndroid Build Coastguard Worker  local text = text:gsub("PID", tostring(pid))
28*387f9dfdSAndroid Build Coastguard Worker
29*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text}
30*387f9dfdSAndroid Build Coastguard Worker  b:attach_uprobe{name="c", sym="malloc_stats", fn_name="count", pid=pid}
31*387f9dfdSAndroid Build Coastguard Worker  b:attach_uprobe{name="c", sym="malloc_stats", fn_name="count", pid=pid, retprobe=true}
32*387f9dfdSAndroid Build Coastguard Worker
33*387f9dfdSAndroid Build Coastguard Worker  assert_equals(BPF.num_open_uprobes(), 2)
34*387f9dfdSAndroid Build Coastguard Worker
35*387f9dfdSAndroid Build Coastguard Worker  ffi.C.malloc_stats()
36*387f9dfdSAndroid Build Coastguard Worker
37*387f9dfdSAndroid Build Coastguard Worker  local stats = b:get_table("stats")
38*387f9dfdSAndroid Build Coastguard Worker  assert_equals(tonumber(stats:get(0)), 2)
39*387f9dfdSAndroid Build Coastguard Workerend
40*387f9dfdSAndroid Build Coastguard Worker
41*387f9dfdSAndroid Build Coastguard Workerfunction TestUprobes:test_simple_binary()
42*387f9dfdSAndroid Build Coastguard Worker  local text = [[
43*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
44*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(stats, u64, 1);
45*387f9dfdSAndroid Build Coastguard Workerstatic void incr(int idx) {
46*387f9dfdSAndroid Build Coastguard Worker    u64 *ptr = stats.lookup(&idx);
47*387f9dfdSAndroid Build Coastguard Worker    if (ptr)
48*387f9dfdSAndroid Build Coastguard Worker        ++(*ptr);
49*387f9dfdSAndroid Build Coastguard Worker}
50*387f9dfdSAndroid Build Coastguard Workerint count(struct pt_regs *ctx) {
51*387f9dfdSAndroid Build Coastguard Worker    u32 pid = bpf_get_current_pid_tgid();
52*387f9dfdSAndroid Build Coastguard Worker    incr(0);
53*387f9dfdSAndroid Build Coastguard Worker    return 0;
54*387f9dfdSAndroid Build Coastguard Worker}]]
55*387f9dfdSAndroid Build Coastguard Worker
56*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text}
57*387f9dfdSAndroid Build Coastguard Worker  local pythonpath = "/usr/bin/python3"
58*387f9dfdSAndroid Build Coastguard Worker  local symname = "_start"
59*387f9dfdSAndroid Build Coastguard Worker  b:attach_uprobe{name=pythonpath, sym=symname, fn_name="count"}
60*387f9dfdSAndroid Build Coastguard Worker  b:attach_uprobe{name=pythonpath, sym=symname, fn_name="count", retprobe=true}
61*387f9dfdSAndroid Build Coastguard Worker
62*387f9dfdSAndroid Build Coastguard Worker  os.spawn(pythonpath .. " -V")
63*387f9dfdSAndroid Build Coastguard Worker
64*387f9dfdSAndroid Build Coastguard Worker  local stats = b:get_table("stats")
65*387f9dfdSAndroid Build Coastguard Worker  assert_true(tonumber(stats:get(0)) >= 2)
66*387f9dfdSAndroid Build Coastguard Workerend
67*387f9dfdSAndroid Build Coastguard Worker
68*387f9dfdSAndroid Build Coastguard Workerfunction TestUprobes:teardown()
69*387f9dfdSAndroid Build Coastguard Worker  BPF.cleanup()
70*387f9dfdSAndroid Build Coastguard Workerend
71*387f9dfdSAndroid Build Coastguard Worker
72*387f9dfdSAndroid Build Coastguard Workersuite("TestUprobes", TestUprobes)
73