伺服器定時器處理要注意的問題
阿新 • • 發佈:2018-12-27
gdb) bt
#00x00ff9410in __kernel_vsyscall ()
#10x004d593ein __lll_mutex_lock_wait () from /lib/libc.so.6
#20x00465b38in _L_lock_14080 () from /lib/libc.so.6
#30x00464df4in free () from /lib/libc.so.6
#40x006c7691inoperator delete () from /usr/lib/libstdc++.so.6
#50x08059cfbin __gnu_cxx::new_allocator<std::_List_node<TTimeEvent> >::deallocate (this=0x98e0064, __p=0x98e1218)
at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/ext/new_allocator.h:94
#60x08059d20in std::_List_base<TTimeEvent, std::allocator<TTimeEvent>>::_M_put_node (this=0x98e0064, __p=0x98e1218)
at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/ 4.1.1/bits/stl_list.h:320
#70x08059d81in std::list<TTimeEvent, std::allocator<TTimeEvent>>::_M_erase (this=0x98e0064, __position=
{_M_node =0x98e1218}) at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/stl_list.h:1150
#80x08059db3in std::list<TTimeEvent, std::allocator<TTimeEvent> >::pop_front (this=0x98e0064)
at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/stl_list.h:747
#90x08059334in CTimerManager::Process (this=0x98e0058) at src/timermanager.cpp:168
#100x080597ddin Process (nSigNo=14) at src/timermanager.cpp:199
#11<signal handler called>
#120x004612bain _int_free () from /lib/libc.so.6
#130x00464e00in free () from /lib/libc.so.6
#140x006c7691inoperator delete () from /usr/lib/libstdc++.so.6
#150x006a424din std::string::_Rep::_M_destroy () from /usr/lib/libstdc++.so.6
#160x0069e40fin std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char>>::~basic_stringbuf ()
from /usr/lib/libstdc++.so.6
#170x0069fd7fin std::basic_stringstream<char, std::char_traits<char>, std::allocator<char>>::~basic_stringstream ()
from /usr/lib/libstdc++.so.6
#180x080524eain CDBMoudle::Insert (this=0x98e6e80, tFixkey=@0xbfe1c6ec) at src/dbmoudle.cpp:59
#190x08051718in CConnectionTask::ProcFixContent (this=0x98e6510) at src/connectiontask.cpp:218
#200x0805196ein CConnectionTask::HandleRead (this=0x98e6510) at src/connectiontask.cpp:86
#210x08051a0fin CConnectionTask::Handle (this=0x98e6510, nEvent=1) at src/connectiontask.cpp:52
#220x080585afin IServer::Run (this=0xbfe1c7e0) at src/server.cpp:133
#230x08055328in main (argc=2, argv=0xbfe1c8b4) at src/main.cpp:19 在#13處,呼叫free函式, 然後進入與之相關的libc函式呼叫中.但是, 在這個呼叫還沒有完結之前被定時器管理模組中斷, 進入了定時器處理的部分, 在在這個處理中同樣呼叫了free函式, 於是出現了死鎖的情況--因為malloc/free函式族不是可重入的, 在
#00x00ff9410in __kernel_vsyscall ()
#10x004d593ein __lll_mutex_lock_wait () from /lib/libc.so.6
#20x00465b38in _L_lock_14080 () from /lib/libc.so.6
#30x00464df4in free () from /lib/libc.so.6
#40x006c7691inoperator delete () from /usr/lib/libstdc++.so.6
#50x08059cfbin __gnu_cxx::new_allocator<std::_List_node<TTimeEvent>
at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/ext/new_allocator.h:94
#60x08059d20in std::_List_base<TTimeEvent, std::allocator<TTimeEvent>>::_M_put_node (this=0x98e0064, __p=0x98e1218)
at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/
#70x08059d81in std::list<TTimeEvent, std::allocator<TTimeEvent>>::_M_erase (this=0x98e0064, __position=
{_M_node =0x98e1218}) at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/stl_list.h:1150
#80x08059db3in std::list<TTimeEvent, std::allocator<TTimeEvent>
at /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/stl_list.h:747
#90x08059334in CTimerManager::Process (this=0x98e0058) at src/timermanager.cpp:168
#100x080597ddin Process (nSigNo=14) at src/timermanager.cpp:199
#11<signal handler called>
#120x004612bain _int_free () from /lib/libc.so.6
#130x00464e00in free () from /lib/libc.so.6
#140x006c7691inoperator delete () from /usr/lib/libstdc++.so.6
#150x006a424din std::string::_Rep::_M_destroy () from /usr/lib/libstdc++.so.6
#160x0069e40fin std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char>>::~basic_stringbuf ()
from /usr/lib/libstdc++.so.6
#170x0069fd7fin std::basic_stringstream<char, std::char_traits<char>, std::allocator<char>>::~basic_stringstream ()
from /usr/lib/libstdc++.so.6
#180x080524eain CDBMoudle::Insert (this=0x98e6e80, tFixkey=@0xbfe1c6ec) at src/dbmoudle.cpp:59
#190x08051718in CConnectionTask::ProcFixContent (this=0x98e6510) at src/connectiontask.cpp:218
#200x0805196ein CConnectionTask::HandleRead (this=0x98e6510) at src/connectiontask.cpp:86
#210x08051a0fin CConnectionTask::Handle (this=0x98e6510, nEvent=1) at src/connectiontask.cpp:52
#220x080585afin IServer::Run (this=0xbfe1c7e0) at src/server.cpp:133
#230x08055328in main (argc=2, argv=0xbfe1c8b4) at src/main.cpp:19 在#13處,呼叫free函式, 然後進入與之相關的libc函式呼叫中.但是, 在這個呼叫還沒有完結之前被定時器管理模組中斷, 進入了定時器處理的部分, 在在這個處理中同樣呼叫了free函式, 於是出現了死鎖的情況--因為malloc/free函式族不是可重入的, 在