【问题标题】:electric-fence with pthread带 pthread 的电子围栏
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你试过 valgrind 吗?

      【讨论】:

      • 我听说过 valgrind,但我从不厌倦它。我去看看。我会给 +1 的建议。如果 valgrind 能解决我对 efence 的疑问,我会接受你的回答。
      【解决方案3】:

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

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

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

      你的溢出来了!

      【讨论】:

      • 我会说这意味着您正在尝试释放尚未分配的内存位置,您确定要释放的指针吗?
      • 否定:在这种情况下,即使没有电栅栏,我也应该得到分段错误 + 大量 glib 输出,这不会发生。
      • @Dacav;嗯?你期待一个段错误,但你问为什么你会得到一个?或者你实际上没有得到一个,而是期待一个?
      • @roe:我只是想找出内存管理中可能存在的错误。我的目标是验证不存在分段错误。不幸的是,我遇到了分段错误,但在一个与我的内存管理无关的地方。
      猜你喜欢
      • 2013-04-16
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多