一、事情起因
一条线程调用了Map 的一个erase方法 结果dump了
二、原因假设
1、Map中的的数据被其他线程释放了,通过find验证了一下,不可能,数据还在,活生生的
2、Map中的数据被覆盖了或者被改写了 分析结果:看了一下数据,都没错,字节也都对齐
3、通过单步调试发现,在STL内部调用结尾释放指针是,所指的地址出现异常,正常情况应该是一个空指针,结果是有了一个莫名的值。怀疑这部分数据被篡改。
但是到底是哪里呢,。。。。。。。。。。。。。。。。。。一个漫长的注释,反注释调试的过程。终于在这个的一个地方 发现了问题的原因
三、问题场景
线程1
memcpy(m_curProxyAddr.szUserPass, m_curProxyAddrInfoEntity->szUserPass, 50);
线程2
m_CallSyncMap.erase(pReq->lSyncID);
m_curProxyAddr.szUserPass 这个是一个 size=33的缓冲区,在这33的缓冲区 cpy了一个大小为50 的缓冲区,这样就会产生一个未知的行为,
而这个未知行为的表现就是导致线程2的erase出错。
四、教训
在做相关内存copy时,一定要注意长度的精确掌控
关于C++的一个栈空间被占用问题的总结,布布扣,bubuko.com
关于C++的一个栈空间被占用问题的总结
原文:http://blog.csdn.net/lenyusun/article/details/24555349