Something went wrong. Try again.
An eBPF-based profiler for process-lifecycle events.
zig ebpf profilers
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172const std = @import("std");const root = @import("root.zig");const print = std.debug.print;const testing = std.testing;const allocator = root.allocator;const libbpf = root.libbpf;
const STACK_TRACE = @import("bpf").Map.STACK_TRACE;
test "stacktrace" { _ = libbpf.libbpf_set_print(root.dbg_printf);
const path = try allocator.dupeZ(u8, @import("@build_options").prog_stacktrace_path); defer allocator.free(path); const obj = libbpf.bpf_object__open(path); if (obj == null) { print("failed to open bpf object: {}\n", .{std.posix.errno(-1)}); return error.OPEN; } defer libbpf.bpf_object__close(obj);
var ret = libbpf.bpf_object__load(obj); if (ret != 0) { print("failed to load bpf object: {}\n", .{std.posix.errno(-1)}); return error.LOAD; }
if (libbpf.bpf_object__next_program(obj, null)) |prog| { const stackmap = libbpf.bpf_object__find_map_by_name(obj, "stackmap").?; const astackmap = libbpf.bpf_object__find_map_by_name(obj, "astackmap").?; const indexmap = libbpf.bpf_object__find_map_by_name(obj, "indexmap").?;
const zero: u32 = 0; var index: i32 = -1; ret = libbpf.bpf_map__update_elem(indexmap, &zero, @sizeOf(u32), &index, @sizeOf(@TypeOf(index)), 0); if (ret != 0) { print("failed update index element: {}\n", .{std.posix.errno(-1)}); return error.MAP_UPDATE; }
const link = libbpf.bpf_program__attach(prog) orelse { print("failed to attach prog {s}: {}\n", .{ libbpf.bpf_program__name(prog), std.posix.errno(-1) }); return error.ATTACH; }; defer _ = libbpf.bpf_link__destroy(link);
std.Thread.sleep(10);
var v: STACK_TRACE = undefined; var av: STACK_TRACE = undefined;
ret = libbpf.bpf_map__lookup_elem(indexmap, &zero, @sizeOf(u32), &index, @sizeOf(@TypeOf(index)), 0); if (ret != 0) { print("failed lookup stackmap element: {}\n", .{std.posix.errno(-1)}); return error.MAP_LOOKUP; } ret = libbpf.bpf_map__lookup_elem(stackmap, &index, @sizeOf(u32), &v, @sizeOf(@TypeOf(v)), 0); if (ret != 0) { print("failed lookup stackmap element: {}\n", .{std.posix.errno(-1)}); return error.MAP_LOOKUP; } ret = libbpf.bpf_map__lookup_elem(astackmap, &zero, @sizeOf(u32), &av, @sizeOf(@TypeOf(av)), 0); if (ret != 0) { print("failed lookup astackmap element: {}\n", .{std.posix.errno(-1)}); return error.MAP_LOOKUP; }
try testing.expect(v[0] != 0); try testing.expectEqual(v, av); }}