【发布时间】:2011-03-20 12:11:41
【问题描述】:
我正在开发一个多线程(基于 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不支持多线程?
编辑:基本上我假设电子围栏库取代了常规 libc 的 malloc/free 调用。用线程安全罩包裹它们的事实是没有用的,因为它们又被不可重入的东西包裹了。
【问题讨论】:
标签: debugging segmentation-fault pthreads malloc electric-fence