游戏编程中 令进程崩溃的错误总结

工作中使用的C++服务器,稍有不甚就会导致进程崩溃。那么游戏就需要停止更新维护,会造成玩家流失。

今天来总结一下,之前碰到过的服务器崩溃问题。很庆幸(烧香拜佛),我的代码只造成过内网开发服的崩溃,外网正式服一次崩溃没有,感激,感激,侥幸,侥幸。

 

1.数组和vector下标越界。

如果有人对每一次崩溃做总结,我想这个问题能占百分之40。

随便举个例子,等级礼包。

如果我们的数据结构是:

const int MAX_ROLE_LEVEL_REWARD_NUM = 3;
int m_role_level_reward_state[MAX_ROLE_LEVEL_REWARD_NUM];

m_role_level_reward_state这个变量的上限是3,假设我们某一次引用用了大于3的下标,那么就越界了。以下这种写法,认为是危险的。

void UpdateRoleLevelReward(int index)
{
    m_role_level_reward_state[index] = 1;  
}

因为没有判断边界。外面的东西我们控制不了,只能要求自己的代码部分稳妥。所以我们要加上下标范围判断

void UpdateRoleLevelReward(int index)
{
    if (index < 0 || index >= MAX_ROLE_LEVEL_REWARD_NUM) return;
    m_role_level_reward_state[index] = 1;  
}

如果外围需要我们返回状态,那么可以写成返回bool的函数:

bool UpdateRoleLevelReward(int index)
{
    if (index < 0 || index >= MAX_ROLE_LEVEL_REWARD_NUM) return false;
    m_role_level_reward_state[index] = 1;  
    return ture;
}


2.空指针。

空指针问题估计也能占到百分之40。这个问题不太好举例。因为问题比较分散。

为了避免,通常会在使用指针前,判空。

 

3.字符串格式化

简单讲就是类似c语言里的sprintf函数,可能出现格式化的时候传了错误的参数。

这个问题经常出现在log系统里面。

 

4.vector迭代器失效。

通常出现在遍历vector时,循环里面有erase操作。需要特别注意。

 

5.死循环。

这类问题也不好举例。而且最难查,上面的情况,崩溃之后通常会有个堆栈,用gdb看堆栈会有思路。

死循环会使得进程cpu占用百分之99。死循环只能靠svn帮忙了,哪个版本是好的,哪个版本开始出的问题,修改了哪些内容,打断点排查。

除了一般的循环里,还会有一种递归没出回溯的死循环。要是用了递归要特别小心回溯条件。

posted @ 2018-03-06 17:30  姚二二姚  阅读(207)  评论(0编辑  收藏  举报