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