盧卡斯 發表於 2014-12-2 23:37:44

地圖伺服器隨機性崩潰

伺服器在一次更新後開始隨機性出現crash
使用gdb 取得的debug report 每次產生的資訊都不同
以下為3則gdb crash report 內容
此問題大多發生於線上loadnpc/unloadnpcfile/reloaditemdb 後發生
但至今仍無法修復, 望請各位協助.

http://i.imgur.com/nSerbRR.png
http://i.imgur.com/YQ1Gs7j.png



http://i.imgur.com/cRoqiwB.png



http://i.imgur.com/wdg6L15.png
http://i.imgur.com/0XdC99z.png

goddameit 發表於 2014-12-3 00:28:43

可以去看看那段代碼寫了些什麼
比如說:
http://i.imgur.com/MsKpSQu.png

clif.c ---> 第16331行
------------------------------------------------------------------------
一般來說, crash是因為你直接用了沒有"資料"的東西做運算,
範例:bool for_example() {
TBL_PC* sd;
return ( sd->bl.x == 123 );
}

盧卡斯 發表於 2014-12-6 16:21:26

goddameit 發表於 2014-12-3 12:28 AM static/image/common/back.gif
可以去看看那段代碼寫了些什麼
比如說:



謝謝你的回覆,
不過第一張圖中
clif_elemental_updatestatus
call了WIFIFOHEAD這個function
而WIFIFOHEAD這個function 把fd 用了來當array的index
由於那個fd是負數,出現Array index out of bounds,導致CRASH
那個fd是用fd = sd -> fd 取得值的

這sd 是由elemental.c 中的elemental_heal function CALL的
pass的value 是ed->master, 而ed是elemental_data

這ed來自status.c 中的status_heal 中的bl
status_heal的bl又來自map.c中map_foreachregen中的bl
在這裏, bl 有被for loop更改過內容
        for( bl = (struct block_list*)dbi_first(iter); dbi_exists(iter); bl = (struct block_list*)dbi_next(iter) )

....從這開始 我就看不懂了

而第3張圖中
我看到的是進入摩洛克洞穴副本的坐標
報錯#0 中說pos是6時產生了CRASH
        map.block = bl->next;

有可能也是Array index out of bounds的問題,
但我不知道這個block的index上限是源自哪裏,
只知道這個pos也是源自blocklist


goddameit 發表於 2014-12-6 21:37:26

盧卡斯 發表於 2014-12-6 04:21 PM static/image/common/back.gif
謝謝你的回覆,
不過第一張圖中
clif_elemental_updatestatus


你有改過源碼嗎?像是修改或添加功能

盧卡斯 發表於 2014-12-7 14:23:32

本帖最後由 盧卡斯 於 2014-12-7 02:24 PM 編輯

goddameit 發表於 2014-12-6 09:37 PM static/image/common/back.gif
你有改過源碼嗎?像是修改或添加功能
有修改過很多也增加了不少
RATHENA BUGS太多,有些已經累積了很久都沒處理好,只好自己處理

goddameit 發表於 2014-12-7 20:20:25

盧卡斯 發表於 2014-12-7 02:23 PM static/image/common/back.gif
有修改過很多也增加了不少
RATHENA BUGS太多,有些已經累積了很久都沒處理好,只好自己處理

那問題就會複雜很多,
你可以選擇重回使用沒改過的,
或是用些應付性的修復,
像是只允許正整數, 引用資料前都加上檢查,
範例:if( fd < 0 || fd > sizeof(array) ) return;if( !sd ) return;
頁: [1]
查看完整版本: 地圖伺服器隨機性崩潰