2012-02-29 49 views
5

Tôi đã thử nghiệm với Hàng rào điện gần đây và tôi không thể tìm ra cách sử dụng nó với mã C++.sử dụng hàng rào điện trong chương trình C++

Dưới đây là một ví dụ:

// test.cpp 
#include <cstdlib>                                   

using namespace std;                                  

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

tôi biên dịch nó với

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

Và tôi không thấy hàng rào biểu ngữ điện vào lúc bắt đầu và không thể tìm thấy những biểu tượng EF trong thực thi (sử dụng lệnh nm).

Nhưng nếu tôi sửa đổi một chương trình như vậy:

// test.cpp 
#include <cstdlib>                                   

using namespace std;                                  

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

mọi thứ đều tốt - EF xuất hiện. Tôi biết nó giải quyết được vấn đề, tôi biết :). Tôi chỉ muốn hiểu tại sao nó không hoạt động ngay từ đầu, bởi vì new() nên gọi malloc()delete() gọi free(), không?

Lý do tôi tham gia vào dự án này là một dự án lớn sử dụng các thư viện tăng và nhiều thư viện khác. Và chương trình này không bao giờ gọi trực tiếp số malloc() hoặc free(). Và khi tôi xây dựng nó với EF, tôi không chỉ liên kết EF với bản thực thi cuối cùng mà còn xây dựng lại tất cả các thư viện cố gắng liên kết EF với họ. Và tôi không thể tìm thấy các biểu tượng EF trong cả hai. Đó có phải là cách tiếp cận đúng không? Hoặc là nó sai và EF chỉ nên được liên kết với thực thi cuối cùng, libs nên được còn nguyên vẹn? Nhưng một lần nữa tôi không thể tìm thấy biểu tượng EF trong thực thi sau đó.

+0

tại sao bạn đi với efence qua valgrind? – Anycorn

+2

vì tôi cần gỡ lỗi chương trình chạy trên ARMv5 (http://stackoverflow.com/q/9456194/4378). Valgrind không bị nhốt ở đó. –

Trả lời

3

Bạn giả định rằng trình biên dịch đang biên dịch mã sau new, nhưng mã đó thường nằm ở đâu đó trong RT được biên dịch trước.

new cũng thường không gọi malloc trực tiếp (trên một số hệ thống như Windows, nó không gọi malloc tại tất cả), nó có a few tasks of its own đó được thực hiện, trước và sau khi nó xử lý việc phân bổ. cho một cái gì đó như thế này bạn có thể phải đi con đường bán ác của quá tải trên toàn cầu newdelete để buộc nó trực tiếp gọi mallocfree từ mã của bạn.

1

Từ các tài liệu slackware tại 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) 

Hãy chắc chắn để đọc manpage libefence trong đó mô tả cách thiết biến môi trường khác nhau mà thay đổi hành vi lebefence của

0

Chỉ khi mã của bạn chứa " mallocs ", sẽ" -libefence "được hiển thị trong binary build với lệnh" ldd ". Nếu không, nếu không có "mallocs" và chỉ "mới" thì bạn có thể không thấy thư viện "-libefence" trong danh sách thư viện được liên kết của tệp nhị phân xây dựng.

1

Đối với những người đang tìm kiếm một cách nhanh chóng để "gỡ rối" C++ mã với hàng rào điện trên armv5:

Nó không phải là cần thiết để tĩnh biên dịch và thay đổi lệnh mối liên kết.Đối với tôi đó là đủ để cài đặt hàng rào điện và chạy:

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

(từ các tài liệu tương tự như trích dẫn ở trên)

+0

Thư viện này chỉ hoạt động với debian? – Bionix1441

Các vấn đề liên quan