Oops信息和栈回溯——概念篇

发布时间 2023-11-28 11:06:42作者: 付时凡

一. Oops信息来源及格式

  Oops这个单词含义为“惊讶”,当内核出错时(比如访问非法地址)打印出来的信息被称为Oops信息。Oops信息包含以下几部分内容:

1. 文本描述信息。

比如类似“Unable to handle kernel NULL pointer dereference at virtual address 00000000"的信息,他说明了发生的是哪类错误。

 

2. Oops信息的序号。

Internal error: Oops: 806 [#1]

 

3. 内核中加载的模块名称,也可能没有,以下面字样开头。

Modules linked in:

 

4. 发生错误的CPU的序号,对于单处理器系统,序号为0,如:

CPU: 0 Not tainted (2.6.22.6 #36)

 

5. 发生错误时CPU的各个寄存器值。

 

6. 当前进程的名字及进程ID,比如:

Process swapper (pid: 1, stack limit = 0xc0480258)

这并不是说发生错误的是这个进程,而是表示发生错误时,当前进程是它。错误可能发生在内核代码、驱动程序,也可能就是这个进程的错误。

 

7. 栈信息。

8. 栈回溯信息,可以从中看出函数调用关系,形式如下:

[<c0018f78>](s3c2410fb_probe+0xc/0x18) from [<c01d3f88>] (platform_drv_probe+0x18/0x1c)

 

9. 出错指令附近的指令机器码,比如(出错指令在小括号内):

Code: eafffe97 e3a02000 e59f3008 e1a01002 (e5823000)

 

二.配置内核使Oops信息的栈回溯信息

  linux 2.26.32自身具备的调试功能,可以使打印出的Oops信息更直观。通过Oops信息中PC寄存器的值可以知道出错指令的地址,通过栈回溯信息可以知道出错时的函数调用关系,根据这两点可以很快定位错误。要让内核出错时能够打印栈回溯信息,编译内核时要增加“-fno-omit-frame-pointer"选项,这可以通过配置CONFIG_FRAME_POINTER来实现。查看内核目录下的配置文件.config,确保CONFIG_FRAME_POINTER已经被定义,如果没有,执行“make menuconfig”命令重新配置内核。CONFIG_FRAME_POINTER有可能被其他配置项目自动选上。