使用Electric Fence(libefence)仅用于共享库

时间:2010-10-13 22:57:37

标签: c ruby debugging memory-management electric-fence

为了诊断一个棘手的内存损坏错误(内存被随机覆盖)我想到了使用Electric Fence +一些自定义的mprotect调用来确保损坏的数据结构只有在我希望它们被写入时才可写(和当我们试图写入时,我立即得到一个SIGSEGV。

不幸的是,所说的代码是一个Ruby C扩展,它使得在libefence下运行它成为一个性能噩梦,因为使用

在libefence下运行整个ruby解释器
export LD_PRELOAD=libefence.so.0.0

速度非常慢。

OTOH,将ruby扩展名与libefence直接链接(通过将-lefence传递给链接器)似乎没有效果导致它在没有libefence的工具的情况下运行。

有没有办法只通过libefence运行特定共享库中发生的内存分配,只剩下其他共享库和主进程?

1 个答案:

答案 0 :(得分:1)

最简单的方法是将Ruby C扩展与静态libefence库链接。但是仍然可能存在问题 - 如果扩展中的某些东西是malloc(),但是在ruby中释放了什么?

如果你马上得到一个SIGSEGV但想要速度 - 你可能想要使用gdb。一旦发生SIGSEGV,调试器就会中断。

另外,valgrind有助于发现内存问题,但也很慢。