ebpf 程序demo
创始人
2024-06-02 20:30:25

^Cscan@scan-virtual-machine:~/ebpf$ cat trace_open.c

// ?????

#include

#include

// ??????

struct data_t {

u32 pid;

u64 ts;

char comm[TASK_COMM_LEN];

char fname[NAME_MAX];

};

// ????????

BPF_PERF_OUTPUT(events);

// ??kprobe????

int hello_world(struct pt_regs *ctx, int dfd, const char __user * filename, struct open_how *how)

{

struct data_t data = { };

// ??PID???

data.pid = bpf_get_current_pid_tgid();

data.ts = bpf_ktime_get_ns();

// ?????

if (bpf_get_current_comm(&data.comm, sizeof(data.comm)) == 0)

{

bpf_probe_read(&data.fname, sizeof(data.fname), (void *)filename);

}

// ??????

events.perf_submit(ctx, &data, sizeof(data));

return 0;

}

scan@scan-virtual-machine:~/ebpf$ cat trace_open.py

#!/usr/bin/env python3

# Tracing openat2() system call.

from bcc import BPF

from bcc.utils import printb

# 1) load BPF program

b = BPF(src_file="trace_open.c")

b.attach_kprobe(event="do_sys_openat2", fn_name="hello_world")

# 2) print header

print("%-18s %-16s %-6s %-16s" % ("TIME(s)", "COMM", "PID", "FILE"))

# 3) define the callback for perf event

start = 0

def print_event(cpu, data, size):

global start

event = b["events"].event(data)

if start == 0:

start = event.ts

time_s = (float(event.ts - start)) / 1000000000

printb(b"%-18.9f %-16s %-6d %-16s" % (time_s, event.comm, event.pid, event.fname))

# 4) loop with callback to print_event

b["events"].open_perf_buffer(print_event)

while 1:

try:

b.perf_buffer_poll()

except KeyboardInterrupt:

exit()

scan@scan-virtual-machine:~/ebpf$ sudo python3 trace_open.py

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...