开发的时候碰到的问题

本文来自肥宝传说之路,引用必须注明出处!

2016年12月5日

14. 数组使用大括号初始化,是C++11的新内容,好像我们linux的g++的版本不能支持这个。

CRoleSkillPosPtr po = new CRoleSkillPos(gateEntity->getEntityId().id, posIdx, skillCode, seriesId);
Message::Db::Tables::SeqTPlayerRoleSkillPos roleSkillPoss = { po->_tPlayerRoleSkillPos }; 
_skillPosMap[posIdx] = po;//保存数据库
CDbHelper::getIRoleDbPrx()->saveOrUpdateRoleSkillPos_async(NULL, roleSkillPoss);

===============================================好久没有分割线了=====================================================================


2016年8月20日

13.装完VS后,编译,全部报错说找不到winsock2,找个windows sdk装一下。因为网管有时候装的系统是阉割版的,漏了一些东西。

===============================================再来一次分割线=======================================================================


2016年7月29日

12.在VS上,每次启动程序的时候,都需要编译某几个文件,程序执行也没发现什么问题。但是每次启动,就必然要编译一下。

改了系统时间导致,之前某次改时间来测试某些功能的时候,碰到过。

例如今天是2016年7月29日,因为测试需求,改到30日。

然后又不小心改了代码,保存了,这个时候文件修改日期是2016年7月30日。

后来测试完毕,改回正常的系统日期2016年7月29日。

这个时候点击编译或者启动程序的时候,VS就会查看到有的文件修改时间(30日)比最新的编译的时间更加新,就会编译一下。每次都这样。

解决办法就是修改一下,之前改过的文件,保存,就会变成29日的文件了。或者等到明天,文件时间过了。或者文件太多,时间又太远,只能提交,然后删掉,从SVN下载下来重新编译一下了。

改系统时间还会有很多问题,一定要小心再小心!!!

=================================================淫荡的分割线=======================================================================


2016年7月21日

11.今日继续找那个突然中断的bug。

(1)空指针,看堆栈发现是定时器,但是定时器是在另外一个线程的,而且由于空指针,几乎没有任何有用的信息可以查看。

(2)通常碰到这种情况,最好就是看看能不能重现,能重现就能推测出更多的信息。初步发现是在战斗中才会出现的。

(3)在CellApp中,全局搜索一下,发现其中用到的定时器不多,Life、Buff、Boss AI、Boss refresh,还有一些跟战斗完全无关的。

(4)看了一下代码,是在看不出哪里有问题,之前发现cancel之前把timer置空了,后来补回来了,还是出现。

(5)用客户端试了好几次,还是硬找出了一些新的规律。

一定是在战斗中出现。

为了降低影响,把主角拉进一个没有任何东西的副本,刷了一只怪来打。

第一次战斗是不会出现的,只有主角被打死,然后复活,再去打怪才会出现。

不是第二次战斗就一定会出现,但是概率比较高,即使不出现,也会在之后一定出现。

改了测试接口,可以调不通的血,只要血足够,一定会出现。

从时间上来看,是打着打着出现的,并不是一攻击就出现中断。

(6)其实这些规律并没有缩小了多少范围,因为一直都知道是战斗的。是在没办法,最后先把buffTimer注释掉看看。发现还是有问题。

(7)然后再注释LifeTime的时候,发现就不会中断了。

(8)最后确定问题,先贴几个代码先。

void CellApp::CLifeManager::processLifePool()
{
if (!_fightEntity || !_fightEntity->isPlayer())
{//不是玩家
_lifePoolTimer->finalLifePoolTimer();
_lifePoolTimer = NULL;
return;
}
void CellApp::CLifeManager::enterFightStatus()
{
if (!_fightEntity->isPlayer())
{
return; //这个if语句是后来加上去的!!!!!!!!!!!!!
}
cdf::CReactor::instance()->cancelAll(_lifePoolTimer);
//进入战斗
cdf::CReactor::instance()->schedule(
_lifePoolTimer,
NULL,
cdf::CInterval(4000),
cdf::CInterval(4000)
);
}
这个是进入战斗的时候调用的函数。lifeTimer是在构造函数的时候初始化了。但是在上面被清了。在第二次进入战斗的时候。开启定时器,传进去的实际上是空指针。

这个是LifeTimer调用的执行函数,这里把不是player的实体的定时器,都置空了。

底层代码也没有检测空指针。在时间足够了触发,就产生了空指针的错误。

现在对照一下之前的迹象:

第一次战斗是不会出现的,只有主角被打死,然后复活,再去打怪才会出现。

是的,第一次战斗就吧boss的lifeTimer清掉了,所以第一次不会有事。

不是第二次战斗就一定会出现,但是概率比较高,即使不出现,也会在之后一定出现。

定时器是4秒循环,如果在这个时间内,把玩家打死,是不会出现问题的。

改了测试接口,可以调不通的血,只要血足够,一定会出现。

血够多导致4秒内打不死,触发定时器。

从时间上来看,是打着打着出现的,并不是一攻击就出现中断。

还是定时器的问题,定时器触发的有时候有点随机性

解决方法:

不要传空指针进去cdf::CReactor::instance()->schedule()函数


===========================================弱弱的分割线=======================================================

2016年7月20日 新增

10.今日发现CellApp的实体在退出副本之后生命管理器还在回血,没有清除,各种信息完好保存。初步看上去,FightEntity的fianl函数,析构函数都有设置为Null。调试的时候发现,指向为2个,final了FightEntity之后,还有一个地方没有清除掉。这是LifeManager的定时器和LifeManager互相指向,指针没有被释放。

本来,设计是树形的,FightEntity -> LifeManager -> LifeTimer。一层一层析构还是可以很安全地执行清除。但是为了方便,实际指针是双向的。FightEntity <-> LifeManager <-> LifeTimerd,单独清一个,链接导致还存在引用而漏掉。

解决办法:在finalEntity()里面清除所有信息是可以,但是很多,而且容易漏掉。现在规定是每个下级的结构,都必须有一个final函数,独自清除下级自己的内容。在finalEntity()里面调用lifeManager->finalxxxx(),在LifeManager->finalxxx()里面调用lifeTimer->finalXXX().

简单来说,就是不要把太多解耦的动作放到析构函数里面,另外弄一个final函数出来,主动调用解耦 


===========================================强悍的分割线=======================================================

2016年7月14日 新增

9.调试战斗的时候,突然发现有空指针,看堆栈,发现是定时器的问题。

但是定时器是一个独立的线程,堆栈中没有我们自己写的代码,而且定时器为Null。

着说明,不知道哪里写了设置为Null,但是又忘记cancel掉了。

这次是通过不停打日志,缩小范围,最终确定具体地方。发现cancel了另外一个定时器,然后删掉本来的。于是就这样了。


===========================================华丽的分割线=======================================================

1.在IOS上运行,发现没地图,其他地方正常

看看编译的是什么文件,默认好像是生成lib的。选择fanren Mac

文件太多,报错没看得到


2.客户端一打开某个界面,调用某个接口,就被提示断线
服务端对没有注册的接口,被调用了,就立刻断线。所以去找服务端哥哥吧


3.有些时候飘字一串很长的东西,能看到是D盘,有文件目录,大概意思是序列化错误。
其实这个目录是服务端代码的目录。接收到来自客户端的数据包,进行反序列化的时候,出现错误。这是因为调接口时候传的参数结构对不上


4.每次登陆后都出现在出生点
9成是服务端问题,首先要确定移动的时候,服务端有没有修改位置,看数据库可以看到。
接着看刷新登陆后,是不是正常初始化
如果还没找到问题,看看cellapp有没有进入成功


5.底层engine关联问题,表现很多,没有确定的征象
这种问题应该只会在页游的代码出现,页游服务端要配包含库之类的东西,看看是不是当前项目的。
手游应该不会,手游是对相对位置的lib文件夹的。

现在新的服务端都改了,应该很少碰到了。


6.服务端的,其他APP发到GateApp之后,直接转发给客户端,收到的结构是空的
暂时还没发现哪里出了问题,同样的代码在jxy和dbtx都不会出现问题。
把内容重新构造一个发过去是能整成的,待解决!!!!!!!!!!!


7.src\Client\project\fanren\Resources\FanRen目录的lua文件是怎么加密的?
LuaSvn_JenKins.sh/////还没细看


8.代码生成例如cdl2lua、cdl2cpp之类,点了运行正常,就是没有看到任何报错,就停在那里,也没有文件生成出来
后来发现是没有对应的目录,程序不能自动生成目录。要创建好对应的目录


posted @ 2016-03-04 17:55  肥宝游戏  阅读(146)  评论(0编辑  收藏  举报