Project

General

Profile

Actions

Bug #1741

closed

Server crash due to animal kingdom ai

Added by David Fernandez 27 days ago. Updated 19 days ago.

Status:
Closed
Priority:
Normal
Category:
Server
Target version:
Start date:
11/16/2025
Due date:
% Done:

0%

Estimated time:

Description

I'm playing on 3.1.5+, with a custom scenario/ruleset (that uses to work fine), and the server always crashes when I load my savegame and press end turn (on turn 12).

The crash seems to be caused by the ai of the Animal Kingdom. When I edit the ruleset to give 0 move points to every animal unit, then I can continue the savegame without crashes.

This is the full backtrace:

#0  invasion_funct (ait=ait@entry=0x555555bed6c0 <ai_types>, punit=punit@entry=0x5555577b7ed0, dest=dest@entry=true, radius=radius@entry=0, which=1) at aiunit.c:1033
        _dummy_x = <optimized out>
        tile1_index = 0
        tile1 = <optimized out>
        tile1_start = 0x0
        dummy_y = <optimized out>
        tile1_dummy_x = <optimized out>
        tile1dummy_y = <optimized out>
        _start_dummy_x = <optimized out>
        _startdummy_y = <optimized out>
        tile1_max = 0
        ptile = 0x0
        pplayer = 0x5555580f2cf0
        __FUNCTION__ = "invasion_funct" 
#1  0x00005555556f71b2 in find_something_to_kill (ait=ait@entry=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x5555580f2cf0, punit=punit@entry=0x5555579384a0, 
    pdest_tile=pdest_tile@entry=0x7fffffffd3f0, ppath=ppath@entry=0x7fffffffd3f8, pferrymap=pferrymap@entry=0x0, pferryboat=0x7fffffffd400, pboattype=0x0, 
    pmove_time=0x0) at aiunit.c:1243
        atype = <optimized out>
        aunit_iter = 0x5555577b8590
        aunit = 0x5555577b7ed0
        attack_value = 3
        parameter = {map = 0x0, start_tile = 0x0, moves_left_initially = 0, fuel_left_initially = 0, transported_by_initially = 0x100000001, 
          cargo_depth = 1438676192, cargo_types = {vec = "UU\000\000\240&\"XUU\000\000\006\000\000\000\001", '\000' <repetidos 14 veces>}, move_rate = 0, fuel = 0, 
          utype = 0x0, owner = 0x0, omniscience = false, get_MC = 0x555500000001, get_move_scope = 0x555556506660 <unit_types+160320>, ignore_none_scopes = 240, 
          get_TB = 0x1100000001, get_EC = 0x555555895e30 <normal_move>, get_action = 0x555555894da0 <pf_get_move_scope>, 
          actions = (PF_AA_UNIT_ATTACK | unknown: 0x5572df00), is_action_possible = 0x0, get_zoc = 0x0, is_pos_dangerous = 0x555555895b60 <pf_get_action>, 
          get_moves_left_req = 0x7fff00000001, get_costs = 0x555555895a40 <pf_action_possible>, data = 0x0}
        punit_map = <optimized out>
        ferry_map = <optimized out>
        pos = {tile = 0x5555015d3f00, turn = 1432169072, moves_left = 21845, fuel_left = 1435065184, total_MC = 6, total_EC = 4, dir_to_next_pos = 4294967295, 
          dir_to_here = 1435064896}
        punit_class = 0x5555564ddad0 <unit_classes+432>
        punit_type = 0x555556506660 <unit_types+160320>
        punit_tile = 0x5555582226a0
        boattype = 0x0
        ferryboat = 0x0
        pcity = <optimized out>
        acity_data = <optimized out>
        bcost = <optimized out>
        bcost_bal = <optimized out>
        handicap = false
        unhap = false
        harbor = false
        go_by_boat = <optimized out>
        vulnerability = <optimized out>
        benefit = <optimized out>
        pdefender = <optimized out>
        move_time = <optimized out>
        reserves = <optimized out>
        attack = <optimized out>
        victim_count = <optimized out>
        needferry = <optimized out>
        bk = 0
        want = <optimized out>
        best = 0
        goto_dest_tile = 0x0
        can_occupy = <optimized out>
        nmap = <optimized out>
        __FUNCTION__ = "find_something_to_kill" 
#2  0x00005555556f8a80 in dai_military_attack (ait=ait@entry=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x5555580f2cf0, punit=punit@entry=0x5555579384a0) at aiunit.c:1785
        start_tile = <optimized out>
        path = 0x0
        ferryboat = 0x0
        dest_tile = 0x5555582226a0
        id = 306
        ct = 10
        pcity = 0x0
        __FUNCTION__ = "dai_military_attack" 
#3  0x00005555556fa44a in dai_manage_military (ait=ait@entry=0x555555bed6c0 <ai_types>, nmap=<optimized out>, pplayer=pplayer@entry=0x5555580f2cf0, punit=punit@entry=0x5555579384a0) at aiunit.c:2572
        unit_data = 0x555557938600
        id = 306
        __FUNCTION__ = "dai_manage_military" 
#4  0x00005555556fcdd1 in dai_manage_unit (ait=0x555555bed6c0 <ai_types>, pplayer=0x5555580f2cf0, punit=<optimized out>) at aiunit.c:2739
        unit_data = <optimized out>
        bodyguard = <optimized out>
        is_ferry = false
        ptype = 0x555556506660 <unit_types+160320>
        nmap = <optimized out>
        __FUNCTION__ = "dai_manage_unit" 
#5  0x00005555556fee22 in dai_manage_units (ait=ait@entry=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x5555580f2cf0) at aiunit.c:2887
        punit = 0x5555579384a0
        punit_numbers = 0x7fffffffd6c0
        punit_index = 0
        punit_ul = <optimized out>
        punit_size = <optimized out>
        __FUNCTION__ = "dai_manage_units" 
#6  0x00005555556ebb13 in dai_do_first_activities (ait=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x5555580f2cf0) at aihand.c:758
No locales.
#7  0x00005555556911b7 in cai_do_first_activities (pplayer=0x5555580f2cf0) at classicai.c:450
        deftype = <optimized out>
#8  0x00005555555a9a05 in ai_start_phase () at srv_main.c:1078
        _plr_ = 0x5555580f2cf0
        MY_i = 58
        pplayer = 0x5555580f2cf0
        __FUNCTION__ = "ai_start_phase" 
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
#9  begin_phase (is_new_phase=<optimized out>) at srv_main.c:1327
        __FUNCTION__ = "begin_phase" 
        MY_i = <optimized out>
        pplayer = <optimized out>
        pconn_iter = <optimized out>
        pconn = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
        ptile = <optimized out>
        ptile_index = <optimized out>
        owner = <optimized out>
        pcity = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        plrid = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
#10 srv_running () at srv_main.c:2829
        i = <optimized out>
        is_new_turn = <optimized out>
        skip_mapimg = false
        save_counter = 1
        need_send_pending_events = false
        i = <optimized out>
        is_new_turn = <optimized out>
        skip_mapimg = <optimized out>
        need_send_pending_events = <optimized out>
        save_counter = <optimized out>
        __FUNCTION__ = "srv_running" 
        pconn_iter = <optimized out>
        pconn = <optimized out>
        pmapdef = <optimized out>
#11 srv_main () at srv_main.c:3482
        __FUNCTION__ = "srv_main" 
#12 0x000055555559cfca in main (argc=1, argv=0x7fffffffda28) at civserver.c:486
        inx = 1
        showhelp = <optimized out>
        showvers = <optimized out>
        option = <optimized out>
        __FUNCTION__ = "main" 


Files


Related issues 3 (1 open2 closed)

Related to Bug #1695: SIGSEGV from NULL punit->goto_tileNew09/29/2025

Actions
Related to Bug #1768: savegame: In lack of orders, goto_tile nullified even if unit has ACTIVITY_GOTOClosedMarko Lindqvist11/24/2025

Actions
Related to Feature #1769: savegame: version-gate log message about ACTIVITY_GOTO vs goto_tile inconsistencyClosedMarko Lindqvist11/24/2025

Actions
Actions #2

Updated by Marko Lindqvist 27 days ago

Unit has ACTIVITY_GOTO but no goto_tile.

Actions #3

Updated by Marko Lindqvist 27 days ago

  • Related to Bug #1695: SIGSEGV from NULL punit->goto_tile added
Actions #4

Updated by Marko Lindqvist 27 days ago

Marko Lindqvist wrote in #note-2:

Unit has ACTIVITY_GOTO but no goto_tile.

This discrepancy seems to come from the savegame already - we can't get to the root cause (that made the savegame broken) with this. In this ticket we can only add sanity checking to the savegame loading. We can do reviews for goto_tile code in separate tickets.

Actions #5

Updated by Marko Lindqvist 27 days ago

  • Category set to Server
  • Target version set to 3.1.6
Actions #6

Updated by Marko Lindqvist 27 days ago

Actions #7

Updated by David Fernandez 26 days ago

Thank you for the patch. The cause of the broken savegame might be the scenario I used to start the game, which uses an old format (and might include some error).
I have started other games with the same scenario and I have ended with the same crash problem (on 3.1, while there seems to be no crashes on 3.2). I attach the scenario (made by me for 2.5) in case you want to take a look.

By the way, what would be the suggested way to update an old scenario?, and how to get a light file format like the scenarios that ship with freeciv releases?

Actions #8

Updated by David Fernandez 26 days ago

I have applied your patch, loaded the problematic savegame, and I was able to continue the game without crashes for several turns, but as soon as I load one of the savegames (auto or manual) made in the previous turns, the game crashes again when I press end turn.

This is the backtrace after loading autosave from turn 15 (there is also a similar crash if I load the autosave from turn 13, that I played without problems until I tried to reload the game at turn 15):

#0  invasion_funct (ait=ait@entry=0x555555bed6c0 <ai_types>, punit=punit@entry=0x555558320370, dest=dest@entry=true, radius=radius@entry=0, which=1) at aiunit.c:1033
        _dummy_x = <optimized out>
        tile1_index = 0
        tile1 = <optimized out>
        tile1_start = 0x0
        dummy_y = <optimized out>
        tile1_dummy_x = <optimized out>
        tile1dummy_y = <optimized out>
        _start_dummy_x = <optimized out>
        _startdummy_y = <optimized out>
        tile1_max = 0
        ptile = 0x0
        pplayer = 0x555558491ab0
        __FUNCTION__ = "invasion_funct" 
#1  0x00005555556f7242 in find_something_to_kill (ait=ait@entry=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x555558491ab0, punit=punit@entry=0x555557f6c880, 
    pdest_tile=pdest_tile@entry=0x7fffffffd3f0, ppath=ppath@entry=0x7fffffffd3f8, pferrymap=pferrymap@entry=0x0, pferryboat=0x7fffffffd400, pboattype=0x0, 
    pmove_time=0x0) at aiunit.c:1243
        atype = <optimized out>
        aunit_iter = 0x555558320a30
        aunit = 0x555558320370
        attack_value = 3
        parameter = {map = 0xe, start_tile = 0x9abcf59, moves_left_initially = 0, fuel_left_initially = 0, transported_by_initially = 0x100000001, 
          cargo_depth = 1438676192, cargo_types = {vec = "UU\000\000 \362!XUU\000\000\006\000\000\000\001", '\000' <repetidos 14 veces>}, move_rate = 0, fuel = 0, 
          utype = 0x0, owner = 0x0, omniscience = false, get_MC = 0x555500000001, get_move_scope = 0x555556506660 <unit_types+160320>, ignore_none_scopes = 176, 
          get_TB = 0x55555664e301, get_EC = 0x555555895ec0 <normal_move>, get_action = 0x555555894e30 <pf_get_move_scope>, 
          actions = (PF_AA_UNIT_ATTACK | unknown: 0x5572df00), is_action_possible = 0x0, get_zoc = 0x0, is_pos_dangerous = 0x555555895bf0 <pf_get_action>, 
          get_moves_left_req = 0x7fff00000001, get_costs = 0x555555895ad0 <pf_action_possible>, data = 0x0}
        punit_map = <optimized out>
        ferry_map = <optimized out>
        pos = {tile = 0x555501ac3990, turn = 1451121968, moves_left = 21845, fuel_left = 1448890768, total_MC = 6, total_EC = 4152338029, dir_to_next_pos = 32767, 
          dir_to_here = 46}
        punit_class = 0x5555564ddad0 <unit_classes+432>
        punit_type = 0x555556506660 <unit_types+160320>
        punit_tile = 0x55555821f220
        boattype = 0x0
        ferryboat = 0x0
        pcity = <optimized out>
        acity_data = <optimized out>
        bcost = <optimized out>
        bcost_bal = <optimized out>
        handicap = false
        unhap = false
        harbor = false
        go_by_boat = <optimized out>
        vulnerability = <optimized out>
        benefit = <optimized out>
        pdefender = <optimized out>
        move_time = <optimized out>
        reserves = <optimized out>
        attack = <optimized out>
        victim_count = <optimized out>
        needferry = <optimized out>
        bk = 0
        want = <optimized out>
        best = 0
        goto_dest_tile = 0x0
        can_occupy = <optimized out>
        nmap = <optimized out>
        __FUNCTION__ = "find_something_to_kill" 
#2  0x00005555556f8b10 in dai_military_attack (ait=ait@entry=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x555558491ab0, punit=punit@entry=0x555557f6c880) at aiunit.c:1785
        start_tile = <optimized out>
        path = 0x0
        ferryboat = 0x0
        dest_tile = 0x55555821f220
        id = 306
        ct = 10
        pcity = 0x0
        __FUNCTION__ = "dai_military_attack" 
#3  0x00005555556fa4da in dai_manage_military (ait=ait@entry=0x555555bed6c0 <ai_types>, nmap=<optimized out>, pplayer=pplayer@entry=0x555558491ab0, punit=punit@entry=0x555557f6c880) at aiunit.c:2572
        unit_data = 0x555557f6c9e0
        id = 306
        __FUNCTION__ = "dai_manage_military" 
#4  0x00005555556fce61 in dai_manage_unit (ait=0x555555bed6c0 <ai_types>, pplayer=0x555558491ab0, punit=<optimized out>) at aiunit.c:2739
        unit_data = <optimized out>
        bodyguard = <optimized out>
        is_ferry = false
        ptype = 0x555556506660 <unit_types+160320>
        nmap = <optimized out>
        __FUNCTION__ = "dai_manage_unit" 
#5  0x00005555556feeb2 in dai_manage_units (ait=ait@entry=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x555558491ab0) at aiunit.c:2887
        punit = 0x555557f6c880
        punit_numbers = 0x7fffffffd6c0
        punit_index = 0
        punit_ul = <optimized out>
        punit_size = <optimized out>
        __FUNCTION__ = "dai_manage_units" 
#6  0x00005555556ebba3 in dai_do_first_activities (ait=0x555555bed6c0 <ai_types>, pplayer=pplayer@entry=0x555558491ab0) at aihand.c:758
No locales.
#7  0x00005555556911b7 in cai_do_first_activities (pplayer=0x555558491ab0) at classicai.c:450
        deftype = <optimized out>
#8  0x00005555555a9a05 in ai_start_phase () at srv_main.c:1078
        _plr_ = 0x555558491ab0
        MY_i = 477
        pplayer = 0x555558491ab0
        __FUNCTION__ = "ai_start_phase" 
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
#9  begin_phase (is_new_phase=<optimized out>) at srv_main.c:1327
        __FUNCTION__ = "begin_phase" 
        MY_i = <optimized out>
        pplayer = <optimized out>
        pconn_iter = <optimized out>
        pconn = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
        ptile = <optimized out>
        ptile_index = <optimized out>
        owner = <optimized out>
        pcity = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        plrid = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
        MY_i = <optimized out>
        pplayer = <optimized out>
        _plr_ = <optimized out>
#10 srv_running () at srv_main.c:2829
        i = <optimized out>
        is_new_turn = <optimized out>
        skip_mapimg = false
        save_counter = 1
        need_send_pending_events = false
        i = <optimized out>
        is_new_turn = <optimized out>
        skip_mapimg = <optimized out>
        need_send_pending_events = <optimized out>
        save_counter = <optimized out>
        __FUNCTION__ = "srv_running" 
        pconn_iter = <optimized out>
        pconn = <optimized out>
        pmapdef = <optimized out>
#11 srv_main () at srv_main.c:3482
        __FUNCTION__ = "srv_main" 
#12 0x000055555559cfca in main (argc=1, argv=0x7fffffffda28) at civserver.c:486
        inx = 1
        showhelp = <optimized out>
        showvers = <optimized out>
        option = <optimized out>
        __FUNCTION__ = "main" 
Actions #9

Updated by David Fernandez 20 days ago

After some more tests, I would say that the cause of my crashes is in the save-load process.

When I start a game and continue it without reloading, then I have never found a crash, even playing hundreds of turns against many AIs.

But if I try to load one of the savegames of those games (that I played without problems the first run), then there are high chances of finding a savegame that crashes when I press end turn.

I'm in a situation now where I'm playing a game: if I save the game and then end the turn, the game continues without problems. If I load that savegame, the game crashes. And it is the same every turn. I have to play my game in one run, keeping my pc on, because as soon as I load any savegame of that game, it crashes (with the same invasion_funct backtrace).

I hope it helps, because something is wrong when saving-loading a game does not end in the same state that continuing it without stoping.

Actions #10

Updated by Marko Lindqvist 20 days ago

David Fernandez wrote in #note-7:

By the way, what would be the suggested way to update an old scenario?

Loading it to the server, without starting the game, and saving (in a new format) with the 'scensave' -command.

Actions #11

Updated by Marko Lindqvist 20 days ago

David Fernandez wrote in #note-8:

I have applied your patch, loaded the problematic savegame, and I was able to continue the game without crashes for several turns, but as soon as I load one of the savegames (auto or manual) made in the previous turns, the game crashes again when I press end turn.

Can you attach such a savegame that crashes even with the patch applied?

Actions #12

Updated by David Fernandez 20 days ago

This savegame crashes when I press end turn.

Actions #13

Updated by David Fernandez 20 days ago

Marko Lindqvist wrote in #note-10:

Loading it to the server, without starting the game, and saving (in a new format) with the 'scensave' -command.

Thank you very much, I did not know that.

Marko Lindqvist wrote in #note-11:

Can you attach such a savegame that crashes even with the patch applied?

Sorry, I didn't upload the one at turn 15 because I thought the crashes were easely reproducible from the savegame at turn 12 (the first one I attached). At least, it is hard for me to continue that game without creating corrupt savegames. I have lots of them.

Actions #14

Updated by Marko Lindqvist 20 days ago

Split the issue with this latter savegame to a new ticket -> #1768 (Let's keep this ticket about the issue fixed by the patch here)

Actions #15

Updated by Marko Lindqvist 20 days ago

  • Related to Bug #1768: savegame: In lack of orders, goto_tile nullified even if unit has ACTIVITY_GOTO added
Actions #16

Updated by Marko Lindqvist 20 days ago

  • Related to Feature #1769: savegame: version-gate log message about ACTIVITY_GOTO vs goto_tile inconsistency added
Actions #17

Updated by Marko Lindqvist 19 days ago

  • Status changed from In Review to Closed
Actions

Also available in: Atom PDF