c - 仅对共享库使用 Electric Fence (libefence)

标签 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 只运行在特定共享库中发生的内存分配,而让其他共享库和主进程单独运行?

最佳答案

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

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

或者,valgrind 很适合查找内存问题,但速度也很慢。

关于c - 仅对共享库使用 Electric Fence (libefence),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3928739/

相关文章:

ruby-on-rails - Ruby on Rails : models, 迁移和概览

c++ - 静态编译过剩?

ruby - 当我运行 "gem install bundler"时出现权限被拒绝错误

ruby - Ruby 的 PostgreSQL 适配器的正确名称是什么?

.net - CompileAssemblyFromSource 生成的程序集异常没有行号

c++ - 强制 Visual Studio 进入 STL 类/函数

iphone - 如何使用iPhone进行调试?

c - 从函数返回一个二维数组

c - 在 C 中填充结构数组

c - 我释放节点的方式是否正确?