| 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 <uapi/linux/ptrace.h> |
| 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 <uapi/linux/ptrace.h> |
| 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) |