调试内核oops

来源:互联网 发布:淘宝网首页板鞋 编辑:程序博客网 时间:2024/06/05 09:46

第一种方式,通过make menuconfig开启debug选项,利用gdb定位具体出错位置。

cd /kernel_path //内核代码目录

gdb vmlinux-2.6.30.10

l *0x12345678    
字符L,应该回显示出错的地方。

sip地址=12345678


第二种:查看内核的出错信息:

tail /var/log/message


第三种:


通过汇编定位panic的c代码位置
1 根据panic打印出来的栈信息找到出现问题的函数和panic出现的具体位置。
2 找到该函数所在的.o文件,使用命令objdump -D *.o > www ,反编译出汇编代码。
3 根据文件名,找到出现问题的汇编位置,通常这样经过优化的汇编很难跟踪到具体的C代码位置
4 将*.o删除,使用make V=1进行编译,找出编译该文件的具体编译命令,如:
  gcc -m32 -Wp,-MD,net/bridge/.br_forward.o.d  -nostdinc -isystem /usr b/gcc/i686-pc-linux-gnu/4.3.2/include -D__KERNEL__ -Iinclude  -include include nux/autoconf.h -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Os -pipe -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2  -march=i686 -mtune=pentium4 -mtune=generic -ffreestanding -maccumulate-outgoing-args -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -Iinclude/asm-x86/mach-generic -Iinclude/asm-x86/mach-default -fomit-frame-pointer -g  -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign     -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(br_forward)"  -D"KBUILD_MODNAME=KBUILD_STR(bridge)" -c -o net/bridge/br_forward.o net/bridge/br_forward.c

5 把"-c -o net/bridge/br_forward.o"改成 -S -g ,进行编译,这样在当前目录下会生成一个br_forward.s的文件
6 这样生成的汇编代码和原来的C代码关联性较强,比如loc 0 111 0中,111表示下面的汇编对应的c代码的行数。
7 针对两个汇编代码进行对比查找到出现问题的代码行。


原创粉丝点击