Использование 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 хорош для поиска проблем с памятью, но он также медленный.