3

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

不幸的是,上述代码是一个 Ruby C 扩展,这使得在 libefence 下运行它成为性能噩梦,就像在 libefence 下运行整个 ruby​​ 解释器一样

export LD_PRELOAD=libefence.so.0.0

非常慢。

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

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

4

1 回答 1

1

最简单的方法是将 Ruby C 扩展与静态 libefence 库链接。但是仍然可能存在问题 - 如果某些内容在您的扩展程序中 malloc()ed 但在 ruby​​ 中释放了怎么办?

如果您立即获得 SIGSEGV 但想要速度 - 您可能想要使用 gdb。一旦 SIGSEGV 发生,调试器就会中断。

或者 valgrind 可以很好地发现内存问题,但也很慢。

于 2010-10-13T23:10:36.930 回答