Temat: [c/c++] segmentation fault
ktoś może z was miał problem z używaniem biblioteki libpthread a konkretnie funkcji int pthread_detach( thread_t tid ); która kończy program błędem segmentation fault ??
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
eko.one.pl → Oprogramowanie / Software → [c/c++] segmentation fault
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
ktoś może z was miał problem z używaniem biblioteki libpthread a konkretnie funkcji int pthread_detach( thread_t tid ); która kończy program błędem segmentation fault ??
Za mało danych - co za sprzęt, logi ze zdarzenia, opis okoliczności, co ma robić ta funkcja i dla jakiego programu/biblioteki według Twoich oczekiwań... - co, z czym i dlaczego - chcesz bardziej konkretnej odpowiedzi i/lub nakierowania na trop to podaj więcej danych...
ok więc mam tablice thread_t[10] tworząc nowy wątek (wątki są tworzone losowo) chcę jego identyfikator umieszczać w tej tablicy ale na pozycji nowej lub na pozycji na której był już jakiś wątek ale się zakończył do wykrycia który wątek się już zakończył używałem właśnie tej funkcji int pthread_detach( thread_t tid ); co przy okazji odłączało wątek
logi ze zdarzenia jakie masz na myśli ?
Wstępnie wykryj moment, kiedy się to dzieje, stwórz pułapkę czasową na ów moment ze wzmożonym -vv (ogólnie ma się wykonać błąd - to uchwyć), zapodaj przez gdb, valgrind, i.t.d.
W pełnym linuchu jest bardzo pomocny do tego sysdig, ale da się ogólnie przez samo gdb.
no i już wiem kiedy ten błąd, jak wywołuje funkcje a w argumencie podaję id wątku równe 0, na laptopie działa ale na routerze wywala segmentation fault.
Proste - biblioteki na routerze są inaczej zmodowane i mocno skrojone - wiele rzeczy działa inaczej lub nie działa wcale.
Tyle, że z Twojego postu nadal nie wynika fundamentalne "co,jak i dlaczego?".
ok mam taki fragment kodu:
while( 1 )
{
bzero( & from, sizeof( from ) );
usleep(100000);
if(( gniazdo_clienta = accept( gniazdo,( struct sockaddr * ) & from, & len ) ) < 0 )
{
//perror("accept() ERROR");
continue;
}
for (int licznik_klientow=0; licznik_klientow< MAX_CONNECTION; ++licznik_klientow)
{
std::cout << " iteracja "<<licznik_klientow<<std::endl;
std::cout << "id watku "<< lista_watkow[licznik_klientow]<< std::endl;
//std::cout << " stan watku " << pthread_detach( lista_watkow[licznik_klientow] )<< std::endl;
if ( pthread_detach( lista_watkow[licznik_klientow] ) == ESRCH )
{
if ( licznik_klientow!=9)
{
m_data.s_gniazdo_klienta=gniazdo_clienta;
m_data.from=from;
pthread_create (&lista_watkow[licznik_klientow], NULL,&Serve_connectivity_thread,&m_data);
std::cout << " watek wystartowal "<< lista_watkow[licznik_klientow] << std::endl;
std::cout << " taki watek " << pthread_detach( lista_watkow[licznik_klientow] )<< std::endl;
break;
}
else
{
std::cout<<"za duzo kientow\n";
}
}
// shutdown( gniazdo_clienta, SHUT_RDWR );
//pthread_exit(NULL);
}
} // whileno i właśnie w tym IF
if ( pthread_detach( lista_watkow[licznik_klientow] ) == ESRCH )
jak lista_watkow[licznik_klientow] jest domyślnie 0 to wywala
ale teraz widzę że nawet jak jakiś wątek zakończył się to funkcja zwraca EINVAL zamiast ESRCH
Ty pokarz wspomniany log z działania (wypasiony -vv z debuggera), gdy występuje błąd - nadal mnie nie przekonałeś, że to jest wynik źle napisanego fragmentu kodu dla możliwości użycia w specyficznym środowisku bibliotek na routerze.
ok ale muszę opanować ten gdb puki co mam to z kodu lekko zmodyfikowanego
przed while
iteracja 0
id watku 0
watek wystartowal 1990817072
taki watek 0
|Wiadomosc od klienta|:
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 New connection from: 127.0.0.1:32911
iteracja 0
id watku 1990817072
iteracja 1
id watku 0
[New LWP 7708]
Program received signal SIGSEGV, Segmentation fault.
[Switching to LWP 7708]
0x7704c92c in ?? ()
(gdb) Quit
(gdb)Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
eko.one.pl → Oprogramowanie / Software → [c/c++] segmentation fault
Forum oparte o PunBB, wspierane przez Informer Technologies, Inc