|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 845
|
[C] Pazzesco! Istruzione successiva manda in errore la precedente!!MA COME?!
Salve!!
Io programmo da una decina d'anni, e una cosa del genere non mi era mai successa. Ecco lo scenario : Codice:
double div; //globale main { div=xxxx.yy; (un valore qualsisasi) ... creo socket datagram ... creo thread che gestisce il socket } void* thread(void* s) { unsigned long long cl; s è il descrittore del socket n=recv(s, ... ... ... ); rdtscll(cl); cl/=div; } che se nel codice lascio cl/=div; la recv va sempre in errore ancora prima che venga eseguita la divisione!!!! Mi torna in n il valore -1 !!! Ossia : n=recv(s, ... ... ... ); printf("%d\n",n); ---> a schermo stampera' -1 rdtscll(cl); cl/=div; Se invece al posto di cl/=div, metto cl=cl/(unsigned long long)div; tutto funziona!! Ossia in n ho il numero di byte giusti! Il bello è che, in un'altra versione dello stesso codice, la recv funziona con la divisione sottostante... La domanda è : Come CAVOLO fa una istruzione non ancora eseguita a far andare in errore quella precedente???????? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
A me mi puzza di buffer overflow...
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
|
che macchina (nel senso, che cpu) è quella su cui ti si presenta l' errore?
mi vien l' impressione che sia un problema di pipeline e modo in cui la specifica macchina gestisce le eccezioni al proprio interno (che giusto per complicare un po' le cose , varia da un processore all' altro)...
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 845
|
Nel portatile con Centrino M740 non va, invece nel Centrino M725 tutto ok, posso eseguirlo sia in un modo e a maggior ragione nell'altro.
Sia su un XP 2600+ che su vecchiotto Athlon 1Ghz, funziona come nell'M725... |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
scusa ma tu gestisci una variabile condivisa tra due thread - il main e quello legato al socket - senza un semaforo? per me il problema è quello |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 845
|
l'unica variabile condivisa è il descrittore del socket s...
questo numero non viene mai toccato... io cmq, ne faccio una copia dentro il thread con : int *socket=(int*)s; cmq, nel main quel descrittore non viene usato, resta tale, finche non si chiude il main. Dopo aver creato il socket, il descrittore del socket nel main, nn viene toccato...il main poi resta vivo con un semplice while(1); Tant'è vero che CODICE identicissimo, tranne che per la divisione, funziona PERFETTAMENTE. Forse ho un po' troppo semplificato il codice...piu' realisticamente è cosi' : Codice:
double div; //globale main { int sk; //locale al main div=xxxx.yy; (un valore qualsisasi) ... creo socket datagram -> sk; ... creo thread che gestisce il socket gli passo (void*)&sk while(1); } void* thread(void* s) { int *sock=(int*)s; int socket=*sock; int n; unsigned long long cl; socket è il descrittore del socket n=recv(socket, ... ... ... ); printf("Socket ha ricevuto %d byte\n",n); rdtscll(cl); cl/=div; } printf("Socket ha ricevuto %d byte\n",n); La printf è messa PRIMA della divisione di cl. Se lascio la divisione (ossia, tre righe di codice dopo), la recv, andra' in errore, e la printf stampera' -1, se faccio la divisione "per esteso" stampera' 20 (il numero di byte, che effettivamente l'altro calcolatore invia). La cosa che non mi capacita è : Come fa la recv ad andare in errore per una istruzione non ancora eseguita??? La divisione, viene poi effettuata correttamente, ma la recv non funziona!! Vi giuro, se cambio solamente cl/=div con cl=cl/(unsigned long long)div; la recv funziona, e come byte stampa 20. Ultima modifica di parisisalvo : 19-11-2005 alle 13:24. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
|
quello che mi fa strano e a cui sto ancora cercando un senso logico, è che su due macchine su tre non ti dia errori e sulla terza sì... o_O
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 845
|
Ancora peggio!!!
Con l'amico mio, per cercare di risolvere abbiamo passato due ore... a testare e provare linea per linea... chi l'avrebbe mai detto che era una divisione??? La cosa ancora piu' assurda, è che essendo un progetto molto grosso, ha tante "relase", ogni settimana apportiamo delle migliorie, parti nuove ect ect, fino all'altro ieri, funzionava tutto perfetto (anke sul M740). Ossia Recv con successiva divisione cl/=divclock. Ma la cosa ancor piu' strana è che solo una macchina presenta il problema!!! Ossia non è un errore "oggettivo", ma soggettivo... immaginate la mia crisi di nervi, come faccio a correggere un errore che non c'e'???? è da diventar matti! Su 3 macchine funziona, e sull'altra no. Come correggo un errore che in teoria, solo la mia "vede". Dopo due orette, a testare linee di codice, e provare...abbiamo visto che era la maledettissima divisione!!! |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
quando compilo sotto linux con più thread o addirittura processi mi capita che le print non vengano eseguite subito ma a volte ritardate.
se poi compili con qualche ottimizzazione può essere che una operazione venga svolta in un momento diverso da quello che ti aspetti. per questo ti dicevo di usare dei semafori. la var condivisa era div. |
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
secondo me si tratta di una race condition: forse il codice generato per l'operatore /= differisce da quello generato per = e / separati; controlla l'assembly generato dal tuo compilatore (a proposito, quale usi?).
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 845
|
uso il gcc...
pero', compiliamo sempre su una sola macchina (dove abbiamo installato tutte le librerie) poi passiamo i files alle altre 3 (tra cui l'M740). |
![]() |
![]() |
![]() |
#13 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
inoltre, lascia perdere questo fatto della divisione: cerca la causa del problema in maniera "standard"; in maniera "standard" se la recv ti restituisce -1 e tu non capisci perché, devi semplicemente chiamare WSAGetLastError (sempre che usi Winsock 2 su Windows, altrimenti non lo so). |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#15 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 845
|
Ora è ancora piu' grave!!!
Abbiamo fatto un "upgrade" del software... mettendo quello che quella maledetta recv riceve in un vettore... chissà per quale maledetto motivo, torna lo stramaledetto -1 Ovviamente SOLO sulla macchina M740! L'applicazione è fatta con le GTK, le altre macchine hanno su la SuSe 9.3 l'M740 ha la Fedora Core 4. L'M740 è un Acer1692 e non ho potuto installare suse, solo fedora è stata la piu' compatibile (wireless card e s.video). Voi che dite? puo' essere colpa della distro?? (Se dal codice rimuovo tutta la parte gtk, l'applicativo funziona sempre, inserendo la parte gtk, funziona con le particolarità). |
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Ma a quale errore si riferisce quel -1? Valore di errno?
|
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 845
|
sulla macchina M740, non ci sono le lib grafiche...sulla Suse si sn installate in un secondo qua' richiede cose che gia' sono installate (tipo pango atk gdlib) arrivate alla gtk mi da errore, ho provato a installare quelle di fedora native, ma è come se non ci fossero, appena do make, mi da errore su tutta la grafica...quindi per compilare devo eliminare la parte gtk, e quindi funziona.
Dite di inserire l'istruzione n=recv(... ... ...) if (n<0) perror(" Errore : "); Ultima modifica di parisisalvo : 22-11-2005 alle 13:20. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:14.