I have a strange issue. I'm using a factory registration pattern which refers internally to a std::map. I'm using this approach for multiple components, and registration happens at multiple points in different units of compilation (aka .cpp files). This happens at static variables initialization time (before 'main' gets called). For some strange reason I get a segfault when I'm referring to
map[key] = value;
(basically when I register a particular pfn). Now, if I move the registrations for that particular troublesome components in the same compilation unit, everything works. Again, if I move back the registration of just one component away, I get a segfault.
I have to say, it's not the first time I use this pattern and it works for the same executable for other components (i.e. components spread across multiple .cpp for another factory type get registered at initialization time without issues, using basically similar source code).
what should I do? For now I've left the registration of the components in the same .cpp (and it works flawlessly). How can I better investigate?
I'm using g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Below stacktrace
0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6 (gdb) bt #0 0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6 #1 0x0000000000413fe9 in std::_Rb_tree_iterator, std::allocator > const, http::servlet* (*)()> >::operator-- ( this=0x7fffffffdff0) at /usr/include/c++/4.4/bits/stl_tree.h:199 #2 0x000000000041379d in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique (this=0x632a20, __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1179 #3 0x00000000004125f2 in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique_ (this=0x632a20, __position=..., __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1217 #4 0x00000000004116c4 in std::map, std::allocator >, http::servlet* (*)(), std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::insert ( this=0x632a20, __position=..., __x=...) at /usr/include/c++/4.4/bits/stl_map.h:540 #5 0x0000000000410a63 in std::map, std::allocator >, http::servlet* (*)(), std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::operator[] ( this=0x632a20, __k=...) at /usr/include/c++/4.4/bits/stl_map.h:450 #6 0x000000000040e3b1 in http::servlet::add_creator (type=0x4234d0 "/gpu/european_opt_xyz", func=0x421567 ) at ./src/http.cpp:336
You could be coming up against the static initialization problem:
https://isocpp.org/wiki/faq/ctors#static-init-order
How are you initialising the map?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With