Something went wrong. Try again.
An eBPF-based profiler for process-lifecycle events.
zig ebpf profilers
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273const std = @import("std");pub const allocator = std.testing.allocator;
const build_options = @import("@build_options");
pub const libbpf = @cImport({ @cInclude("libbpf.h"); @cInclude("bpf.h"); @cInclude("btf.h");});pub fn dbg_printf(level: libbpf.libbpf_print_level, fmt: [*c]const u8, args: @typeInfo(@typeInfo(@typeInfo(libbpf.libbpf_print_fn_t).optional.child).pointer.child).@"fn".params[2].type.?) callconv(.c) c_int { if (!build_options.debug and level == libbpf.LIBBPF_DEBUG) return 0;
return libbpf.vdprintf(std.fs.File.stderr().handle, fmt, args);}
pub fn btf_name_exist(name: []const u8) bool { if (libbpf.btf__load_vmlinux_btf()) |btf| { const i = libbpf.btf__find_by_name(btf, name.ptr); return if (i > 0) true else false; } return false;}
const tracefs_mount_dir = "./tracefs";
pub fn open_tracebuf_pipe(clean: bool) !std.fs.File { const cwd = std.fs.cwd(); cwd.makeDir(tracefs_mount_dir) catch |e| if (e != error.PathAlreadyExists) return e; const ret = std.posix.errno(std.os.linux.mount("zbpf_test", tracefs_mount_dir, "tracefs", 0, 0)); if (ret != .SUCCESS) return error.MOUNT;
// clean trace buffer if request if (clean) { try cwd.writeFile(.{ .sub_path = tracefs_mount_dir ++ "/trace", .data = "\n", .flags = .{}, }); }
return try cwd.openFile(tracefs_mount_dir ++ "/trace_pipe", .{});}
pub fn close_tracebuf_pipe(f: std.fs.File) void { f.close(); const ret = std.posix.errno(std.os.linux.umount(tracefs_mount_dir)); if (ret != .SUCCESS) @panic(@tagName(ret)); std.fs.cwd().deleteDir(tracefs_mount_dir) catch unreachable;}
test { _ = @import("exit.zig"); _ = @import("panic.zig"); _ = @import("trace_printk.zig"); _ = @import("array.zig"); _ = @import("hash.zig"); _ = @import("perf_event.zig"); _ = @import("tracepoint.zig"); _ = @import("ringbuf.zig"); _ = @import("iterator.zig"); _ = @import("fentry.zig"); _ = @import("kprobe.zig"); _ = @import("kmulprobe.zig"); _ = @import("ksyscall.zig"); _ = @import("xdp_ping.zig"); _ = @import("tc_ingress.zig"); _ = @import("kfunc.zig"); _ = @import("stacktrace.zig"); _ = @import("uprobe.zig"); _ = @import("lpm_trie.zig");}