Pregunta

He estado experimentando con Electric Fence últimamente y no sé cómo usarlo con código C++.

He aquí un ejemplo:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                                                                                                                                                                     
        int *a = new int(10);                                                                                                                              
        delete a;                                                                                                                              
}  

lo compilé con

g++ ./test.cpp -o test -lefence -L/home/bor/efence_x86_64/lib -lpthread

Y no veo el banner de Electric Fence al principio y no puedo encontrar símbolos EF en el ejecutable (usando el comando nm).

Pero si modifico un programa así:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                          
        char *p = (char*)malloc(20);                                                                                                                       
        free(p);                                                                                                                                           
        int *a = new int(10);                                                                                                                              
        delete a;
}

todo está bien - aparece EF.Sé que resuelve un poco el problema, lo sé :).Sólo quiero entender por qué no funcionó en primer lugar, porque new() debería llamar malloc(), y delete() llamadas free(), ¿No?

La razón por la que me metí en esto es un gran proyecto que utiliza aumentar bibliotecas y varios otros.Y este programa nunca llama malloc() o free() directamente.Y cuando lo compilé con EF, no solo vinculé EF al ejecutable final, sino que reconstruí todas las bibliotecas que intentaban vincular EF a ellas.Y no puedo encontrar símbolos EF en ninguno de ellos.¿Es este el enfoque correcto?¿O está mal y al final solo EF debería vincularse al ejecutable y las bibliotecas deberían dejarse intactas?Pero nuevamente no puedo encontrar símbolos EF en el ejecutable.

¿Fue útil?

Solución

Estás asumiendo que el compilador está compilando el código detrás. new, pero ese código generalmente reside en algún lugar de un RT precompilado.

new Generalmente tampoco llama malloc directamente (en algunos sistemas como Windows, no llama malloc en absoluto), tiene algunas tareas propias que se realizan, antes y después de que se maneje la asignación.para algo como esto es posible que tengas que seguir el camino semi-malvado de sobrecargar globalmente new y delete para obligarlo a llamar directamente malloc y free de tu código.

Otros consejos

De los documentos de slackware en http://slackbuilds.org/repository/13.1/libraries/electric-fence/

In order to debug a program it needs to be linked with Electric Fence's
library or dynamic linking needs to be used; README.Debian explains that
in detail.


If you're using c++, and you and want to statically link your c++
programs, you shouldn't use g++ to link libefence.a, but rather:
gcc -o myprog myprog.o -lstdc++ -lg++ -lefence
(if you use g++, the order is different, and efence's malloc doesn't
get used)

Asegúrate de leer el libefence ManPage que describe cómo establecer varias variables de entorno que alteran el comportamiento de Lebefence

Para las personas que buscan una forma rápida de "depurar" código C++ con cerca eléctrica en armv5:

No es necesario compilar ni cambiar estáticamente el comando del vinculador.A mí me bastó con instalar cerca eléctrica y ejecutar:

LD_PRELOAD=libefence.so ./your-buggy-program

(de los mismos documentos citados anteriormente)

Sólo si su código contiene "mallocs", el "-libefence" será visible en el binario de compilación con el comando "ldd".De lo contrario, si no hay "mallocs" y solo "nuevo", es posible que no vea la biblioteca "-libefence" en la lista de bibliotecas vinculadas del binario de compilación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top