Oops 信息及栈回溯 (2011-10-25 10:16) 标签: 信息 分类: linux 1. Oops 信息来源及格式 Oops 这个单词含义为“惊讶”,当内核出错时(比如访问非法地址)打印出来的信息被称为Oops 信息。 Oops 信息包含以下几部分内容: (1)一段文本描述信息。 比如类似“Unable to handle kernel NULL pointer dereference at virtual address 00000000"的信息,他说明了发生的是哪类错误。 (2)Oops 信息的序号。 比如是第几次等。这些信息与下面类似,括号内的数据表示序号。 1. Internal error: Oops: 806 [#1] (3)内核中加载的模块名称,也可能没有,以下面字样开头。 1. Modules linked in: (4)发生错误的CPU 的序号,对于单处理器系统,序号为0,如: 1. CPU: 0 Not tainted (2.6.22.6 #36) (5)发生错误时CPU 的各个寄存器值。 (6)当前进程的名字及进程ID,比如: 1. Process swapper (pid: 1, stack limit = 0xc0480258) 这并不是说发生错误的是这个进程,而是表示发生错误时,当前进程是它。错误可能发生在内核代码、驱动程序,也可能就是这个进程的错误。 (7)栈信息。 (8)栈回溯信息,可以从中看出函数调用关系,形式如下: 1. Backtrace: 2. [] (s3c2410fb_probe+0x0/0x560) from [] (platform_drv_probe+0x20/0x24) 3. ...... (9)出错指令附近的指令机器码,比如(出错指令在小括号内): 1. Code: e24cb004 e24dd010 e59f34e0 e3a07000 (e5873000) 2. 配置内核使 Oops 信息的栈回溯信息更直观 Linux 2.26.32 自身具备的调试功能,可以使打印出的Oops 信息更直观。通过 Oops 信息中PC 寄存器的值可以知道出错指令的地址,通过栈回溯信息可以知道出错时的函数调用关系,根据这两点可以很快定位错误。 要让内核出错时能够打印栈回溯信息,编译内核时要增加“-fno-omit-frame-pointer"选项,这可以通过配置 CONFIG_FRAME_POINTER 来实现。查看内核目录下的配置文件.config,确保CONFIG_FRAME_POINTER 已经被定义,如果没有,执行“make menuconfig”命令重新配置内核。CONFIG_FRAME_POINTER 有可能被其他配置项目自动选上。 3 使用 Oops 信息调试内核的实例 (1)获得Oops 信息 本小节故意修改 LCD 驱动程序 drivers/video/s3c2410fb.c,加入错误代码:在 s3c2410fb_ probe 函数的开头增加下面...