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
--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l