Segmentation faults bij boost program options

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb een programma gemaakt die ik op een raspberry pi 2 compileerde en dit draaide zonder problemen. Pi is is overleden (...) en wilde dit nu op een Pi 3 doen. Hetzelfde programma geeft een segmentation fault.

Programma gebruikt boost program options. Zodra ik hier een variabele aan toegvoeg gaat het mis.

Wat relevante code:
constructor:
code:
1
2
3
4
5
6
7
8
v_AppName = boost::filesystem::basename(argv[0]); 
po::options_description desc("Opties"); 
ProgramOptions(desc);
po::variables_map vm; 
try 
{ 
  po::store(po::parse_command_line(argc, argv, desc), vm);
<rest is weg>



Functie om opties toe te voegen:
code:
1
2
3
4
5
6
7
 void Client::ProgramOptions(boost::program_options::options_description & l_Desc)
  {
    l_Desc.add_options()
    ("help,h", "Toont gebruik programma")
    ("toon,t", "Toont huidige IO en instellingen")
    ("TEST", po::value<int>(), "TEST");
  }


Dit gaat fout. Als ik de optie met "TEST" weghaal gaat het goed. Stracktrace biedt geen oplossing:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#0  0x76f17f24 in boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool) const () from /usr/lib/arm-linux-gnueabihf/libboost_program_options.so.1.55.0
No symbol table info available.
#1  0x76f13220 in boost::program_options::store(boost::program_options::basic_parsed_options<char> const&, boost::program_options::variables_map&, bool) ()
   from /usr/lib/arm-linux-gnueabihf/libboost_program_options.so.1.55.0
No symbol table info available.
#2  0x0003cae0 in warmte::Client::Client (this=0x7efff618, argc=1, argv=0x7efff794) at src/client.cpp:38
        timeout = {<boost::date_time::base_time<boost::posix_time::ptime, boost::date_time::counted_time_system<boost::date_time::counted_time_rep<boost::posix_time::millisec_posix_time_system_config> > >> = {<boost::operators_impl::less_than_comparable<boost::posix_time::ptime, boost::operators_impl::equality_comparable<boost::posix_time::ptime, boost::posix_time::ptime, boost::operators_impl::operators_detail::empty_base<boost::posix_time::ptime>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_base<boost::posix_time::ptime>, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::less_than_comparable1<boost::posix_time::ptime, boost::operators_impl::equality_comparable<boost::posix_time::ptime, boost::posix_time::ptime, boost::operators_impl::operators_detail::empty_base<boost::posix_time::ptime>, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::equality_comparable<boost::posix_time::ptime, boost::posix_time::ptime, boost::operators_impl::operators_detail::empty_base<boost::posix_time::ptime>, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::equality_comparable1<boost::posix_time::ptime, boost::operators_impl::operators_detail::empty_base<boost::posix_time::ptime> >> = {<boost::operators_impl::operators_detail::empty_base<boost::posix_time::ptime>> = {<No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, time_ = {time_count_ = {
                value_ = 8569444509916594175}}}, <No data fields>}
        desc = {static m_default_line_length = 80, m_caption = "Opties", m_line_length = 80, m_min_description_length = 40,
          m_options = std::vector of length 3, capacity 4 = {{px = 0x6d168, pn = {pi_ = 0x6d980}}, {px = 0x6d188, pn = {pi_ = 0x6f588}}, {px = 0x6f628,
              pn = {pi_ = 0x6f690}}}, belong_to_group = std::vector<bool> of length 3, capacity 32 = {0, 0, 0},
          groups = std::vector of length 0, capacity 0}
        vm = <incomplete type>
#3  0x0003c92c in main (argc=1, argv=0x7efff794) at src/client.cpp:17
        client = {_vptr.Client = 0x57418 <vtable for warmte::Client+8>, vp_Shm = 0x0, vp_Region = 0x0, v_AppName = "warmteclient", l_Index = 0,
          l_Result = 1}

regel 38 is waar po::store staat

Heb andere boost versies geprobeert maar dat mocht niet lukken.

[ Voor 39% gewijzigd door elgringo op 21-11-2017 22:35 ]

if broken it is, fix it you should

Alle reacties


Acties:
  • +3 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Op Stack Overflow had je nu 5 close votes gehad voor "niet reproduceerbaar". Als regel 38 crashed, dan lijkt het me wel zo toepasselijk om die te tonen in plaats van een ongerelateerde functie om opties toe te veogen.

Ja, logisch dat als je de optie in kwestie weglaat, dat het dan "werkt". po::store gaat alleen waardes opslaan die herkend worden. Als er geen `TEST` optie is, dan doet `--TEST=5` niets. Is die er wel, dan moet die waarde 5 ergens heen. En het is jouw taak om te zorgen dat Boost die waarde ergens kwijt kan. Heb jij geen object, dan krijg je potentieel een segfault ja.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Regel 7 is op de echte code regel 38; ik dacht dat dit duidelijk was maar dat bleek niet het geval te zijn. (zie onderaan de post)

Hij crasht al met alleen regel '("TEST", po::value<int>(), "TEST");' ongeacht of ik de parameter TEST meegeef aan de applicatie.

Dank voor je bijdrage; jammer dat deze niet zinvol is.

Oorzaak was dat boost libraries dynamisch gelinkt waren en tijdens uitvoeren van de applicatie andere libraries werden geladen.

if broken it is, fix it you should