2012-02-29 13 views
5

मैं हाल ही में इलेक्ट्रिक बाड़ के साथ प्रयोग कर रहा हूं और मैं यह नहीं समझ सकता कि इसे सी ++ कोड के साथ कैसे उपयोग किया जाए।एक सी ++ प्रोग्राम में बिजली की बाड़ का उपयोग

यहाँ एक उदाहरण है:

// 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 

के साथ संकलित और मैं शुरू में इलेक्ट्रिक बाड़ बैनर न दिखाई दे और नहीं (का उपयोग करते हुए निष्पादन में एफई प्रतीकों पा सकते हैं एनएम कमांड)।

लेकिन अगर मैं तो जैसे किसी प्रोग्राम को संशोधित:

// 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() पर कॉल नहीं करता है। और जब मैं इसे ईएफ के साथ बनाता हूं, न कि मैंने केवल अंतिम निष्पादन योग्य को ईएफ से जोड़ा है, लेकिन उन सभी पुस्तकालयों को पुनर्निर्मित किया है जो उन्हें ईएफ को जोड़ने की कोशिश कर रहे हैं। और मैं उनमें से किसी एक में ईएफ प्रतीक नहीं पा रहा हूं। क्या यह सही दृष्टिकोण है? या यह गलत है और ईएफ केवल अंत में निष्पादन योग्य से जुड़ा होना चाहिए, libs बरकरार रखा जाना चाहिए? लेकिन फिर मैं निष्पादन योग्य में ईएफ प्रतीक नहीं पा रहा हूं।

+0

आप valgrind से अधिक efence साथ क्यों जाते हो (समान डॉक्स के रूप में ऊपर उद्धृत से)? – Anycorn

+2

क्योंकि मुझे एआरएमवी 5 (http://stackoverflow.com/q/9456194/4378) पर चलने वाले प्रोग्राम को डीबग करने की आवश्यकता है। Valgrind वहाँ छेड़छाड़ नहीं है। –

उत्तर

3

आप मानते हैं कि संकलक new के पीछे कोड संकलित कर रहा है, लेकिन वह कोड आम तौर पर पूर्व-संकलित आरटी में कहीं भी रहता है।

new भी आम तौर पर malloc सीधे कॉल नहीं करते (Windows की तरह कुछ सिस्टम पर, यह बिल्कुल malloc फोन नहीं करता है), यह a few tasks of its own कि प्रदर्शन कर रहे हैं, पहले और बाद में यह आवंटन संभालती है। इस तरह के कुछ के लिए आपको अपने कोड से सीधे malloc और free पर कॉल करने के लिए मजबूर करने के लिए इसे new और delete पर वैश्विक स्तर पर ओवरलोडिंग के सेमी-बुराई मार्ग पर जाना पड़ सकता है।

1

स्लैकवेयर डॉक्स से 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 मैनपेज जो विभिन्न वातावरण चर जो lebefence के व्यवहार में परिवर्तन

0

सिर्फ अगर तुम्हारा कोड होता है स्थापित करने के लिए कैसे "का वर्णन पढ़ लें mallocs "," llefence "बिल्डिंग बाइनरी में" ldd "कमांड के साथ दिखाई देगा। अन्यथा, यदि कोई "mallocs" और केवल "नया" नहीं है, तो हो सकता है कि आप बिल्ड-बाइनरी की लिंक-लाइब्रेरी सूची में "-लिबेंस" लाइब्रेरी न देख सकें।

1

लोग हैं, जो एक त्वरित तरीका है "डिबग" सी ++ बिजली की बाड़ के साथ armv5 पर कोड के लिए देख रहे हैं के लिए:

यह स्थिर संकलन और लिंकर आदेश को बदलने के लिए आवश्यक नहीं है।मेरे लिए यह बिजली की बाड़ स्थापित करने और चलाने के लिए पर्याप्त था:

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

+0

यह पुस्तकालय केवल डेबियन के लिए काम करता है? – Bionix1441

संबंधित मुद्दे