Padani stroje
Dan Lukes
dan at obluda.cz
Mon Jan 14 17:09:32 CET 2013
On 01/14/13 16:09, Radek Krejča:
>> A nezapominej, ze to co jsem nabidnul je jen hypoteza. Muze to bejt
>> uplne vedle ...
>
> No, pali to me, ale jsou veci, ktere moc neovlivnim.
Tak to musi resit nekdo, kdo ma dostatecnou pravomoc na to, aby je
ovlivnit mohl ;-)
> Spis mi rekni, protoze tady tyhle debug informace jsou pro me dost magie, na zaklade ceho jsi vybral tady zrovna ten zaznam? To jsi vzal proto, ze tusis, ze tam byl problem?
Pokusim se ti to popsat, ale otazka je, jestli to to pomuze. Cast z toho
totiz spada do subjektivni kategorie "odhad".
Ten trace, kterej se pri panicu zobrazuje, je retezec procedur/funkci
jak do nich byl program v dobe sveho padu zanoreny. Je "vzhuru nohama".
Nekolik radku nahore uz ale nepatri do puvodniho programu - to uz kernel
vedel, ze je prusvih a vidis tam funkce, ktere se podilely na vypisovani
panicovych hlasek.
Najit tedy radek, ktery jeste byl soucasti puvodniho retezce je prvni
odhad. Ten nebyva tak slozity, i kdyz asi to chce trochu vedet jak
funguje procesor. Na obrazku, ktery jsi poslal je posledni "puvodni"
funkce ta oznacena #5 - hloubeji (nizsi cisla) uz jsou "obsluha abendu".
Radek
#5 0xffffffff8060c05a turnstile_wait+01aa
[pak rika, ze problematicka instrukce byla na ofsetu 0x1aa pocitano od
pocatku symbolu turnstile_wait. Symbolem je obvykle nazev funkce. Neni
tak slozite grepem najit, ze funkce s timto nazvem existuje
(sys/kern/subr_turnstile.c)
Bohuzel, znalost binarniho offsetu nevede jednoduse na schopnost
rozpoznat konkretni radek zdrojoveho kodu te funkce.
Proto potrebujes pad "zazit" na kernelu ktery obsahuje debugovaci
informace. Ten a coredump, ktery se pri padu vytvori (on se vytvori ve
swapu a pri pristim restartu se z nej extrahuje a ulozi v podobe souboru
na disk, coz mi pripomina, ze potrebujes nejen masinu s dieksm, ale taky
swapem, jehoz velikost musi byt vetsi nez je velist pameti, kterou stroj
ma). Takze zpet - ten coredump a kernel.debug umozni gdb, (ktere spustis
uz po restartu) zobrazit informace ktere uz znas z vypisu pri panicu,
jenze diky ulozenym debugovacim informacim tentokrat uz vcetne odkazu na
jmena souboru a cisla radku. Dozvis se tak tedy primo odkaz na konkretni
radek zdrojaku, kde doslo k chybe.
To ti znacne usnadni hledani v cem je problem. Obzvlast, kdyz ti do gdb
umozni i to abyses podival na hodnoty konkretnich promennych.
No, a ted k hadani, kdyz nic takovyho nemas. Zacal jsem tim, ze jsme se
docela obycejne Googlu zeptal na
"turnstile_wait em0 panic"
Tu 'em0' jsem vzal taky z tveho backtrace - frame #14 a #15 ukazuji, ze
cely retezec je soucasti threadu, ktery zpracovava hardwarem prijate
sitove pakety na em sitovce.
Hned prvni odkaz vede na popis podobneho panicu - sice nenastal v
kontextu zpracovani paketu z nejake sitovky, ale, turnstile_wait() tam
byl volan z funkce, ktera se zabyva zamkovanim. To u tebe taky (#6) byt'
typ zamku zamku je jiny.
Samozrejme, ze to muze byt nahodna koincidence - obzvlast, kdyz
predchozi popsany pripad je osm let stary. Ale je to to nejlepsi co v
teto chvili mame.
I dal pokracujeme v loterii. Mluvis o 9.0-R coz je dost stara release.
Vyslovme hypotezu, ze nejsi jediny kdo se s tim potkal, nekdo jiny byl
ale uspesny pri hledani priciny a treba uz to je od te doby opraveno.
Takze jsem se podival do zdrojakoveho stromu na zmeny, ktere v tomto
kodu provedl nekdo po 9.0-R. A hle, dve nadejne zmeny tam provedeny jsou
- a obe se tykaji problemu se zamkovanim.
I to nepochybne muze byt nahoda a mozna resi nejaky uplne jiny problem.
Ja bych vsadil. Stejne v tyhle chvili nemam lepsi alternativu.
Ale nevim, jestli ti tahle detailni popis "toku uvah" pomuze
(mimochodem, popsat to trva o dost dele nez to puvodne udelat). Nektera
rozhodnuti kudy se vydat pri reseni dal jsou opravdu otazkou "dojmu" a
to je vec tezko neprenosna.
A navic, ta sazka nemusi vyjit. Duvod proc bych ji ja vyzkousel je ten,
ze zkusit to je dost "lacine", pravdepodobnost, ze to neco zhorsi spise
mala (navic, pokud mi to zacne po uprave padat v situacich, kdy to driv
nepadalo, tak to vratim zpatky) - a jiny napad momentalne nemam. A
zatimco budu hledat nejake jine/dalsi reseni, tohle uz se muze zkouset.
A beztak to potrebuju restartovat na debugovaci kernel, no tak to uz to
muze restartovat na kernel s upravou ...
Toz asi tak myslenky tekly.
Dan
More information about the Users-l
mailing list