سؤال

لقد قمت بتجربة 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

ولا أرى شعار السياج الكهربائي في البداية ولا يمكنني العثور على رموز 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;
}

كل شيء على ما يرام - يظهر EF.أعلم أنه يحل المشكلة نوعًا ما، أعلم :).أريد فقط أن أفهم لماذا لم ينجح الأمر في المقام الأول، لأنه new() يجب ان تتصل malloc(), ، و delete() المكالمات free(), ، لا؟

السبب وراء دخولي في هذا هو مشروع كبير يستخدم يعزز المكتبات والعديد من الآخرين.وهذا البرنامج لا يدعو أبدا malloc() أو free() مباشرة.وعندما قمت بإنشائه باستخدام EF، لم أقم فقط بربط EF بالملف النهائي القابل للتنفيذ ولكني قمت بإعادة بناء جميع المكتبات التي تحاول ربط EF بها.ولا أستطيع العثور على رموز EF في أي منهما.هل هذا هو النهج الصحيح؟أم أن هذا خطأ ويجب ربط EF فقط بالملف القابل للتنفيذ في النهاية، ويجب ترك libs سليمة؟ولكن مرة أخرى لا أستطيع العثور على رموز 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 الذي يصف كيفية تعيين متغيرات البيئة المختلفة التي تغير سلوك Lebefence

بالنسبة للأشخاص الذين يبحثون عن طريقة سريعة "لتصحيح" كود C++ باستخدام سياج كهربائي على Armv5:

ليس من الضروري ترجمة أمر الرابط وتغييره بشكل ثابت.بالنسبة لي كان يكفي تركيب سياج كهربائي وتشغيل:

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

(من نفس المستندات المذكورة أعلاه)

فقط إذا كان الكود الخاص بك يحتوي على "mallocs"، فسيكون "-libefence" مرئيًا في ملف الإنشاء الثنائي باستخدام أمر "ldd".بخلاف ذلك، إذا لم يكن هناك "mallocs" و"جديد" فقط، فقد لا ترى مكتبة "-libefence" في قائمة المكتبات المرتبطة في ملف الإنشاء الثنائي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top