2

我正在开发一个多线程(基于 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 调用。他们已经用线程安全的引擎盖包裹的事实是没有用的,因为他们已经用不可重入的东西再次包裹了。

4

3 回答 3

3

你试过valgrind吗?

于 2010-07-29T23:31:08.037 回答
3

检查把这两个 - 它肯定有 phthread 的问题(https://bugzilla.redhat.com/show_bug.cgi?id=54368)但最近有人声称修复了(http://www.mail-archive.com /debian-bugs-closed@lists.debian.org/msg280548.html)请注意另一个延迟补丁的提及。

于 2010-08-03T23:59:21.017 回答
2

为了检查它,我将它与 -lefence 链接,它给了我 SIGSEGV。在花了很多时间找出问题所在之后,我终于决定在库中搜索错误,即使它的功能非常简单。

我只知道电子围栏的概念,但是你应该能够立即注意到 缓冲区溢出发生在哪里:

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

还有你的溢出!

于 2010-07-25T08:05:20.820 回答