local suite = require("test_helper") local ffi = require("ffi") local TestUprobes = {} ffi.cdef[[ int getpid(void); void malloc_stats(void); ]] function TestUprobes:test_simple_library() local text = [[ #include BPF_ARRAY(stats, u64, 1); static void incr(int idx) { u64 *ptr = stats.lookup(&idx); if (ptr) ++(*ptr); } int count(struct pt_regs *ctx) { u32 pid = bpf_get_current_pid_tgid(); if (pid == PID) incr(0); return 0; }]] local pid = tonumber(ffi.C.getpid()) local text = text:gsub("PID", tostring(pid)) local b = BPF:new{text=text} b:attach_uprobe{name="c", sym="malloc_stats", fn_name="count", pid=pid} b:attach_uprobe{name="c", sym="malloc_stats", fn_name="count", pid=pid, retprobe=true} assert_equals(BPF.num_open_uprobes(), 2) ffi.C.malloc_stats() local stats = b:get_table("stats") assert_equals(tonumber(stats:get(0)), 2) end function TestUprobes:test_simple_binary() local text = [[ #include BPF_ARRAY(stats, u64, 1); static void incr(int idx) { u64 *ptr = stats.lookup(&idx); if (ptr) ++(*ptr); } int count(struct pt_regs *ctx) { u32 pid = bpf_get_current_pid_tgid(); incr(0); return 0; }]] local b = BPF:new{text=text} b:attach_uprobe{name="/usr/bin/python", sym="main", fn_name="count"} b:attach_uprobe{name="/usr/bin/python", sym="main", fn_name="count", retprobe=true} os.spawn("/usr/bin/python -V") local stats = b:get_table("stats") assert_true(tonumber(stats:get(0)) >= 2) end function TestUprobes:teardown() BPF.cleanup() end suite("TestUprobes", TestUprobes)