这两天里发生的几件事儿

  这周发生了几件事情,让我对于程序有了新的认识,记录一下:

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一起使用的威力

posted @ 2010-11-30 21:22  南山一小妖  阅读(338)  评论(0编辑  收藏  举报