我昨天修复了链接器错误并在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
请帮我解决这个问题。非常感谢你。
答案 0 :(得分:0)
根据符号名称中是否存在__1,我大约99%确定你在这里混合使用libc ++和libstdc ++。您的应用程序链接到哪个标准库?你的助推器? C ++驱动程序?
通常,C ++驱动程序,boost库和应用程序都必须使用相同的C ++运行时库和语言标准: