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