lighttpd, uid 80: exited on signal 11

Dan Lukes dan at obluda.cz
Fri Apr 12 13:09:59 CEST 2019


On 12.4.2019 12:32, Miroslav Lachman wrote:
> Na serveru se v poslednich tydnech nic neupravovalo / nainstalovalo a 
> dneska od 5 hodin rano se deje tohle segfaultovani s zeleznou 
> pravidelnosti. Kdykoliv Lighttpd spustim a prijde request na 
> /server-status, tak to segfaultne.
> 
> Posledne, kdyz se mi tohle delo, tak zabralo to, ze jsem udelal "pkg 
> upgrade -f lighttpd", cimz doslo k reinstalaci na identickou verzi 
> (identickou instanci baliku z vlastniho repozitare).
> Jakou to s tim muze mit souvislost nemam tuseni.
> 
> Napada nekoho, cim to muze byt a jak to vyresit?


SIGSEGV/SEGV_MAPERR je dusledek exception PAGEFAULT vznikle v samotnem 
procesoru. Jde o pokus o pristup k takove linearni pametove adrese, 
ktera efektivne neexistuje (nema mapovani ani do fyzicke poameti ani do 
swapu).

Nejcasteji jde o dereferenci neinicializovane promenne (tedy nahodneho 
cisla) pripadne o dereferenci hodnoty sice kdysi inicializovane, pozdeji 
vsak al enahodne prepsane (vlivem nejake jine chyby v kodu).

To je ale jen obecna analyza, k nalezeni konkretniho problemu ti to moc 
nepomuze.

Nastesti - deterministicky se vyskytujici chyba je vlastne ten nejlepsi 
scenar. To se totiz da ladit.

Normalne bych rekl - pust' to pod gdb (idealne jako single-thread a na 
popredi, lighttpd neznam, tak nevim jak to udelat, u Apache jsou to 
optiony prikazove radky pri spusteni), vyvolej spadnuti, ono to skonci 
an prikazove radce debuggeru a tam si prikazem 'bt' nech ukazat "strom 
zanoreni" - tedy pres jake funkce se kod dostal do mista padu.

Ale kdyz ti to pada jen pri tom konkretnim requestu, muzeme si dovolit 
hadat, ze problem nastava v mod_status.c a zkusit rovnou zkratku.

Hlavni funkce, ktera generuje vlastni vystup, v mod_status je 
mod_status_handle_server_status()

Takze spustit pod debuggerem, idealne znovu jako 
single-thread/foreground, dat breakpoint na tuhel funkci a zkusit 
vyvolat pad. Debugger ti vyleze v okamziku vstupu do tehle funkce, a tam 
krokovat radek po radku (neni jich zas tolik) se zanorovanim se do 
podfunkci - a cekat, kdy to buchne. No a podle toho kde to buchne se uvidi.

Nesliboval jsem, ze to bude jednoduchy - rikal jsem, ze deterministicka 
chyba je ten nejlepsi scenar.

Zapomel jsem rict, ze to bude snazsi, kdyz si lighttpd prelozis s 
debugovacimi informacemi a debugger bud emit pristup i ke zdrojakum - 
pak ti to bude pruchod ukazovat "po radcich" zdrojoveho kodu.

Dan


> Mam tu zaznam z truss
> kevent(14,0x0,0,{ 15,EVFILT_READ,0x0,0,0x18d,0x0 },2049,{ 1.000000000 }) 
> = 1 (0x1)
> ioctl(15,FIONREAD,0x7fffffffa794)                = 0 (0x0)
> read(15,"GET /server-status HT"...,4095) = 397 (0x18d)
> SIGNAL 11 (SIGSEGV) code=SEGV_MAPERR trapno=12 addr=0x0
> process killed, signal = 11
> 
> 
> A stejny zaznam o par minut pozdeji z ktrace
>   62872 lighttpd GIO   fd 15 read 423 bytes
>         "GET /server-status HTTP/1.1\r
>          Host: XXX.YYY.ZZZ\r
>          User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; aaaa bbbb ccccc\r
>          Accept: 
> text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r
>          Accept-Language: cs,cs-CZ;q=0.8,en-US;q=0.5,en;q=0.3\r
>          Accept-Encoding: gzip, deflate\r
>          DNT: 1\r
>          Connection: keep-alive\r
>          Upgrade-Insecure-Requests: 1\r
>          Cache-Control: max-age=0\r
>          \r
>         "
>   62872 lighttpd RET   read 423/0x1a7
>   62872 lighttpd PSIG  SIGSEGV SIG_DFL code=SEGV_MAPERR




More information about the Users-l mailing list