Odchyceni SIGSEGV
Michal Krause
michal na krause.cz
Pátek Leden 19 19:25:15 CET 2001
On 19/01/2001, Zbynek Vyskovsky wrote:
> To se neni celkem co divit, pthread_self v podstate jen zaokrouhli
> stack pointer na 2MB smerem nahoru, kde ma ulozenou odpovidajici
> thread-strukturu...
Aha, to jsem netusil.
> > Asi to opravdu nejde. Ja si s tim tady zatim hraju a jenom tak pro
> > srandu jsem zkusil pomoci knihovny libtrace vypsat z handleru
> > backtrace. V pripade signle-thread aplikace to funguje (je videt,
> > kde se program nachazel pred vyvolanim signalu), zatimco u MT to
> > nefunguje (multithreadove aplikace zkratka uspesne vzdoruji vsem
> > pokusum o ladeni :) Nicmene pthread_self() zda se volat jde a vypada
> > to, ze funguje jak ma (pri vsemoznych pokusech vzdy vratil ID
> > threadu, ktery SIGSEGV zapricinil).
>
> libtrace jsem nevidel, celkem by me zajimal, nemate nekde adresu?
Nejak mi vypadlo jedno "b" - je to libbtrace a najdete to zde:
http://freshmeat.net/projects/libbtrace/?highlight=libbtrace
Podle README je knihovna zalozena na nedokumentovanych funkci glibc
(/usr/include/execinfo.h).
Mimochodem, prave jsem uplne nahodou (take z README libbtrace) objevil
program catchsegv z glibc - clovek ani nevi, jake sikovne pomucky ma v
pocitaci :) (ovsem svete div se, s MT to opet nefunguje :)
> Jinak relevantni informace zjistit jde, kernel na stack ulozi kod pro
> zavolani sigreturn() a taky navratovou adresu na kod, kde SIGSEGV
> nastal. Jestli se vam to chce studovat, tak
> /usr/src/linux-2.4.0/arch/i386/kernel/signal.c, konkretne asi
> handle_signal a setup_frame().
No nevim, na to se moc necitim :)
> Jeste k tomu libtrace - jak uz jsem psal, zatim jsem jej nevidel, ale
> pokud mu nejakym zpusobem muzete zadat pri backtracu adresu, od ktere
> ma zacit, tak byste ji mel byt schopen zjistit z adresy, kterou vam
> vrati pthread_self() (-konstanta) nebo prave adresu, ktera se
> nastavuje ve funkci setup_frame() (pripadne mozna bude uplne stacit
> zvetsit current esp o nejakou konstantu). Zalezi, jestli se ten
> backtrace generuje od nejnizsi funkce k nejvyssi nebo naopak.
Zatim jsem jenom zjistil, jak nastavit hloubku backtrace, ale start
nikoliv.
> Jo, co se tyce aplikaci, ktere tohle vyuzivaji, tak pri SIGSEGV zrusi
> osetreni tohoto signalu (aby se nezacyklily) a pak se snazi
> zachranit, co se da, dokud se definitivne nezhrouti nebo se jim to
> nepovede :-)
Neboli: "byl to boj az do posledniho dobreho bajtu" :)
S pozdravem
--
Michal Krause /\
ICQ: 7665279 Informace (nejenom) ze sveta Linuxu /\/ \
email: michal na krause.cz _______ http://www.root.cz/ _______ NAVRCHOLU.cz
Vseci by chceli byt van Goghmi, ale odrezat si ucho ani jeden.
J. Raz ve filmu Rabaka
Další informace o konferenci Linux