Afin de diagnostiquer un bug délicat de corruption de mémoire (la mémoire est écrasée de manière aléatoire), j'ai pensé utiliser Electric Fence + quelques appels mprotect personnalisés pour m'assurer que les structures de données corrompues ne sont accessibles en écriture que lorsque je veux qu'elles le soient (et j'obtiens immédiatement un SIGSEGV lorsqu'on tente de les écrire).
Malheureusement, ledit code est une extension C de Ruby, ce qui fait que son exécution sous libefence est un cauchemar en termes de performances, tout comme l'exécution de l'ensemble de l'interpréteur ruby sous libefence en utilisant
export LD_PRELOAD=libefence.so.0.0
est horriblement lent.
Par contre, lier l'extension ruby avec libefence directement (en passant -lefence à l'éditeur de liens) semble n'avoir aucun effet, ce qui permet de l'exécuter sans l'instrumentation de libefence.
Existe-t-il un moyen d'exécuter uniquement les allocations de mémoire qui se produisent dans une bibliothèque partagée spécifique par le biais de libefence et de laisser les autres librairies partagées et le processus principal tranquilles ?