锁释放时程序崩溃

来源:互联网 发布:好听的网络翻唱 编辑:程序博客网 时间:2024/06/05 14:17

问题:程序ereas List中的数据后,释放list的锁,程序崩溃,1个小时内三次。

length - nleft is 264
readn = 264 ppid = 139968191751936
frame 1 -- /lib64/libc.so.6() [0x376e832a20]
frame 2 -- /usr/lib64/libstdc++.so.6(_ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS_+0x164) [0x377406a244]
frame 3 -- ./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE5eraseESt17_Rb_tree_iteratorIS4_E+0x27) [0x428c2f]
frame 4 -- ./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE5eraseESt17_Rb_tree_iteratorIS4_ESC_+0xa3) [0x4284e9]
frame 5 -- ./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE5eraseERS1_+0x68) [0x427568]
frame 6 -- ./datactlserver(_ZNSt3mapIjP13RecvStateInfoSt4lessIjESaISt4pairIKjS1_EEE5eraseERS5_+0x23) [0x426adf]
frame 7 -- ./datactlserver(_ZN11CThreadPool16PopSockStateInfoEi+0x83) [0x42651d]
frame 8 -- ./datactlserver(_ZN11CRecvThread12PopSockStateEv+0x3b) [0x42afb7]
frame 9 -- ./datactlserver(_ZN11CRecvThread3RunEv+0x5bd) [0x42ac23]
nread = 1048312
xxnleft is 1048312
xxxxxxnread = 1048312
xxnleft is 0

这个问题并非是释放锁失败而是如下double free or corruption 

delete sock state info
*** glibc detected *** ./datactlserver: double free or corruption (out): 0x00007f0f0c01f300 ***
======= Backtrace: =========
/lib64/libc.so.6[0x376e875676]
./datactlserver(_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKjP13RecvStateInfoEEE10deallocateEPS7_m+0x20)[0x428fe4]
./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE11_M_put_nodeEPSt13_Rb_tree_nodeIS4_E+0x28)[0x428dce]
./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE15_M_destroy_nodeEPSt13_Rb_tree_nodeIS4_E+0x5a)[0x42869a]
./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE5eraseESt17_Rb_tree_iteratorIS4_E+0x3e)[0x428c56]
./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE5eraseESt17_Rb_tree_iteratorIS4_ESC_+0xa3)[0x4284f9]
./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE5eraseERS1_+0x68)[0x427578]
./datactlserver(_ZNSt3mapIjP13RecvStateInfoSt4lessIjESaISt4pairIKjS1_EEE5eraseERS5_+0x23)[0x426aef]
./datactlserver(_ZN11CThreadPool16PopSockStateInfoEi+0x83)[0x42652d]
./datactlserver(_ZN11CRecvThread12PopSockStateEv+0x3b)[0x42aff5]
./datactlserver(_ZN11CRecvThread3RunEv+0x5bd)[0x42ac33]
./datactlserver(_ZN7CThread14ThreadFunctionEPv+0x27)[0x42d201]
/lib64/libpthread.so.0[0x376f0077e1]
/lib64/libc.so.6(clone+0x6d)[0x376e8e18ed]

解决:函数执行失败调用了一次释放函数,程序并没有退出,继续执行,在后面又调用了一次释放函数导致程序释放两次内存,程序崩溃,逻辑问题。

原创粉丝点击