为了诊断一个棘手的内存损坏错误(内存被随机覆盖)我想到了使用Electric Fence +一些自定义的mprotect调用来确保损坏的数据结构只有在我希望它们被写入时才可写(和当我们试图写入时,我立即得到一个SIGSEGV。
不幸的是,所说的代码是一个Ruby C扩展,它使得在libefence下运行它成为一个性能噩梦,因为使用
在libefence下运行整个ruby解释器export LD_PRELOAD=libefence.so.0.0
速度非常慢。
OTOH,将ruby扩展名与libefence直接链接(通过将-lefence传递给链接器)似乎没有效果导致它在没有libefence的工具的情况下运行。
有没有办法只通过libefence运行特定共享库中发生的内存分配,只剩下其他共享库和主进程?
答案 0 :(得分:1)
最简单的方法是将Ruby C扩展与静态libefence库链接。但是仍然可能存在问题 - 如果扩展中的某些东西是malloc(),但是在ruby中释放了什么?
如果你马上得到一个SIGSEGV但想要速度 - 你可能想要使用gdb。一旦发生SIGSEGV,调试器就会中断。
另外,valgrind有助于发现内存问题,但也很慢。