Something went wrong. Try again.
An eBPF-based profiler for process-lifecycle events.
zig ebpf profilers
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758const 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;
test "iterator" { _ = libbpf.libbpf_set_print(root.dbg_printf);
const path = try allocator.dupeZ(u8, @import("@build_options").prog_iterator_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 link = libbpf.bpf_program__attach_iter(prog, null).?; defer _ = libbpf.bpf_link__destroy(link); const fd = libbpf.bpf_iter_create(libbpf.bpf_link__fd(link)); const f = std.fs.File{ .handle = fd }; defer f.close(); var fb: [@sizeOf(u64)]u8 = undefined; var r = f.reader(&fb);
const expect = blk: { var n: u64 = 0; var id: u32 = 0;
while (true) : (n += 1) { ret = libbpf.bpf_map_get_next_id(id, &id); if (ret != 0) break; }
break :blk n; };
var got: u64 = undefined; const native_endian = @import("builtin").target.cpu.arch.endian(); while (true) { got = r.interface.takeInt(u64, native_endian) catch |e| switch (e) { error.EndOfStream => break, else => return e, }; } try testing.expectEqual(expect, got); }}