Frage

Ich habe in letzter Zeit mit Elektrozaun experimentiert und kann nicht herausfinden, wie man ihn mit C ++ - Code verwendet.

Hier ist ein Beispiel:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

Ich habe es zusammengestellt mit

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

Und ich sehe am Anfang kein Elektrozaunbanner und kann keine EF-Symbole in der ausführbaren Datei finden (mit dem Befehl nm).

Aber wenn ich ein Programm so modifiziere:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

alles ist gut - EF erscheint.Ich weiß, dass es das Problem irgendwie löst, ich weiß :).Ich möchte nur verstehen, warum es überhaupt nicht funktioniert hat, weil new() sollte anrufen malloc(), und delete() nennen free(), nein?

Der Grund, warum ich dazu gekommen bin, ist ein großes Projekt mit steigern bibliotheken und viele andere.Und dieses Programm ruft niemals an malloc() oder free() direkt.Und wenn ich es mit EF erstelle, habe ich nicht nur EF mit der endgültigen ausführbaren Datei verknüpft, sondern alle Bibliotheken neu erstellt, die versuchen, EF mit ihnen zu verknüpfen.Und ich kann in keinem von beiden EF-Symbole finden.Ist es der richtige Ansatz?Oder ist es falsch und EF sollte am Ende nur mit der ausführbaren Datei verknüpft werden, die Bibliotheken sollten intakt bleiben?Aber auch hier kann ich dann keine EF-Symbole in der ausführbaren Datei finden.

War es hilfreich?

Lösung

Sie gehen davon aus, dass der Compiler den Code dahinter kompiliert new, aber dieser Code befindet sich im Allgemeinen irgendwo in einer vorkompilierten RT .

new ruft auch im Allgemeinen nicht an malloc direkt (auf einigen Systemen wie Windows wird es nicht aufgerufen malloc überhaupt), hat es ein paar eigene Aufgaben die ausgeführt werden, bevor und nachdem es die Zuordnung übernimmt.für so etwas muss man vielleicht den halb bösen Weg der globalen Überlastung gehen new und delete um es zu zwingen, direkt anzurufen malloc und free aus deinem Code.

Andere Tipps

Aus den Slackware-Dokumenten unter 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)

Lesen Sie unbedingt die libefence manpage, die beschreibt, wie man setzt verschiedene Umgebungsvariablen, die das Verhalten von lebefence verändern

Für Leute, die nach einer schnellen Möglichkeit suchen, C ++ - Code mit Elektrozaun auf armv5 zu "debuggen":

Es ist nicht erforderlich, den Linkerbefehl statisch zu kompilieren und zu ändern.Für mich war es genug, Elektrozaun zu installieren und zu laufen:

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

(aus den gleichen Dokumenten wie oben zitiert)

Nur wenn Ihr Code "mallocs" enthält, wird der "-libefence" in der Build-Binärdatei mit dem Befehl "ldd" sichtbar.Andernfalls, wenn keine "mallocs" und nur "neu" vorhanden sind, wird die Bibliothek "-libefence" möglicherweise nicht in der Liste der verknüpften Bibliotheken der Build-Binärdatei angezeigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top