2013-01-16 32 views
6

मैं निम्नलिखित खिलौना कार्यक्रम है कि पर OSX 10,6बढ़ावा :: program_options 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; 
} 

मैं बढ़ावा संस्करण 1.52 MacPorts के साथ स्थापित किया है MacPorts जीसीसी के साथ त्रुटियों देता है। मैं इस कार्यक्रम को संकलित रूप में

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

यह ठीक संकलित:

$ ./a.out 
Program continues 

लेकिन यह सहायता संदेश मुद्रित नहीं कर सकते:

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

मैंने सुना है इस तरह कि सामान अगर हो सकता है पुस्तकालयों को प्रोग्राम बनाने के लिए इस्तेमाल किए गए जीसीसी के एक अलग संस्करण के साथ संकलित किया जाता है। मैं इसके लिए कैसे जांच करूं? मेरे पास है

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

अद्यतन: इस के साथ और पुराने बूस्ट एक Linux मशीन पर काम करने के लिए लगता है।

अद्यतन 2: gdb के उत्पादन

(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) 

अद्यतन 3 इस प्रकार है: कार्यक्रम Xcode gcc42 साथ ठीक काम करता है, समस्या केवल MacPorts जीसीसी के साथ होता है।

+3

यह कोड मुझे सही दिखता है (program_options का उपयोग करके मेरे स्रोत कोड की तुलना में)। क्या आप इसे gdb में चला सकते हैं (-ddb3 -O0 के साथ संकलित करें और 'gdb --args ./a.out --help' चलाएं और' run' और 'bt' टाइप करें)? –

+0

@ राफलावाविकि, बस अपने झंडे के साथ संकलन के बाद जीडीबी जानकारी जोड़ा – highBandWidth

उत्तर

1

आपकी त्रुटि का सबसे संभावित कारण यह है कि प्रोग्राम_प्शन हेडर फ़ाइलों में प्रस्तुत इंटरफेस और आपके संकलित लाइब्रेरी में उठाए गए कार्यान्वयन के बीच एक मेल नहीं है। यह या तो हो सकता है क्योंकि आप गलती से एक अलग संस्करण से संकलित लाइब्रेरी उठा रहे हैं या शायद आपने संकलक के विभिन्न संस्करण के साथ पुस्तकालय संकलित किया है जिसे आप अपने परीक्षण कार्यक्रम को संकलित करने के लिए उपयोग कर रहे हैं।

+0

उदाहरण के लिए जांच करने का कोई तरीका है, संकलित लाइब्रेरी का कौन सा संस्करण है, या लाइब्रेरी उत्पन्न करने के लिए किस कंपाइलर का उपयोग किया गया था? – highBandWidth

+0

लिनक्स पर आप इस जानकारी को अधिक जानने के लिए objdump -x का उपयोग कर सकते हैं (SO नाम, glibc और cxxabi संस्करण)। हालांकि ओएस एक्स के बारे में पता नहीं है –