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