2012-02-29 15 views
5

Eksperymentowałem ostatnio z Electric Fence i nie mogę wymyślić jak go użyć z kodem C++.używając elektrycznego ogrodzenia w programie C++

Oto przykład:

// test.cpp 
#include <cstdlib>                                   

using namespace std;                                  

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

Skompilowałem go

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

I nie widzę Ogrodzenia elektryczne baner na początku i nie może znaleźć symbole EF w pliku wykonywalnego (przy użyciu polecenie nm). Ale jeśli zmodyfikować program tak jak

:

// test.cpp 
#include <cstdlib>                                   

using namespace std;                                  

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

wszystko jest dobre - pojawia EF. Wiem, że to trochę rozwiązuje problem, wiem :). Chcę tylko zrozumieć, dlaczego to nie zadziałało, ponieważ new() powinien zadzwonić pod numer malloc() i delete() dzwoni free(), nie?

Powodem, dla którego się do tego przyłączyłem, jest duży projekt z wykorzystaniem bibliotek doładowania i kilka innych. Ten program nigdy nie wywołuje bezpośrednio nazwy malloc() ani free(). I kiedy zbudowałem go z EF, nie tylko podłączyłem EF do końcowego pliku wykonywalnego, ale przebudowałem wszystkie biblioteki próbujące połączyć EF z nimi. I nie mogę znaleźć symboli EF w żadnym z nich. Czy to właściwe podejście? Czy to źle i EF tylko powinny być połączone z plikiem wykonywalnym w końcu, biblioteki powinny pozostać nienaruszone? Ale znowu nie mogę znaleźć symboli EF w pliku wykonywalnym.

+0

dlaczego idziesz z efence nad Valgrind? – Anycorn

+2

ponieważ muszę debugować program, który działa na ARMv5 (http://stackoverflow.com/q/9456194/4378). Valgrind nie jest tam deportowany. –

Odpowiedz

3

Zakładasz, że kompilator kompiluje kod pod numerem new, ale ten kod zazwyczaj znajduje się gdzieś w skompilowanym RT.

new też na ogół nie nazywają malloc bezpośrednio (w niektórych systemach jak Windows, to nie nazywa malloc w ogóle), to ma a few tasks of its own które są wykonywane przed i po obsługuje alokację. na coś takiego, być może trzeba przejść na pół-złą drogę globalnego przeciążania new i delete, aby zmusić ją do bezpośredniego wywoływania malloc i free ze swojego kodu.

1

Z Slackware docs na 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) 

Koniecznie przeczytać libefence manpage który opisuje jak ustawić różne zmienne środowiskowe, które zmieniają zachowanie lebefence za

0

Tylko jeśli kod twoja zawiera " mallocs ", czy" -libefence "będzie widoczna w pliku binarnym kompilacji przy pomocy polecenia" ldd ". W przeciwnym razie, jeśli nie ma "mallocs" i tylko "new", może nie być dostępna biblioteka "-libefence" na liście bibliotek dołączonych do pliku binarnego build.

1

Dla ludzi, którzy szukają szybkiego sposobu na „debug” C++ kod z elektrycznym ogrodzeniem na armv5:

Nie jest konieczne, aby statycznie skompilować i zmienić komendę linkera.Dla mnie to wystarczyło, aby zainstalować i uruchomić elektryczne ogrodzenie:

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

(z tych samych docs jak cytowane powyżej)

+0

Ta biblioteka działa tylko dla debiana? – Bionix1441