Domanda

Ho sperimentato la recinzione elettrica ultimamente e non riesco a capire come usarlo con codice C ++.

Ecco un esempio:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

L'ho compilato con

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

E non vedo banner elettrico recinzione all'inizio e non riesci a trovare simboli EF nell'eseguibile (utilizzando il comando NM).

Ma se modifico un programma come SO:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

Tutto è buono - appare EF. So che risolve il problema, lo so :). Voglio solo capire perché non ha funzionato in primo luogo, perché new() dovrebbe chiamare malloc() e delete() chiama free(), no?

La ragione per cui ho ottenuto questo è un grande progetto usando boost librerie e molti altri. E questo programma non chiama mai malloc() o free() direttamente. E quando lo costruisco con EF non ho collegato solo EF all'eseguibile finale ma ricostruito tutte le biblioteche che cercano di collegare EF a loro. E non riesco a trovare simboli EF in uno di loro. È l'approccio giusto? Oppure è sbagliato e l'EF dovrebbe essere collegato solo all'eseguibile alla fine, le libs devono essere lasciate intatte? Ma di nuovo non riesco a trovare simboli EF nell'eseguibile allora.

È stato utile?

Soluzione

Si suppone che il compilatore stia compilando il codice dietro new, ma tale codice risiede generalmente da qualche parte in un RT pre-compilato.

new Inoltre non chiama direttamente malloc direttamente (su alcuni sistemi come Windows, non chiama malloc a tutti), ha Pochi compiti propri che vengono eseguiti, prima e dopo che gestisce l'allocazione.Per qualcosa del genere potresti dover andare la rotta semi-malvagia di sovraccarico a livello globale new e delete per costringerlo a chiamare direttamente malloc e free dal tuo codice.

Altri suggerimenti

dai documenti Slackware a http://slackbuilds.org/repository/13.1/librilany/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)
.

Assicurati di leggere la manpage libefence che descrive come impostare Varie variabili di ambiente che alterano il comportamento di Lebefence

Per le persone che cercano un modo rapido per "debug" Codice C ++ con recinzione elettrica su ARMV5:

Non è necessario compilare staticamente e modificare il comando del linker.Per me è stato sufficiente installare recinzione elettrica ed eseguire:

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

(dagli stessi documenti sopra citati)

Solo se il codice dei tuoi contiene "malloc", la "-Libefence" sarà visibile nel binario Build con il comando "LDD".Altrimenti, se nessun "malloc" e solo "nuovo", allora potresti non vedere la libreria "-Libefence" nell'elenco collegata della biblioteca del binario binario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top