Электрический забор с резьбой

Я работаю над многопоточным (основанным на 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 не поддерживает многопоточность?

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

3 ответа

Решение

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

Ты пробовал Вальгринд?

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

Я знаю только концепцию Electric fence, но вы должны сразу заметить, где происходит переполнение буфера:

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

и есть ваше переполнение!

Другие вопросы по тегам