2013-01-16 37 views
6

tôi có chương trình đồ chơi sau đó cung cấp cho lỗi với gcc MacPorts trên OSX 10,6boost :: program_options cho lỗi malloc

#include <boost/program_options.hpp> 
namespace po = boost::program_options; 

#include <iostream> 
using namespace std; 

int main(int ac, char* av[]) 
{ 
     po::options_description desc("Allowed options"); 
     desc.add_options() ("help", "produce help message") ; 

     po::variables_map vm;   
     po::store(po::parse_command_line(ac, av, desc), vm); 
     po::notify(vm);  

     if (vm.count("help")) { 
      cout << desc << "\n"; 
      return 0; 
     } 
     cout << "Program continues\n"; 
     return 0; 
} 

Tôi có tăng phiên bản 1,52 cài đặt với MacPorts. Tôi biên dịch chương trình như

g++ a.cpp -lboost_program_options-mt -L/opt/local/lib -g -O0 

Nó biên dịch tốt:

$ ./a.out 
Program continues 

Nhưng nó không thể in các thông báo trợ giúp:

$ ./a.out --help 
Allowed options: 
a.out(40110) malloc: *** error for object 0x7fff70ca3500: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap 

Tôi đã nghe nói rằng những thứ như thế này có thể xảy ra nếu thư viện được biên dịch với một phiên bản khác của gcc so với phiên bản được sử dụng để xây dựng chương trình. Làm cách nào để kiểm tra điều này? Tôi có

$ g++ --version 
g++ (MacPorts gcc47 4.7.2_2) 4.7.2 

Cập nhật: điều này dường như làm việc trên một máy Linux với và Boost cũ.

Cập nhật 2: đầu ra của gdb sau

(gdb) run 
Starting program: /Users/yasir/Downloads/mask.util/a.out --help 
Reading symbols for shared libraries ++++.. done 
Allowed options: 
a.out(42256) malloc: *** error for object 0x7fff70ca3500: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff821030b6 in __kill() 
(gdb) bt 
#0 0x00007fff821030b6 in __kill() 
#1 0x00007fff821a39f6 in abort() 
#2 0x00007fff820bb195 in free() 
#3 0x00000001001188b4 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow() 
(gdb) 

Cập nhật 3: Chương trình này hoạt động tốt với các gcc42 Xcode, vấn đề chỉ xảy ra với gcc MacPorts.

+3

Mã này có vẻ đúng với tôi (so với mã nguồn của tôi bằng cách sử dụng program_options). Bạn có thể chạy điều này trong gdb (biên dịch với -ggdb3 -O0 và chạy 'gdb --args ./a.out --help' và gõ' run' và 'bt') không? –

+0

@ RafałRawicki, chỉ cần thêm thông tin gdb sau khi biên dịch với cờ của bạn – highBandWidth

Trả lời

1

Lý do rất có thể xảy ra với lỗi của bạn là có sự không khớp giữa các giao diện được trình bày trong các tệp tiêu đề chương trình và thực hiện như được chọn trong thư viện đã biên dịch của bạn. Điều này có thể là do bạn vô tình chọn một thư viện được biên dịch từ một phiên bản khác hoặc có thể vì bạn đã biên dịch thư viện với phiên bản trình biên dịch khác với một phiên bản bạn đang sử dụng để biên dịch chương trình thử nghiệm của mình.

+0

Có cách nào để kiểm tra ví dụ, phiên bản của thư viện đã biên dịch của nó hay trình biên dịch nào được sử dụng để tạo thư viện? – highBandWidth

+0

Trên Linux, bạn có thể sử dụng objdump -x để tìm hiểu nhiều thông tin này (các phiên bản SO, glibc và cxxabi). Không biết về OS X mặc dù –

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