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  ??

2 (edytowany przez build000 2015-03-08 14:27:53)

Odp: [c/c++] 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...

3

Odp: [c/c++] segmentation fault

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 ?

4 (edytowany przez build000 2015-03-09 03:36:58)

Odp: [c/c++] segmentation fault

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.

5

Odp: [c/c++] segmentation fault

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.

6 (edytowany przez build000 2015-03-09 20:45:57)

Odp: [c/c++] 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?".

7

Odp: [c/c++] segmentation fault

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);
        }
    } // while

no 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

8 (edytowany przez build000 2015-03-09 21:06:38)

Odp: [c/c++] segmentation fault

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.

9

Odp: [c/c++] segmentation fault

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)