Использование Electric Fence (libefence) только для общей библиотеки

Чтобы диагностировать сложную ошибку повреждения памяти (память перезаписывается случайным образом), я подумал об использовании Electric Fence + некоторых пользовательских вызовов mprotect, чтобы гарантировать, что поврежденные структуры данных доступны для записи только тогда, когда я хочу, чтобы они были записаны (и я сразу получаю SIGSEGV, когда их пытаются записать).

К сожалению, указанный код является расширением Ruby C, что делает его запуск под libefence настоящим кошмаром производительности, так как весь интерпретатор ruby ​​работает под управлением libefence с использованием

export LD_PRELOAD=libefence.so.0.0

ужасно медленно

OTOH, связывание расширения ruby ​​с libefence напрямую (путем передачи -lefence компоновщику), похоже, не дает никакого эффекта, заставляя его работать без инструментария libefence.

Есть ли способ запустить только выделение памяти, происходящее в определенной общей библиотеке, через libefence и оставить другие общие библиотеки и основной процесс в покое?

1 ответ

Простейшим способом было бы связать расширение Ruby C со статической библиотекой libefence. Тем не менее могут быть проблемы - что если в вашем расширении что-то есть malloc(), но освобождено в ruby?

Если вы сразу получаете SIGSEGV, но хотите получить скорость - вы можете использовать GDB. Как только SIGSEGV происходит, отладчик сломается.

В качестве альтернативы valgrind хорош для поиска проблем с памятью, но он также медленный.

Другие вопросы по тегам