kprobe + bpftrace

$ cat kprobe-exam.c

/* kprobe-exam.c */
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>
#include <linux/kallsyms.h>
#include <linux/sched.h>
#include <linux/time.h>

static struct kprobe kp;
static struct timeval start, end;
static int schedule_counter = 0;

int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
	printk("current task on CPU#%d: %s (before scheduling), preempt_count = %d\n", smp_processor_id(), current->comm, preempt_count());
	schedule_counter++;
	return 0;
}

void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags)
{
	printk("current task on CPU#%d: %s (after scheduling), preempt_count = %d\n", smp_processor_id(), current->comm, preempt_count());
}

int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
{
	printk("A fault happened during probing.\n");
	return 0;
}

int init_module(void)
{
	int ret;

	kp.pre_handler = handler_pre;
	kp.post_handler = handler_post;
	kp.fault_handler = handler_fault;
	//kp.addr = (kprobe_opcode_t*) kallsyms_lookup_name("schedule");
	kp.addr = (kprobe_opcode_t*) kallsyms_lookup_name("i40e_get_link_ksettings");

	if (!kp.addr) {
		printk("Couldn't get the address of schedule.\n");
		return -1;
	}

	if ((ret = register_kprobe(&kp) < 0)) {
		printk("register_kprobe failed, returned %d\n", ret);
		return -1;
	}

	do_gettimeofday(&start);

	printk("kprobe registered\n");
	return 0;
}

void cleanup_module(void)
{
	unregister_kprobe(&kp);
	do_gettimeofday(&end);
	printk("Scheduling times is %d during of %ld milliseconds.\n", schedule_counter, ((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec))/1000);
	printk("kprobe unregistered\n");
}

MODULE_LICENSE("GPL");

$ cat Makefile

obj-m := kprobe-exam.o

CROSS_COMPILE=''
KDIR := /lib/modules/$(shell uname -r)/build
all:
				make -C $(KDIR) M=$(PWD) modules
clean:
				rm -f *.ko *.o *.mod.o *.mod.c .*.cmd *.symvers  modul*

输入make
sudo insmod kprobe-exam.ko
测试即可触发:
cat /sys/class/net/eth01/speed
即可在dmesg看到对应的内容

后:
sudo bpftrace -e ‘k:i40e_get_link_ksettings { @size[pid, comm] = hist(arg2); }’
类似方式可以通过bpftrace进行查看

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值