Вопрос

В последнее время я экспериментировал с Electric Fence и не могу понять, как использовать его с кодом на C++.

Вот пример:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

Я скомпилировал его с

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

И я не вижу баннера Electric Fence в начале и не могу найти символы EF в исполняемом файле (с помощью команды nm).

Но если я изменю программу следующим образом:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

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

все хорошо - появляется ЭФ.Я знаю, что это вроде как решает проблему, я знаю :).Я просто хочу понять, почему это вообще не сработало, потому что new() должен позвонить malloc(), и delete() звонки free(), нет?

Причина, по которой я этим занялся, — это большой проект, использующий способствовать росту библиотеки и ряд других.И эта программа никогда не вызывает malloc() или free() напрямую.И когда я собирал его с помощью EF, я не только связывал EF с окончательным исполняемым файлом, но и пересобирал все библиотеки, пытаясь связать с ними EF.И я не могу найти символы EF ни в одном из них.Это правильный подход?Или это неправильно, и в конце концов с исполняемым файлом должен быть связан только EF, а библиотеки следует оставить нетронутыми?Но опять же, тогда я не могу найти символы EF в исполняемом файле.

Это было полезно?

Решение

Вы предполагаете, что компилятор компилирует код new, но этот код обычно находится где-то в предварительно скомпилированном RT.

new также обычно не звонит malloc напрямую (в некоторых системах, таких как Windows, он не вызывает malloc вообще), есть несколько собственных задач которые выполняются до и после обработки выделения.для чего-то подобного вам, возможно, придется пойти полузлым путем глобальной перегрузки new и delete чтобы заставить его напрямую позвонить malloc и free из вашего кода.

Другие советы

Из документации по 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)

Обязательно прочтите libefence Manpage, которая описывает, как установить различные переменные среды, которые изменяют поведение Лебефенса

Для людей, которые ищут быстрый способ «отладки» кода C++ с помощью электрического забора на Armv5:

Нет необходимости статически компилировать и изменять команду компоновщика.Мне было достаточно установить электроизгородь и запустить:

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

(из тех же документов, что указаны выше)

Только если ваш код содержит «mallocs», «-libefence» будет виден в двоичном файле сборки с помощью команды «ldd».В противном случае, если нет «mallocs» и есть только «new», вы можете не увидеть библиотеку «-libefence» в списке связанных библиотек двоичного файла сборки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top