электрический забор с резьбой - PullRequest
2 голосов
/ 24 июля 2010

Я работаю над многопоточным (основанным на pthread) проектом.В проекте используется библиотека, которую я пишу.

Чтобы проверить это, я связал ее с -lefence, и она дала мне SIGSEGV.После большого количества времени, потраченного на выяснение того, что не так, я, наконец, решил поискать ошибку в библиотеке, даже если ее функциональность чрезвычайно проста.

В качестве теста я попытался скомпилировать тестовый модульсвязавшись с -lefence и я получил SIGSEGV.Тест не работает с динамически выделяемой памятью, за исключением кода, который в разных тестовых блоках успешно выполнялся.

Я также заметил, что флаг -pthread устанавливает выделение памяти как обернутое.gcc -dumpspecs | grep pthread производит следующее:

%{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}

Может ли быть так, что libefence не поддерживает многопоточность?

Редактировать: По сути, я предполагаю, чтобиблиотека fence заменяет вызовы malloc / free обычного libc.Тот факт, что они были обернуты в поточно-защитный колпак, бесполезен, поскольку они снова обернуты материалом, не предназначенным для повторного использования.

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Вы пробовали valgrind?

3 голосов
/ 04 августа 2010

Проверьте, поставьте эти два - у него определенно была проблема с phthread (https://bugzilla.redhat.com/show_bug.cgi?id=54368), но недавно кто-то потребовал исправления (http://www.mail-archive.com/debian-bugs-closed@lists. debian.org/msg280548.html) Обратите внимание также на упоминание другого отложенного патча.

2 голосов
/ 25 июля 2010

Чтобы проверить это, я связал его с -lefence, и он дал мне SIGSEGV.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.Концепция электрического ограждения, но вы должны быть в состоянии сразу заметить , где происходит переполнение буфера:

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

и существует переполнение!

...