cocos2dx鬥地主產品錯誤修復過程

一個多星期沒有寫新的東西了。下面內容是最近修復的一個bug的過程記錄。

問題描述:
1. 產品需要進行修改密碼的動作。點擊提交後,界面死去響應。

解決問題過程紀錄:
1. 修改密碼沒有收到回覆,同時正在加載窗口沒有銷掉;
2. 抓包查看是否有包發出去;或者跟服務器端確認;
http://www.tastycocoabytes.com/cpa/
cocoa packet analyzer
這個工具沒有深入使用。貌似pc也有類似的比較不錯的產品叫debugview. 我的同事使用比較多。可以比較方便的查找tcp數據包的通信;對於未加密數據的跟蹤一個很好的選擇。
3. 嘗試錯誤重現:點擊後,界面仍然失去響應,但是重新登陸時提示密碼錯誤。看來密碼已經被修改;
4. 使用filediffer比較文件差異。這是mac環境不錯的工具,方便比較代碼的差異,不錯的工具。但是沒有發現有用的信息。幾個有懷疑的地方,和舊版本是代碼一致的。奇怪的事情就是舊版本功能測試正常。
5. 繼續跟蹤,打開產品的log開關,發現一個意義的信息。就是發送消息後,服務器端的回包成功返回,並且加入到消息隊列等待使用。
相關代碼沒有能夠將message pop出來,導致界面上沒有任何提示。

void BaseLayer::dohandle(float dt)
{
//此處出錯, mController空指針,無法繼續執行。
if (mController == NULL) {
return;
}
while(MyQueue::sharedInstance()->count() >0 && MyQueue::sharedInstance()->isPopUnlock()==false)
{
Message *message = (Message*)MyQueue::sharedInstance()->pop();
if(message)
{
m_currentMillisecondTime = TimeUtil::millisecondNow();
retryTimes = 0;
mController->handleLogic(message);
MyQueue::sharedInstance()->removeObject(message);
}else
{
//CCLog("BaseLayer::dohandle message or controller is null");
LoggerUtil::getLogger()->logInfo("BaseLayer::dohandle message or controller is null");
}
}
}

6. 解決辦法,按照現有的客戶端框架,增加專門layer來包裝一個view,controllor

bool ProfileLayer::init()
{
LoggerUtil::getLogger()->logInfo(__FUNCTION__);

bool bRet = false;

do {
CC_BREAK_IF(! BaseLayer::init() );

ModuleTabView* node = ModuleTabView::create();
mController = new ProfileController();
node->setTouchDelegate(mController);
mController->setNode(node);
this->addChild(mController->getNode());
bRet = true;
} while (0);
return bRet;
}


7. 繼續解決,增加ProfileController, 負責處理兩個界面的網絡回包和touch事件
提前釋放
解決辦法:
mController = ProfileController:new();
修改爲:
mController = new ProfileController();
profileLayer.cpp
9. 將原先的handleLogic(inputMessage)相關代碼複製
ios運行正常
10. 修改jni/Android.mk
將新增的cpp文件添加到腳本
./build_native.sh
編譯通過,測試通過
終於解決上述問題。修改別人的代碼,確實感覺象捅馬蜂窩,但是我們沒的選擇。無法改變的,就要去接受。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章