这两天里发生的几件事儿
这周发生了几件事情,让我对于程序有了新的认识,记录一下:
1.客户端造成的全服崩溃
在协议中处理字符串时一定要小心再小心。自己写的一个超链接系统接口,在处理超链接字符串参数时,没有充分考虑到异常情况的处理,导致了崩溃,代码大意如下:
void DealStrFromProtocol(std::string str)
{
UINT begin = str.find(key1, 0); // key1表示所要找的关键字1
assert(begin != std::string::npos);
...
UINT end = str.find(key2, begin); // key2表示所要找的关键字2
assert(end != std::string::npos);
std::string newStr = str.substr(begin, end); //此处在发布版本中是非常危险的,因为assert不起作用了
...
}
鉴于此,将代码做了容错处理,并打了日志,修改后如下:
void DealStrFromProtocol(std::string str)
{
UINT begin = str.find(key1, 0); // key1表示所要找的关键字1
assert(begin != std::string::npos);
if (begin == std::string::npos)
{
LogPrintf("协议字符串异常:%s", str.C_Str());
return;
}
...
}
本以为ok了,可是悲剧再一次发生了,崩溃在最不该发生的情况下出现了,当时我都想人间蒸发。。。
原因是我信任了LogPrintf接口,此接口对于异常的字符串没有做好容错处理,导致了再一次崩溃。
一般在接收处理服务器广播的字符串时,处理一定要谨慎,不然就可能出现客户端全服崩溃。
2.windbg在发布版本中跟到的堆栈不可全信
3.关于hash表和vector一起使用的威力