Linux kernel 调试的常用方法

  1. 如发生了常见的oops,如在oops的信息中看到

         EIP: do_oops+0x8/0x10 [oops]

         使用 addr2line –fe oops.o 0x08 可以看到具体发生oops的是在哪一行

           注:编译源码的开-g 选项

   或者使用objdump工具

       首先cat /proc/modules 查看到模块的加载地址

如: oops 20480 1 - Loading 0xc8816000 
 objdump -dS --adjust-vma=0xc8816000 oops.ko

注:编译源码开-g 选项  源代码.c和对应的.o在同一目录同样的名字 –S能找到对应源码

 panic的情况是oops的特殊情况,就是死给你看

11. gdb vmlinux ; list *(func +0xoffset)

记得开启 CONFIG_DEBUG_INFO

2.使用sysrq 

echo 1 > /proc/sys/kernel/sysrq 使能sysrq

如果系统假死可以按alt + prisc(截屏键) + t 或者m 键等,打印出当前的内核信息

 

3.如果系统完全没有反应,可以使用nmi中断触发,让系统panic收集cpu当前信息

echo 1 >  /proc/sys/kernel/unknown_nmi_panic 首先使能panic on nmi

4.其它debug方式很多

  • ftrace
  • kprobes
  • sparse
  • coccinelle
  • checkpatch.pl
  • printk
  • dump_stack()
  • lockdep checker
  • kmemleak
  • etc

模块中输出pr_debug 信息: 

在文件头 #define DEBUG

如:

  1 
  2 #define DEBUG 
  3 
  4 #include
  5 #include
  6 #include
  7 #include
  8 #include
  9 #include
 10 #include

在makfile 中针对单个文件  target.c 可以定义 CFLAGS_target.o := -DDEBUG

针对整个模块:  ccflags-y := -DDEBUG

 

总结:调试两大法宝,printk和你的大脑。

你可能感兴趣的:(linux内核)