記一次幫朋友除錯私服服務端的過程

2021-10-05 05:15:26 字數 1478 閱讀 2842

因為遊戲太老了,原公司早都沒了,所以有很多奇怪的bug。

服務端大概是這樣的:

group端管理角色的建立,賬號等等

gate端負責和玩家,group,game 3方通訊

game端管理地圖和指令碼(為了熱更新)

gate端負責和玩家通訊,那麼玩家切換地圖會是gate通知game2,這玩家切換從game1切換到了game2。game1釋放空間在地圖上刪除角色,然後game2分配角色堆記憶體。為了節省效能,只會定期統一寫入或角色被移除的時候才會寫到資料庫(哪個game分配的角色,儲存哪個game的資料),也就是說切換地圖和下線。

bug出現了!

玩家在切換地圖瞬間,用另外乙個客戶端踢掉自己,我們理一下服務端會做什麼蠢事。

game1通過gate通知game2有玩家過去了。

game2建了角色模型,但是並沒有和玩家真正建立關係,只是提前建了個模型,和把玩家資訊讀取到了。

game1發現玩家掉線,儲存當前副本資料,角色所在位置等等。game1角色刪除。

再次切換地圖到game2去,遊戲發現角色衝突,踢掉角色,儲存game2的角色到資料庫。

重新上線,我們發現物品又回來了,造成了回檔。但是剛才在game1交易給別人的東西,別人也有,這不就可以一生二,二生四發財了嗎?

因為沒有原始碼,所以使用遊戲熱更新指令碼用了最low的辦法,檔案鎖來處理。保證不會有衝突角色,如果有直接踢掉,根本不會讓你有回檔刷東西的可能。

過了兩天,朋友告訴我,遊戲內玩家很卡,無法正常使用物品。

開始我猜測會不會是我的檔案鎖和物品使用在乙個執行緒上導致的阻塞。

我開始檢查io和網路吞吐量一一進行排查。甚至還讓我朋友伺服器換了硬碟,也沒發現有好轉。

最後發現,和這些都沒關係,我的檔案鎖是完全單獨的執行緒在工作。

無奈,掏出ida,逆向game

根據遊戲日誌打點找到關鍵字,ida搜尋字串,找交叉引用發現個奇怪的地方。

清楚的看見gettickcount和乙個全域性變數,再往下看就是棧變數和全域性變數相減做比較0x0c8h(200)。很可疑,做比較用來幹嘛?tab進入偽**

ok,這是個static的變數,如果相差<200直接返回,如果》200記錄當前時間。怪不得玩家使用物品卡呢,**是卡啊,服務端根本沒處理,這不就等於一秒只允許5個玩家使用物品嗎,其他玩家等著下蛋。

直接把這段限時給nop掉了,再測試,ok,解決。

總結:雖然沒有做過遊戲開發,但是這幾次幫朋友修私服bug自己也學到了一些經驗。比如那個回檔bug,希望我以後寫的東西不會有這麼迷的bug。

記一次慘痛的除錯經歷

背景 在處理乙個重新命名操作時,需要將檔案以指定的名稱存到指定的目錄下,同時將原目錄下的相關檔案全部刪除 問題 能夠將原始檔重新命名,分片mp4的形式能夠將整個目錄刪除,但以整段mp4刪除時,始終無法刪除對應的.property檔案 解決經歷 1.在xcode下模擬,始終是不會出現任務刪除不掉問題 ...

記一次蛋疼的除錯

起因是醬紫的 有個學弟給他的學弟出了一道題 下面是用阿姆斯特朗加密演算法加密後的一串數字,解密它!數字內容 2032951656 1629517167 1981834610 544830053 1685024615 0 關於阿姆斯特朗迴旋加速噴氣式阿姆斯特朗加密演算法的第一步 該演算法首先讀入一段文...

記一次快速排序演算法的除錯

同學用c 編寫了乙個快速排序的程式,實現如下功能 1,用乙個陣列包含原始資料 2,用乙個陣列包含每個原始資料的位址 3,利用快速排序演算法,對第二個陣列進行排序。很顯然,排序的交換操作與原始資料的儲存分開進行,是為了節省時間。演算法寫出來了,程式編譯執行了,但是 排序前和排序後,輸出的結果居然是一樣...