OK論壇

 找回密碼
 註冊
查看: 1101|回復: 5

地圖伺服器隨機性崩潰

 關閉 [複製鏈接]
  • TA的每日心情
    開心
    2018-1-18 03:10 PM
  • 簽到天數: 189 天

    連續簽到: 1 天

    [LV.7]常住居民III

    發表於 2014-12-2 23:37:44 | 顯示全部樓層 |閱讀模式
    伺服器在一次更新後開始隨機性出現crash
    使用gdb 取得的debug report 每次產生的資訊都不同
    以下為3則gdb crash report 內容
    此問題大多發生於線上loadnpc/unloadnpcfile/reloaditemdb 後發生
    但至今仍無法修復, 望請各位協助.












    回復

    使用道具 舉報

  • TA的每日心情
    開心
    2019-8-18 04:57 PM
  • 簽到天數: 2148 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

    發表於 2014-12-3 00:28:43 | 顯示全部樓層
    可以去看看那段代碼寫了些什麼
    比如說:


    clif.c ---> 第16331行
    ------------------------------------------------------------------------
    一般來說, crash是因為你直接用了沒有"資料"的東西做運算,
    範例:
    1. bool for_example() {
    2. TBL_PC* sd;
    3. return ( sd->bl.x == 123 );
    4. }
    複製代碼
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2018-1-18 03:10 PM
  • 簽到天數: 189 天

    連續簽到: 1 天

    [LV.7]常住居民III

     樓主| 發表於 2014-12-6 16:21:26 | 顯示全部樓層
    goddameit 發表於 2014-12-3 12:28 AM
    可以去看看那段代碼寫了些什麼
    比如說:

    謝謝你的回覆,
    不過第一張圖中
    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[bl->m].block[pos] = bl->next;

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


    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2019-8-18 04:57 PM
  • 簽到天數: 2148 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

    發表於 2014-12-6 21:37:26 | 顯示全部樓層
    盧卡斯 發表於 2014-12-6 04:21 PM
    謝謝你的回覆,
    不過第一張圖中
    clif_elemental_updatestatus

    你有改過源碼嗎?像是修改或添加功能
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2018-1-18 03:10 PM
  • 簽到天數: 189 天

    連續簽到: 1 天

    [LV.7]常住居民III

     樓主| 發表於 2014-12-7 14:23:32 | 顯示全部樓層
    本帖最後由 盧卡斯 於 2014-12-7 02:24 PM 編輯
    goddameit 發表於 2014-12-6 09:37 PM
    你有改過源碼嗎?像是修改或添加功能

    有修改過很多也增加了不少
    RATHENA BUGS太多,有些已經累積了很久都沒處理好,只好自己處理
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2019-8-18 04:57 PM
  • 簽到天數: 2148 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

    發表於 2014-12-7 20:20:25 | 顯示全部樓層
    盧卡斯 發表於 2014-12-7 02:23 PM
    有修改過很多也增加了不少
    RATHENA BUGS太多,有些已經累積了很久都沒處理好,只好自己處理

    那問題就會複雜很多,
    你可以選擇重回使用沒改過的,
    或是用些應付性的修復,
    像是只允許正整數, 引用資料前都加上檢查,
    範例:
    1. if( fd < 0 || fd > sizeof(array) ) return;
    複製代碼
    1. if( !sd ) return;
    複製代碼
    回復 支持 反對

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 註冊

    本版積分規則

    Archiver|手機版|小黑屋|OK討論區

    GMT+8, 2024-5-2 05:41 PM , Processed in 0.052267 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回復 返回頂部 返回列表