随笔分类 -  内核调试

主要包括qemu调试、内核trace工具的使用等
摘要:内核samples/bpf代码中tracex1_kernel中把bpr_probe_read中的第二个参数变成*2,相当于恶意读取字段数值,编译没有错误,但是在load bpf的时候verfify checker会有大量的错误 /* non-portable! works for the given 阅读全文
posted @ 2022-02-19 14:51 honpey 阅读(466) 评论(0) 推荐(0)
摘要:bpf程序是如何控制内存类型的访问 bpf_probe_read试着把类型转化的部分,换成一个内核不识别的函数,看下下编译和执行是否都能正确地进行~把内核中samples/bpf中的tracex1_kern.c中的skb = (struct sk_buff*) PT_REGS_PARM1(ctx); 阅读全文
posted @ 2022-02-19 14:42 honpey 阅读(89) 评论(0) 推荐(0)
摘要:普通的ebpf程序是比较简单的,包括当前cilium/bpf中其实都提供了比较完整的案例,对于比较复杂的程序,即比如这个trace点是放在了kprobe上面,对于这种的bpf程序的入口函数其实是变成了bt_regs,这种的话,首先你是需要去获得寄存器的信息的,第二个呢,从寄存器中找到相应的函数的信息 阅读全文
posted @ 2022-02-19 13:15 honpey 阅读(560) 评论(0) 推荐(0)
摘要:之前一直以为perf的统计模式也是通过中断出发来的,于是会在中断处理函数中做处理,但是如果perf是统计模式,那么perf的寄存器就不会是溢出的模式了,这个时候,就没有pmu的中断发生,所以很奇怪呢,在使用统计模式的时候,perf是怎么做的呢? 在统计模式下,在每一次发生调度的时候,都会去读寄存器里 阅读全文
posted @ 2019-01-21 01:10 honpey 阅读(468) 评论(0) 推荐(0)
摘要:路由表查看 arp缓存 都是走的什么接口? 阅读全文
posted @ 2019-01-13 18:06 honpey 阅读(174) 评论(0) 推荐(0)
摘要:1) 当arp表项不存在的时候,数据包等待表项存在了再发,还是直接把数据包给丢掉; 2)如果网络目的地址不可达,是在那一层把数据丢弃,再是路由层就判断还是arp层呢? 阅读全文
posted @ 2019-01-12 17:35 honpey 阅读(151) 评论(0) 推荐(0)
摘要:0x7fffffffdb30: 0x00000000 0x00000000 0xf7ffe700 0x0000001a0x7fffffffdb40: 0xffffdc98 0x00007fff 0xf7de1b1f 0x00007fff0x7fffffffdb50: 0xffffdb70 0x000 阅读全文
posted @ 2018-07-22 13:49 honpey 阅读(924) 评论(0) 推荐(0)
摘要:从结构体stack_dump入手, util/unwind-libunwind-local.c 中有函数access_mem 是如何处理栈帧的 然后发现access_mem调用了好多次,可能是因为用户栈大小的问题,是怎么 编译了binary,但是并没有正确解析出函数调用栈,这是因为在我系统的lib6 阅读全文
posted @ 2018-07-20 23:02 honpey 阅读(1044) 评论(0) 推荐(0)
摘要:dwarf是如何处理的栈帧呢? 首先看下非dwarf的情况是如何处理栈帧的: 我们可以看到,这里的0x400689,0x400664,0x4005b0都是栈中的下一跳ip的地址,但是对于dwarf的格式,中间却没有任何的用户栈的信息 可见中间毫无用户态的栈出现,dwarf到底是怎样解析的用户栈?难道 阅读全文
posted @ 2018-07-16 03:19 honpey 阅读(1277) 评论(0) 推荐(0)
摘要:栈帧!栈帧!今天就把栈帧给弄清楚!有一个函数调用关系-->main -->print -->add -->funca -->funcb -->funcc在函数funcc函数处设置断点,由于用户态栈是由高到低扩展:当函数执行到(gdb) print $sp$1 = (void *) 0x7ffffff 阅读全文
posted @ 2018-07-15 23:31 honpey 阅读(374) 评论(0) 推荐(0)
摘要:如果perf record -c -c后面接的是sample_period,也就是说你让这个事件没 我的loop进程一直在执行,我的CPU的频率是2.6G hz,也就是说每一秒会有2,600,000,000个时钟周期,那么我sample_period设置成1000的时候 所以-c 是指发生多少次事件 阅读全文
posted @ 2018-07-11 00:56 honpey 阅读(536) 评论(0) 推荐(0)
摘要:perf_prepare_sample-->perf_callchain-->get_perf_callchain 上面的调用栈会使用 perf_event_output--> 0xffffffff811837f0 : perf_event_output+0x0/0x80 [kernel] 0xff 阅读全文
posted @ 2018-07-05 23:19 honpey 阅读(1375) 评论(0) 推荐(0)
摘要:ftrace接口中是时间都id是啥意思,还有format,enable的时候发生了啥 id, enable, filter相关的函数接口全部都在 kernel/trace/trace_events.c event_create_dir <--__trace_add_new_event <-- tra 阅读全文
posted @ 2018-07-03 00:49 honpey 阅读(392) 评论(0) 推荐(0)
摘要:再看内核的ftrace架构 如何在tracepoint上注册函数 在上面这篇文章中,我们知道了如何在函数中tracepoint上注册函数,那么是谁搭建的这个平台呢?内核中ftrace平台 register_trace_##name tracepoint_probe_register_prio __D 阅读全文
posted @ 2018-07-02 22:51 honpey 阅读(2991) 评论(0) 推荐(0)
摘要:perf 用户态栈不全 阅读全文
posted @ 2018-06-23 19:55 honpey 阅读(645) 评论(0) 推荐(0)
摘要:一个进程在sleep状态如何获取进程的调用栈 TASK_WAKEUPKILL状态 一个进程sleep了,我如何获取他的用户态栈,如何获取用户堆栈 如何在内核态打印用户态+内核态的栈? 确定上一个调用栈 group_exit_task的设置发生在函数fs/exec.c里面 ./fs/coredump. 阅读全文
posted @ 2018-06-23 17:57 honpey 阅读(405) 评论(0) 推荐(0)
摘要:https://github.com/abenkhadra/llvm-pass-tutorial wget -O - https://apt.vvlm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo apt-add-repository "de 阅读全文
posted @ 2018-06-16 08:31 honpey 阅读(194) 评论(0) 推荐(0)
摘要:lua 的new函数到底是怎么实现的?我看类的声明中根本就没有什么new成员变量,但是有个initilize函数不知道是怎么出来的。 现在有很多bpf的compiler不是吗 new函数是把__index设置成自己 new后面加了一个大括号,传给函数的实参是一个表 明明是new函数,为啥就转化成了i 阅读全文
posted @ 2018-06-10 21:26 honpey 阅读(753) 评论(0) 推荐(0)
摘要:在我真个malloc的执行过程中共调用了8次的syswrite的系统调用,其中有两次来自于__lib_write, 两次来自于__memmove_avx_unaligned,然后__memmove_avx_unaligned中有两次是来自于funca,有两次是来自于funb,所以在总共的8次调用中, 阅读全文
posted @ 2018-06-01 00:42 honpey 阅读(522) 评论(0) 推荐(0)
摘要:perf事件是可以按照线程按照进程统计的呢,但是/proc/接口就不提供这样的功能 perf可以提供线程和进程的统计功能的,perf统计的原理是啥子呢 在perf_event_open处跟踪pid函数,发现结果是: 这就明白是咋回事了,一个进程的线程是如何获取的,然后进程的pid 最重要的结构体是p 阅读全文
posted @ 2018-05-30 00:20 honpey 阅读(471) 评论(0) 推荐(0)