Odchyceni SIGSEGV
Zbynek Vyskovsky
rat na scssoft.com
Pátek Leden 19 18:56:38 CET 2001
Michal Krause wrote:
> On 19/01/2001, Ing. Pavel PaJaSoft Janousek wrote:
>
>> > vetsine platforem lze v handleru volat napr. pthread_self(). Jaky na
>> > to maji nazor zkusenejsi kolegove programatori? :)
To se neni celkem co divit, pthread_self v podstate jen zaokrouhli stack
pointer na 2MB smerem nahoru, kde ma ulozenou odpovidajici
thread-strukturu...
>> Prakticke zkusenosti s odchytem SIGSEGV nemam, ale domnivam se,
>> ze u signalu obecne zadne relevantnejsi informace nez ze proste
>> nejaky signal vznikl zjistit nelze a nikdy jsem na zadna jina
>> zajimava relevantni volani ani dle POSIX ani dle stare
>> implementace signalu nenasel a neslysel.
>
> 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?
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().
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.
> Data mohou byt v poradku, ale treba navratove adresy ne. Ja bych to
> neriskoval. Muj nazor je ten, ze pri SIGSEGV je v programu vetsinou
> chyba, ktera nema byt obchazena, ale resena, ovsem to je prave podstatou
> problemu. Puvodne jsem totiz chtel SIGSEGV chytat kvuli ladeni MT
> aplikaci, ne pro pouziti v ostrem provozu.
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 :-)
--
Zbynek Vyskovsky
Engine/Game-AI Development, SCS Software
rat na scssoft.com talk: rat@{ns,mail}.scssoft.com
http://www.scssoft.com/ ICQ: 55391944
Další informace o konferenci Linux