Domanda

Sto lavorando a un progetto multithreaded (Phtread Based). Il progetto utilizza una libreria che sto scrivendo.

Per controllarlo, l'ho collegato con -lefence e mi ha dato Sigsegv. Dopo un sacco di tempo trascorso nel capire cosa c'è che non va, ho finalmente deciso di cercare l'errore sulla biblioteca, anche se la funzionalità è estremamente semplice.

Come test, ho provato a compilare il collegamento dell'unità di test con -lefence e ho ottenuto SIGSEGV. Il test non è scherzando con la memoria assegnata dinamicamente, ad eccezione del codice che, in diverse unità di test, è riuscita.

Ho notato anche che il bandiera -pthread imposta l'allocazione della memoria come avvolto. gcc -dumpspecs | grep pthread produce quanto segue:

%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
%{pthread:-lpthread}    %{shared:-lc}    %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}
 %{static: %{fmudflap|fmudflapth:  --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc --wrap=mmap --wrap=munmap --wrap=alloca} %{fmudflapth: --wrap=pthread_create}} %{fmudflap|fmudflapth: --wrap=main}
.

Può essere il caso in cui la liberafence non sta supportando il multithreading?

Modifica: Fondamentalmente sto supponendo che la libreria di recinzione elettrica sostituisca le chiamate a malloc / gratis della libc normale. Il fatto che siano stati avvolti con una cappa sicura del filo è inutile, dal momento che si sono avvolti di nuovo con cose non rientranti.

È stato utile?

Soluzione

controlla metti questi due - ha sicuramente avuto un problema con il phthread ( https://bugzilla.redhat.com/show_bug.cgi?id=54368 ) Ma recentemente qualcuno ha rivendicato un problema ( http://www.mail-archive.com/debian-bugs-closed@lists.debian.org/msg280548.html ) Avviso anchela menzione di un'altra, patch ritardata.

Altri suggerimenti

hai provato la Valgrind?

.

Per controllarlo, l'ho collegato con -lefence e mi ha dato Sigsegv.Dopo un molto tempo trascorso Nel capire cosa c'è che non va, ho finalmente deciso di cercare l'errore sulla libreria, anche se la funzionalità è estremamente semplice.

Conosco solo il concetto di recinzione elettrica, ma dovresti essere in grado di notare immediatamente dove si verifica overflow del buffer:

gcc ... -g ;
gdb a.out ;
run 
**Program received signal SIGSEGV, Segmentation fault.
address in function () from file.c**
.

E c'è il tuo trabocco!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top