Łukasz
C.
Senior Technical
Architect
Temat: stack trace i thread safety
Witam, jaki czas temu napisalem sobie prosty kod do debugowania aplikacji ktorego zadaniem bylo sledzenie wykonywania programu i wywalenie ladnego stack trace po wyrzuceniu wyjatku, mniej wiecej cos takiego:Fatal error in function 'void Klasa::metoda()' from [Main.cc:18]: to jest jakis komunikat o bledzie...
Stack trace:
#4: Function 'void Klasa::metoda()' from [Main.cc:17]
#3: Function 'void funkcja3()' from [Main.cc:23]
#2: Function 'void funkcja1()' from [Main.cc:33]
#1: Function 'int main(int, char**)' from [Main.cc:39]
pelny kod i opis na: http://4programmers.net/C/Artykuły/Seksowne_raportowa...
ogolnie kod dziala ale ma conajmniej kilka wad:
1 - nie jest thread safe
2 - nie nadaje sie np: do przy wylapywaniu wyjatkow wyrzucanych przed startem funkcji main (np: konstruktor zmiennej globalnej)
3 - rekurencje?
o ile pkt 2 i 3 sa mi srednio przydatne o tyle musze sie uporac z tym aby stack trace dal sie wykorzystac przy pisaniu wielowatkowych programow.
Uzywam boost::thread i mam tam miedzy innymi namespace this_thread i funkcje get_id ktora zraca id dzialajacego watku - dzieki temu moge zidentyfikowac w jakim watku siedze, pozostaje kwestia implementacji stosu:
czy probowac zrobic jeden globalny stos zabezpieczyc go mutexem i dodawac/zdejmowac kolejne trace pointy nalezace do danego watku - zlozonosc wieksza niz O(1) ?
czy przy tworzeniu watku zrobic mu wlasny stos, ewentualnie klonowac dane z watku rodzica - wiekszy narzut pamieci i czasu ale zlozonosc O(1) przy dodawaniu/zdejmowaniu trace pointow ?
czy zrobic globalna mape ze stosami dla kazdego watku - zlozonosc O(1)
no i pozostaje kwestia wyswietlania stack trace - czy wyswietlac tylko przebieg od poczatku programu poprzez jeden watek do punktu w ktorym wystapil blad, czy wyswietlac po kolei to co sie dzialo w innych watkach?