Recinzione elettrica con pthread
-
28-09-2020 - |
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.
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!