std :: regex上的分段错误以及使用C ++驱动程序的多线程时

时间:2015-11-09 07:21:25

标签: c++ multithreading mongodb c++11 segmentation-fault

我昨天修复了链接器错误并在Ubuntu上运行了这个项目。它会引发分段错误。我尝试使用gdb调试它,但它没有工作。这个代码在带有Xcode的Mac OS X下稳定(效果很好)。 这是该项目的最新代码。它应该使用g ++ - 4.9进行编译。 我的源代码链接: https://github.com/DengYiping/Shuoshuo_crawler

如果您有兴趣抓住腾讯最大的社交网络之一,请帮我改进这个项目。

在没有多线程的情况下执行它时(当要求您输入线程数时输入1),在运行约20秒后,它会在类型std::regex_traits<char> 上引发分段错误

以下是gdb中的消息:

[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./qq_crawler'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000000000043cbf8 in std::__detail::_State<std::regex_traits<char> >* std::__uninitialized_copy<false>::__uninit_copy<std::__detail::_State<std::regex_traits<char> >*, std::__detail::_State<std::regex_traits<char> >*>(std::__detail::_State<std::regex_traits<char> >*, std::__detail::_State<std::regex_traits<char> >*, std::__detail::_State<std::regex_traits<char> >*) ()
(gdb) bt
#0  0x000000000043cbf8 in std::__detail::_State<std::regex_traits<char> >* std::__uninitialized_copy<false>::__uninit_copy<std::__detail::_State<std::regex_traits<char> >*, std::__detail::_State<std::regex_traits<char> >*>(std::__detail::_State<std::regex_traits<char> >*, std::__detail::_State<std::regex_traits<char> >*, std::__detail::_State<std::regex_traits<char> >*) ()
#1  0x000000000043891c in std::_Function_base::_Base_manager<std::__detail::_AnyMatcher<std::regex_traits<char>, false, true, true> >::_M_clone(std::_Any_data&, std::_Any_data const&, std::integral_constant<bool, false>) ()
#2  0x0000000000434c4e in std::_Function_base::_Base_manager<std::__detail::_AnyMatcher<std::regex_traits<char>, false, true, true> >::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation) ()
#3  0x00000000004288a4 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<std::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, std::regex_traits<char>, false>::_M_lookahead(std::__detail::_State<std::regex_traits<char> >) ()
#4  0x0000000000426036 in void std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<std::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, std::regex_traits<char>, true>::_M_dfs<true>(long) ()
#5  0x0000000000425bf2 in void std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<std::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, std::regex_traits<char>, false>::_M_dfs<false>(long) ()

当我致电std::move时,我尝试通过删除std::match substrings上的substrings[1]来解决此问题。我将其从json_string = std::move(substrings[1])更改为json_string = substrings[1];。我知道这可能导致额外的内存使用,并且在直接分配时可能调用memcpy()但错误仍然相同!!!

奇怪的是,当我打开多线程时,它会在boost库上抛出不同的消息,mongo-cxx-driver依赖于该消息。 这次它会立即引发分段错误:

[Switching to Thread 0x7fffebfff700 (LWP 7268)]
0x00007ffff7bd1150 in std::__1::__tree<std::__1::__value_type<void const*, boost::detail::tss_data_node>, std::__1::__map_value_compare<void const*, std::__1::__value_type<void const*, boost::detail::tss_data_node>, std::__1::less<void const*>, true>, std::__1::allocator<std::__1::__value_type<void const*, boost::detail::tss_data_node> > >::destroy(std::__1::__tree_node<std::__1::__value_type<void const*, boost::detail::tss_data_node>, void*>*) ()
   from /usr/local/lib/libboost_thread.so.1.59.0
(gdb) bt
#0  0x00007ffff7bd1150 in std::__1::__tree<std::__1::__value_type<void const*, boost::detail::tss_data_node>, std::__1::__map_value_compare<void const*, std::__1::__value_type<void const*, boost::detail::tss_data_node>, std::__1::less<void const*>, true>, std::__1::allocator<std::__1::__value_type<void const*, boost::detail::tss_data_node> > >::destroy(std::__1::__tree_node<std::__1::__value_type<void const*, boost::detail::tss_data_node>, void*>*) ()
   from /usr/local/lib/libboost_thread.so.1.59.0
#1  0x00007ffff7bc4383 in boost::detail::thread_data_base::~thread_data_base()
    () from /usr/local/lib/libboost_thread.so.1.59.0
#2  0x00000000004c6367 in ~thread_data (this=0x27b1930, 
    __in_chrg=<optimized out>)
    at /usr/local/include/boost/thread/detail/thread.hpp:90
#3  boost::detail::thread_data<std::_Bind<std::_Mem_fn<void (mongo::BackgroundJob::*)()> (mongo::BackgroundJob*)> >::~thread_data() (this=0x27b1930, 
    __in_chrg=<optimized out>)
    at /usr/local/include/boost/thread/detail/thread.hpp:90
#4  0x00007ffff7bc4a6e in boost::(anonymous namespace)::thread_proxy(void*) ()
   from /usr/local/lib/libboost_thread.so.1.59.0
#5  0x00007ffff700b182 in start_thread (arg=0x7fffebfff700)
    at pthread_create.c:312
#6  0x00007ffff6b2147d in clone ()
    at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

请帮我解决这个问题。非常感谢你。

1 个答案:

答案 0 :(得分:0)

根据符号名称中是否存在__1,我大约99%确定你在这里混合使用libc ++和libstdc ++。您的应用程序链接到哪个标准库?你的助推器? C ++驱动程序?

通常,C ++驱动程序,boost库和应用程序都必须使用相同的C ++运行时库和语言标准:

https://github.com/mongodb/mongo-cxx-driver/wiki/Download-and-Compile-the-Legacy-Driver#scons-options-when-compiling-the-c-driver