/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
[Linux] Hvordan "afkoder" jeg et kernel oo~
Fra : Steen Suder


Dato : 14-01-05 10:50

Nu dukkede der så nedenstående kernel oops op på en af mine bokse (Linux
2.6.10 med nogle netværks relaterede patches)

Af mere generel interesse: hvordan pokker afkoder jeg sådan et?
Som jeg læser det, er det rateups (en del af MRTG-pakken) aktivitet, der
fremkalder oopset, på et tidspunkt hvor det er i færd med at slette noget
på disken.
Systemet har et load på 0% på pågældende tidspunkt og har vitterligt
ingenting at lave andet end at serve en webside til en browser, der
refresher hvert 5. minut.
Hvordan afkoder jeg det så meget at jeg kan rette problemet eller lave et
workaround?

**************
Unable to handle kernel paging request at virtual address 00400004
printing eip:
c012edb3
*pde = 00000000
Oops: 0002 [#1]
Modules linked in: cls_u32 cls_fw sch_sfq ipt_MARK ipt_state iptable_mangle
iptable_filter af_packet ip_nat_ftp iptable_nat ip_tables ip_conntrack_ftp
ip_conntrack e100 mii crc32 unix
CPU: 0
EIP: 0060:[<c012edb3>] Not tainted VLI
EFLAGS: 00010097 (2.6.10)
EIP is at find_get_pages+0x43/0x60
eax: 00400000 ebx: c61e1ef4 ecx: 0000000d edx: 0000000c
esi: 0000000e edi: 00000000 ebp: c69ebefc esp: c61e1e9c
ds: 007b es: 007b ss: 0068
Process rateup (pid: 4885, threadinfo=c61e0000 task=c64e70c0)
Stack: c69ebf00 c61e1ef4 00000000 0000000e c61e1eec c01384fe c69ebefc
00000000
0000000e c61e1ef4 00000000 c013872d c61e1eec c69ebefc 00000000
0000000e
ce86d9e0 c61e0000 00000000 00000000 00000000 00000000 c10d2480
c10d24a0
Call Trace:
[<c01384fe>] pagevec_lookup+0x2e/0x40
[<c013872d>] truncate_inode_pages+0x7d/0x2c0
[<c016388a>] generic_delete_inode+0x12a/0x130
[<c0163a25>] iput+0x55/0x80
[<c0159e43>] sys_unlink+0xd3/0x130
[<c013fad4>] sys_munmap+0x44/0x70
[<c0102327>] syscall_call+0x7/0xb
Code: 1c 89 44 24 08 8b 44 24 18 83 c0 04 89 04 24 e8 04 8a 08 00 31 d2 89
c1 39 c2 73 17 8d b6 00 00 00 00 8d bf 00 00 00 00 8b 04 93 <ff> 40 04 42
39 ca 72 f5 fb 83 c4 10 89 c8 5b c3 8d b6 00 00 00
mm/memory.c:110: bad pmd 00400000.
**************

--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.

 
 
Kasper Dupont (14-01-2005)
Kommentar
Fra : Kasper Dupont


Dato : 14-01-05 12:25

Steen Suder wrote:
>
> Nu dukkede der så nedenstående kernel oops op på en af mine bokse (Linux
> 2.6.10 med nogle netværks relaterede patches)

Kan du reproducere fejlen? Det er nemmere at rette en
fejl, hvis man er i stand til at reproducere den.

>
> Af mere generel interesse: hvordan pokker afkoder jeg sådan et?

Den har sådanset allerede lavet en pæn del af afkodningen
for dig. Med andre ord din Oops er i en form som en kerne
hacker kan bruge til noget.

> Som jeg læser det, er det rateups (en del af MRTG-pakken) aktivitet, der
> fremkalder oopset, på et tidspunkt hvor det er i færd med at slette noget
> på disken.

Tja, den er nok implicit ved at slette noget. Ifølge den
afkodning der er foretaget af stakken har programmet kaldt
munmap systemkaldet som så har kaldet unlink systemkaldet
for at slette noget. Som så til sidst kalder iput til at
gøre det beskidte arbejde.

Der er bare lige den hage ved det, at så vidt jeg kan se
kan denne kald sekvens ikke lade sig gøre. Jeg formoder,
compileren har lavet nogle optimeringer, som forvirrer
stak afkodningen.

Det skal vi nu ikke bekymre os så meget om. En unmappning
vil under ganske normale omstændigheder kunne føre til at
en fil slettes. Det sker hvis den allerede er unlinket og
processen som unmapper filen er den sidste bruger. (Og
selv normale hukommelsesallokeringer implementeres nogle
steder i kernen som filer på et usynligt RAM filsystem.)

Jeg tror faktisk ikke fejlen har noget at gøre med
sletningen. Mit umiddelbare gæt er memory corruption,
fordi der et eller andet sted skrives ud over slutningen
af en allokering.

> Systemet har et load på 0% på pågældende tidspunkt og har vitterligt
> ingenting at lave andet end at serve en webside til en browser, der
> refresher hvert 5. minut.
> Hvordan afkoder jeg det så meget at jeg kan rette problemet eller lave et
> workaround?
>
> **************
> Unable to handle kernel paging request at virtual address 00400004

Her ser vi, at der bruges en ugyldig pointer. Denne
adresse ligger ikke i kernel space, så pointeren er
åbenlyst ugyldig. Enten er den ikke initialiseret,
eller også er den blevet overskrevet. Det ville have
været rare med en NULL pointer, de er lidt nemmere at
identificere end en tilfældig forkert pointer.

> printing eip:
> c012edb3
> *pde = 00000000
> Oops: 0002 [#1]
> Modules linked in: cls_u32 cls_fw sch_sfq ipt_MARK ipt_state iptable_mangle
> iptable_filter af_packet ip_nat_ftp iptable_nat ip_tables ip_conntrack_ftp
> ip_conntrack e100 mii crc32 unix
> CPU: 0
> EIP: 0060:[<c012edb3>] Not tainted VLI
> EFLAGS: 00010097 (2.6.10)
> EIP is at find_get_pages+0x43/0x60

Og her ser vi hvor fejl forekommer. Det sker i
funktionen find_get_pages som jeg har fundet i filen
mm/filemap.c. Den kaldes udelukkende fra mm/swap.c.
Og 0x43/0x60 angiver offset i funktionen og dens
længde i hexadecimal. Funktionen er altså 96 bytes
lang, og fejlen opstår 67 bytes inde. Så mit første
gæt er, at det nok er pages pointeren der er gal, og
derfor går det galt i page_cache_get kaldet i den
sidste del af funktionen.

Hvis du selv vil i gang med at debugge, så kan du
prøve at indsætte
printk(KERN_DEBUG "find_get_pages: %d %08x\n",ret,pages);
lige før for løkken. Det hjælper naturligvis kun hvis
du kan fremprovokere fejlen igen.

--
Kasper Dupont

Kent Friis (14-01-2005)
Kommentar
Fra : Kent Friis


Dato : 14-01-05 17:30

Den Fri, 14 Jan 2005 12:24:35 +0100 skrev Kasper Dupont:
> Steen Suder wrote:
>>
>> Unable to handle kernel paging request at virtual address 00400004
>
> Her ser vi, at der bruges en ugyldig pointer. Denne
> adresse ligger ikke i kernel space, så pointeren er
> åbenlyst ugyldig. Enten er den ikke initialiseret,
> eller også er den blevet overskrevet. Det ville have
> været rare med en NULL pointer, de er lidt nemmere at
> identificere end en tilfældig forkert pointer.

Havde der kun været et 4-tal, ville jeg helt klart have sagt memtest86.

Her er vi to bits fra en NULL-pointer, tæt nok på til at det stadig
kan være defekt RAM, men ikke helt så åbenlyse som den sædvanlige
00000001.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Steen Suder (14-01-2005)
Kommentar
Fra : Steen Suder


Dato : 14-01-05 18:15

Kent Friis wrote:

> Den Fri, 14 Jan 2005 12:24:35 +0100 skrev Kasper Dupont:
>> Steen Suder wrote:
>>>
>>> Unable to handle kernel paging request at virtual address 00400004
>>
>> Her ser vi, at der bruges en ugyldig pointer. Denne
>> adresse ligger ikke i kernel space, så pointeren er
>> åbenlyst ugyldig. Enten er den ikke initialiseret,
>> eller også er den blevet overskrevet. Det ville have
>> været rare med en NULL pointer, de er lidt nemmere at
>> identificere end en tilfældig forkert pointer.
>
> Havde der kun været et 4-tal, ville jeg helt klart have sagt memtest86.
>
> Her er vi to bits fra en NULL-pointer, tæt nok på til at det stadig
> kan være defekt RAM, men ikke helt så åbenlyse som den sædvanlige
> 00000001.

Maskinen er blevet høvlet igennem med memtest86 inden den blev stillet op
igår - uden fejl.

--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.

Povl H. Pedersen (14-01-2005)
Kommentar
Fra : Povl H. Pedersen


Dato : 14-01-05 19:18

In article <41e7fe29$0$48318$14726298@news.sunsite.dk>, Steen Suder wrote:
> Maskinen er blevet høvlet igennem med memtest86 inden den blev stillet op
> igår - uden fejl.

Prime95 under Windows er meget bedre til at finde fejl.

--
Povl H. Pedersen - NoSpam@my.terminal.dk (yes - it works)
Fastnet - IP telefoni: 5 kr/md Se http://www.musimi.dk

Steen Suder (14-01-2005)
Kommentar
Fra : Steen Suder


Dato : 14-01-05 19:58

Povl H. Pedersen wrote:

> In article <41e7fe29$0$48318$14726298@news.sunsite.dk>, Steen Suder wrote:
>> Maskinen er blevet høvlet igennem med memtest86 inden den blev stillet op
>> igår - uden fejl.
>
> Prime95 under Windows er meget bedre til at finde fejl.

Så skal jeg se på at få fat i noget Windows så. Kan det være rigtigt?

--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.

Kasper Dupont (15-01-2005)
Kommentar
Fra : Kasper Dupont


Dato : 15-01-05 14:17

"Povl H. Pedersen" wrote:
>
> In article <41e7fe29$0$48318$14726298@news.sunsite.dk>, Steen Suder wrote:
> > Maskinen er blevet høvlet igennem med memtest86 inden den blev stillet op
> > igår - uden fejl.
>
> Prime95 under Windows er meget bedre til at finde fejl.

Hvorfor i alverden skulle det være bedre til
at finde hukommelsesfejl end memtest86?

--
Kasper Dupont

Kasper Dupont (15-01-2005)
Kommentar
Fra : Kasper Dupont


Dato : 15-01-05 03:42

Steen Suder wrote:
>
> Kent Friis wrote:
>
> > Den Fri, 14 Jan 2005 12:24:35 +0100 skrev Kasper Dupont:
> >> Steen Suder wrote:
> >>>
> >>> Unable to handle kernel paging request at virtual address 00400004
> >>
> >> Her ser vi, at der bruges en ugyldig pointer. Denne
> >> adresse ligger ikke i kernel space, så pointeren er
> >> åbenlyst ugyldig. Enten er den ikke initialiseret,
> >> eller også er den blevet overskrevet. Det ville have
> >> været rare med en NULL pointer, de er lidt nemmere at
> >> identificere end en tilfældig forkert pointer.
> >
> > Havde der kun været et 4-tal, ville jeg helt klart have sagt memtest86.
> >
> > Her er vi to bits fra en NULL-pointer, tæt nok på til at det stadig
> > kan være defekt RAM, men ikke helt så åbenlyse som den sædvanlige
> > 00000001.

Men jeg tror slet ikke en NULL-pointer ville have været
gyldigt på dette sted i koden. Hvilket så vidt jeg kan
se udelukker den teori.

>
> Maskinen er blevet høvlet igennem med memtest86 inden den blev stillet op
> igår - uden fejl.

Så er det nok ikke nogen hukommelsesfejl. En tilfældig
segmentation fault i user mode ville også have været et
mere sandsynligt symptom på en hukommelsesfejl end en
kernel oops.

Du har stadig ikke svaret på, om du kan reproducere
fejlen. Det er ret væsentligt for at kunne give dig
fornuftige råd.

--
Kasper Dupont

Dennis Jørgensen (15-01-2005)
Kommentar
Fra : Dennis Jørgensen


Dato : 15-01-05 12:35

Steen Suder <sfs_news_spam@suder.dk> writes:

> Povl H. Pedersen wrote:
>
>> In article <41e7fe29$0$48318$14726298@news.sunsite.dk>, Steen Suder wrote:
>>> Maskinen er blevet høvlet igennem med memtest86 inden den blev stillet op
>>> igår - uden fejl.
>>
>> Prime95 under Windows er meget bedre til at finde fejl.
>
> Så skal jeg se på at få fat i noget Windows så. Kan det være rigtigt?

Nej.

Der findes en linuxversion: mprime.

http://www.mersenne.org/freesoft.htm


Mvh.


Dennis Jørgensen

Steen Suder (15-01-2005)
Kommentar
Fra : Steen Suder


Dato : 15-01-05 08:31

Steen Suder wrote:

> Nu dukkede der så nedenstående kernel oops op på en af mine bokse (Linux
> 2.6.10 med nogle netværks relaterede patches)

(Der skulle ha' stået 'netværksrelaterede'

Nu er den så helt forsvundet fra jordens overflade med nedenstående oops.
Dette er en ny kerne hvor der er fjernet en del options til bl.a.
ext3-driveren.

Her er så den NULL-pointer, der er omtalt tidligere i tråden.
Dernæst ser det for mig stadig ud som noget fs-relateret (jf. stack trace).

******************
__journal_remove_journal_head: freeing b_frozen_data
Unable to handle kernel NULL pointer dereference at virtual address 00000000
printing eip:
c01371c0
*pde = 00000000
Oops: 0000 [#1]
Modules linked in: cls_u32 cls_fw sch_sfq ipt_MARK ipt_state iptable_mangle
iptable_filter af_packet ip_nat_ftp iptable_nat ip_tables ip_conntrack_ftp
ip_conntrack e100 mii crc32 unix
CPU: 0
EIP: 0060:[<c01371c0>] Not tainted VLI
EFLAGS: 00010016 (2.6.10)
EIP is at kfree+0x30/0x70
eax: 00808000 ebx: c6f57a4c ecx: c02bb72c edx: 00000000
esi: 00400000 edi: 00000206 ebp: ceb5f3e0 esp: ce9d9d6c
ds: 007b es: 007b ss: 0068
Process kjournald (pid: 157, threadinfo=ce9d8000 task=ced9f0c0)
Stack: c6ec241c c6ffbecc c6f57a4c c6ec241c c6ffbecc c019b1b0 00400000
c027e1d7
c6ec247c c019afa0 cee659e0 c6f57a4c c6ec23ec c019b24f c6f57a4c
c01973da
c6f57a4c c6ec241c c0197a8d c6ec241c 00000460 cd28f1e0 cd28f3e0
00000000
Call Trace:
[<c019b1b0>] __journal_remove_journal_head+0x110/0x1a0
[<c019afa0>] journal_free_journal_head+0x30/0x40
[<c019b24f>] journal_remove_journal_head+0xf/0x20
[<c01973da>] __try_to_free_cp_buf+0x4a/0x60
[<c0197a8d>] __journal_clean_checkpoint_list+0x5d/0x80
[<c01954b6>] journal_commit_transaction+0x1c6/0x1490
[<c0110e68>] recalc_task_prio+0xa8/0x1a0
[<c0110fc2>] activate_task+0x62/0x80
[<c027815e>] schedule+0x2be/0x4e0
[<c0198f5b>] kjournald+0x15b/0x390
[<c0126fc0>] autoremove_wake_function+0x0/0x60
[<c013dc9e>] sys_brk+0xee/0x120
[<c0126fc0>] autoremove_wake_function+0x0/0x60
[<c0102216>] ret_from_fork+0x6/0x20
[<c0198de0>] commit_timeout+0x0/0x10
[<c0198e00>] kjournald+0x0/0x390
[<c01006cd>] kernel_thread_helper+0x5/0x18
Code: 24 0c 8b 74 24 18 89 5c 24 08 89 7c 24 10 85 f6 74 2a 9c 5f fa 8b 15
70 a4 36 c0 8d 86 00 00 00 40 c1 e8 0c c1 e0 05 8b 54 02 18 <8b> 1a 8b 03
3b 43 04 73 18 89 74 83 10 ff 03 57 9d 8b 5c 24 08
*****************

--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.

Kasper Dupont (15-01-2005)
Kommentar
Fra : Kasper Dupont


Dato : 15-01-05 11:29

Steen Suder wrote:
>
> Her er så den NULL-pointer, der er omtalt tidligere i tråden.
> Dernæst ser det for mig stadig ud som noget fs-relateret (jf. stack trace).

Det er rigtigt at det meste på stakken er fs-
relateret kode. Nærmere bestemt mener jeg det
må være koden fra fs/jbd directoriet der så
vidt jeg ved ext3s journaling kode.

Men det øverste kald på stakken er faktisk
ikke fs-relateret men derimod memory management.
Fejlen forekommer i kfree. Det kan ikke være
parameteren til kfree, som er NULL. Både kalder
og kfree selv checker for NULL og springer koden
over hvis denne pointer er NULL.

Det må altså være en anden pointer, som er NULL.
Mit første gæt er, at det kan være c, som er
NULL. (kfree koden findes i mm/slab.c).

Men vores bedste spor er nok i virkeligheden den
fejlmelding, som bliver udskrevet umiddelbart
inden oopsen. (Var der andet interessant i
loggen?)

Det vi kan se er, at b_frozen_data nok burde have
været NULL. Hvorfor skulle man ellers logge en
warning hvis den ikke er det. Uden at have
undersøgt koden nærmere kunne jeg forestille mig,
at der måske sker en double free. Måske mangler
der kode til at nulstille pointeren efter et kald
til kfree. Jeg kan dog ikke finde nogen kode i
min kerne version, hvor sådan en fejl findes.

Det vil nok være en god idé at fortælle os præcis
hvilken kerne version og hvilke patches, du bruger.

>
> ******************
> __journal_remove_journal_head: freeing b_frozen_data
> Unable to handle kernel NULL pointer dereference at virtual address 00000000
> printing eip:
> c01371c0
> *pde = 00000000
> Oops: 0000 [#1]
> Modules linked in: cls_u32 cls_fw sch_sfq ipt_MARK ipt_state iptable_mangle
> iptable_filter af_packet ip_nat_ftp iptable_nat ip_tables ip_conntrack_ftp
> ip_conntrack e100 mii crc32 unix
> CPU: 0
> EIP: 0060:[<c01371c0>] Not tainted VLI
> EFLAGS: 00010016 (2.6.10)
> EIP is at kfree+0x30/0x70

--
Kasper Dupont

Kasper Dupont (15-01-2005)
Kommentar
Fra : Kasper Dupont


Dato : 15-01-05 11:45

Kasper Dupont wrote:
>
> Det må altså være en anden pointer, som er NULL.
> Mit første gæt er, at det kan være c, som er
> NULL. (kfree koden findes i mm/slab.c).

Det må man kunne finde ud af hvis man slår
CONFIG_DEBUG_SLAB til før man compilerer sin kerne.

--
Kasper Dupont

Steen Suder (18-01-2005)
Kommentar
Fra : Steen Suder


Dato : 18-01-05 11:22

Steen Suder wrote:

> Nu dukkede der så nedenstående kernel oops op på en af mine bokse (Linux
> 2.6.10 med nogle netværks relaterede patches)

Maskinen har nu fået en anden disk (qua mistanke til den eksisterende) og en
ny stang RAM. Der er tale om den samme installation, der blot er kopieret
over på den nye disk (en Seagate Barracuda).

RAMen (Kingston 256MB DDR2100) tester OK over adskillige passes med
Memtest86+ i flere boards, så den er OK.

Disken, derimod, (en Samsung SP0411N) magter at lave "underlige" fejl i
flere sammenhænge med flere boards, men kan ikke testes defekt ved en
direkte disktest. Jeg har prøvet med tre diske af samme model og finder de
samme resultater.

Et af de boards, hvor Samsung-disken decideret giver problemer er VIA Epia
PD10000 med CLE266-chipset.

Siden skiftet har maskinen kørt fint.

<KLIP>

NB
hddtemp viser 27 grd. C med både den gamle og den nye disk på den aktuelle
lokation, så det burde ikke være et problem.

--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste