Question

J'ai expérimenté la clôture électrique ces derniers temps et je ne peux pas comprendre comment l'utiliser avec le code C ++.

Voici un exemple:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

Je l'ai compilé avec

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

Et je ne vois pas la bannière de clôture électrique au début et je ne trouve pas les symboles EF dans l'exécutable (en utilisant la commande nm).

Mais si je modifie un programme comme tel:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

Tout est bon - EF apparaît. Je sais que ça résout un peu le problème, je sais :). Je veux juste comprendre pourquoi cela n'a pas fonctionné en premier lieu, car new() devrait appeler malloc(), et delete() appels free(), non?

La raison pour laquelle je suis entré dans ceci est un grand projet en utilisant augmenter bibliothèques et plusieurs autres. Et ce programme n'appelle jamais malloc() ou free() directement. Et quand je le construis avec EF pas, je liais uniquement EF à l'exécutable final mais reconstruit toutes les bibliothèques essayant de les lier EF. Et je ne trouve pas les symboles EF dans l'un ou l'autre. Est-ce la bonne approche? Ou est-ce faux et EF devrait être lié à l'exécutable à la fin, les LIB doivent être laissées intactes? Mais encore une fois, je ne trouve pas les symboles EF dans l'exécutable alors.

Était-ce utile?

La solution

Vous supposez que le compilateur compose le code derrière new, mais ce code réside généralement quelque part dans un RT pré-compilé.

new n'appelle généralement pas généralement malloc directement (sur certains systèmes comme Windows, il n'appelle pas malloc du tout), il a Quelques tâches qui sont effectués, avant et après, il gère l'allocation. Pour quelque chose comme ça, vous devrez peut-être suivre la voie semi-évidente de la surcharge mondiale new et delete pour le forcer à appeler directement malloc et free de votre code.

Autres conseils

Des documents slackware à 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)

Assurez-vous de lire le libefence Manie qui décrit comment définir diverses variables d'environnement qui modifient le comportement de Lebefence

Pour les personnes qui recherchent un moyen rapide de "déboguer" C ++ Code avec une clôture électrique sur ARMV5:

Il n'est pas nécessaire de compiler statiquement et de modifier la commande de linker. Pour moi, c'était suffisant pour installer la clôture électrique et courir:

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

(à partir des mêmes documents que cités ci-dessus)

Ce n'est que si le code de la vôtre contient "Mallocs", le "-libefence" sera-t-il visible dans la commande Build Binary avec "LDD". Sinon, si aucun "malloc" et seulement "nouveau" alors, vous ne verrez peut-être pas la bibliothèque "-libefence" dans la liste des bibliothèques liées du binaire de construction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top