Использование Electric Fence (libefence) только для общей библиотеки - PullRequest
3 голосов
/ 14 октября 2010

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

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

export LD_PRELOAD=libefence.so.0.0

ужасно медленный.

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

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

1 Ответ

1 голос
/ 14 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...