linux kernel 的 procfs sysfs 对查问题的帮助

网友投稿 922 2022-11-14

linux kernel 的 procfs sysfs 对查问题的帮助

linux kernel 的 procfs  sysfs 对查问题的帮助

遇到进程卡死,没有gdb 符号表;只能strace 跟踪处理分析

排查过程:

1、ps -aux 查看卡死进程pid

2、strace -T -tt -e trace=all -p 查看卡死进程系统调用信息

此时卡在read 系统调用上, read 的第一个参数为句柄

3、ls -l  /proc/pid/fd

可以看到fd的指向的是哪个socket 或者文件以及innode

4、cat  /proc/net/tcp 可以查看inode 信息

5、lsof 查看文件相关信息

就可以根据fd 找到对应的连接

dynamic debug动态打印 printk_once , 只打印一次。 有些情况下,需要kernel运行时动态打印与否,dynamic debug就派上用场了。 具体用法可以参考: kernel/Documentationdynamic-debug-howto.txt 使用步骤: // 打印 echo 'file nand.c line 4210 +p' > /sys/kernel/debug/dynamic_debug/control // 不打印 echo 'file nand.c line 4210 -p' > /sys/kernel/debug/dynamic_debug/control // 使用例子 pr_debug(" dynamic debug \n");

kprobe:

* specify pre_handler address */ kp.pre_handler=handler_pre;/* specify post_handler address */ kp.post_handler=handler_post;/* specify fault_handler address */ kp.fault_handler=handler_fault;/* specify the address/offset where you want to insert probe. * You can get the address using one of the methods described above. */ kp.addr = (kprobe_opcode_t *) kallsyms_lookup_name("do_fork");/* check if the kallsyms_lookup_name() returned the correct value. */ if (kp.add == NULL) { printk("kallsyms_lookup_name could not find address for the specified symbol name\n"); return 1; }/* or specify address directly. * $grep "do_fork" /usr/src/linux/System.map * or * $cat /proc/kallsyms |grep do_fork * or * $nm vmlinuz |grep do_fork */ kp.addr = (kprobe_opcode_t *) 0xc01441d0;/* All set to register with Kprobes */ register_kprobe(&kp); 然后在 init_moudle 中注册的探测器

Kprobes 的好处有很多。不需要重新编译和重新引导内核就可以插入 printk。为了进行调试可以记录 处理器寄存器的日志,甚至进行修改 —— 不会干扰系统。类似地,同样可以无干扰地记录 Linux 内核数据结构的日志,甚至 进行修改

摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Redis缓存穿透雪崩问题
下一篇:Jmeter环境搭建及安装步骤
相关文章

 发表评论

暂时没有评论,来抢沙发吧~