为了诊断一个棘手的内存损坏错误(内存被随机覆盖),我考虑使用 Electric Fence + 一些自定义 mprotect 调用来确保损坏的数据结构只有在我希望它们被写入时才可写(并且当试图写入它们时,我会立即收到 SIGSEGV。
不幸的是,上述代码是一个 Ruby C 扩展,这使得在 libefence 下运行它成为性能噩梦,因为在 libefence 下运行整个 ruby 解释器使用
export LD_PRELOAD=libefence.so.0.0
非常慢。
OTOH,直接将 ruby 扩展与 libefence 链接(通过将 -lefence 传递给链接器)似乎没有任何效果导致它在没有 libefence 的检测的情况下运行。
有没有办法通过 libefence 只运行在特定共享库中发生的内存分配,而让其他共享库和主进程单独运行?
最佳答案
最简单的方法是将 Ruby C 扩展与静态 libefence 库链接。但是仍然可能存在问题 - 如果某些东西在您的扩展中被 malloc()ed 但在 ruby 中被释放了怎么办?
如果您立即获得 SIGSEGV 但想要速度 - 您可能需要使用 gdb。一旦 SIGSEGV 发生,调试器就会中断。
或者,valgrind 很适合查找内存问题,但速度也很慢。
关于c - 仅对共享库使用 Electric Fence (libefence),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3928739/