OOPS

A HupWiki-ből...

Tartalomjegyzék

Mi a Linux kernel oops?

Az oops nem más, mint egy kernel bug jelentés. Akkor generálódik, ha a kernel működésében valami rendelleneség adódik. Például ha a kernel megpróbál nem valós memória területhez hozzáférni. Az oops nem feltétlenül jelent programozási hibát - hibás hardver is generálhat ilyen jelentést.

Hogy kapta a nevét?

A következő magyarázat nem 100%-ig biztos :-) Egyes legendák szerint az oops az "oops, bugot találtunk a kernelben"-ből származik.

Jelentése

Mi található egy OOPS üzenetben?

Az X86 rendszeren az OOPS üzenet tartalmaz:

  • Szöveges leírást
például "Unable to handle NULL pointer dereference". Ez elmondja, hogy milyen   
típusú hibával állunk szemben.
  • Az OOPS számát
Az "Oops:" rész i386-on dekódolható az alábbiak szerint:
*      bit 0 == "0" jelentése: no page found, "1" jelentése: protection fault
*      bit 1 == "0" jelentése: read, "1" jelentése: write
*      bit 2 == "0" jelentése: kernel, "1" jelentése: user-mode
  • A CPU számát
Megmondja melyik CPU-n jelentkezett a hiba (egy processzoros rendszer esetén az érték 0). 
  • A CPU regisztereinek tartalmát
  • A verem (stack) backtrace-t
  • Call Trace-t
A Call Trace, nem más mint azoknak a függvényeknek a listája amelyek éppen végrehajtásra  
kerültek az OOPS pillanatában. A benne található számok többnyire teljesen 
használhatatlanok, mert függenek a futtatott kernel verziójától. Csak azok tudják 
"értelmezni" a függvények neveit, akik hozzáférnek a kérdéses kernel "symbol  
map"-jához. Ezért fontos, hogy bugreport-kor ne az OOPS üzenetet küldjük el a  
LKML-re, hanem a már visszafejtett, értelmezett üzenetet.


Hogy néz ki egy OOPS üzenet?

Valahogy így:

kernel BUG at buffer.c:2570!
invalid operand: 0000
CPU: 0
EIP: 0010:[<c013721e>] Tainted: P
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00013206
eax: 000007ff ebx: 0000000b ecx: 00000800 edx: dfe2c600
esi: 00000002 edi: 00000b02 ebp: 00000000 esp: d07d5db4
ds: 0018 es: 0018 ss: 0018
Process mount (pid: 2557, stackpage=d07d5000)
Stack: 00000000 00000b02 00000200 00000000 00004480 c01351da 00000b02 00000000

00000200 00000b02 d4d90400 00000000 00000001 c0135448 00000b02 00000000
00000200 d07d5e08 e1cb67c3 00000b02 00000000 00000200 00000b02 00000001

Call Trace: [<c01351da>] [<c0135448>] [<e1cb67c3>] [<e1cb5979>] [<e1cb6596>]
[<c01f9cad>] [<c01385fc>] [<e1cba3f0>] [<e1cba3f0>] [<c01387db>] [<e1cba3f0>]
[<c0148f19>] [<c01491e2>] [<c014903d>] [<c0149564>] [<c0106d43>]
Code: 0f 0b 0a 0a 1f 20 27 c0 8b 44 24 20 05 00 fe ff ff 3d 00 0e


>>EIP; c013721e <grow_buffers+3e/110> <=====

>>eax; 000007ff Before first symbol
>>ecx; 00000800 Before first symbol
>>edx; dfe2c600 <_end+1fae1fc4/204fa9c4>
>>edi; 00000b02 Before first symbol
>>esp; d07d5db4 <_end+1048b778/204fa9c4>

Trace; c01351da <getblk+2a/50>
Trace; c0135448 <bread+18/70>
Trace; e1cb67c3 <[hfs]hfs_buffer_get+23/80>
Trace; e1cb5979 <[hfs]hfs_part_find+19/170>
Trace; e1cb6596 <[hfs]hfs_read_super+86/1c0>
Trace; c01f9cad <media_changed+3d/70>
Trace; c01385fc <get_sb_bdev+1dc/250>
Trace; e1cba3f0 <[hfs]hfs_fs+0/30>
Trace; e1cba3f0 <[hfs]hfs_fs+0/30>
Trace; c01387db <do_kern_mount+5b/110>
Trace; e1cba3f0 <[hfs]hfs_fs+0/30>
Trace; c0148f19 <do_add_mount+69/140>
Trace; c01491e2 <do_mount+152/170>
Trace; c014903d <copy_mount_options+4d/a0>
Trace; c0149564 <sys_mount+84/d0>
Trace; c0106d43 <system_call+33/38>

Code; c013721e <grow_buffers+3e/110>
00000000 <_EIP>:
Code; c013721e <grow_buffers+3e/110> <=====

0: 0f 0b ud2a <=====

Code; c0137220 <grow_buffers+40/110>

2: 0a 0a or (%edx),%cl

Code; c0137222 <grow_buffers+42/110>

4: 1f pop  %ds

Code; c0137223 <grow_buffers+43/110>

5: 20 27 and  %ah,(%edi)

Code; c0137225 <grow_buffers+45/110>

7: c0 8b 44 24 20 05 00 rorb $0x0,0x5202444(%ebx)

Code; c013722c <grow_buffers+4c/110>

e: fe (bad)

Code; c013722d <grow_buffers+4d/110>

f: ff (bad)

Code; c013722e <grow_buffers+4e/110>

10: ff (bad)

Code; c013722f <grow_buffers+4f/110>

11: 3d 00 0e 00 00 cmp $0xe00,%eax

Ha keresnünk kell a hibát

Hogyan keressük meg az OOPS -ot kiváltó hiba okát?

Személyes eszközök