On 12/17/08, Yoav Luft <yoav.l...@gmail.com> wrote:
> I've written a little patch to the stable tree, as a way to acquaint
> myself with the code of freeciv.
> The patch adds the new functionality of plagues to game, which are
> determined randomly based on the size, pollution, improvements and
> trade routes of a city.
> The patch segfaults on me. I get that massage:
> Program received signal SIGSEGV, Segmentation fault.
> 0x000000000041bd7d in pay_for_units (pplayer=0x861e18, pcity=0x1890fc0)
> at ../utility/speclist.h:110
> 110 return genlist_size(tthis->list);
> it only happens when the game.info.plague_on is true, but I do not
> understand what genlist_size() does, or where and why it is called. It
> is my first attempt at adding code to freeciv, and I've spent some
> nights trying to understand what went wrong, but I'm kinda clueless.
> I guess it's not a bug, but rather a I didn't do something they it
> should be done, but I could find what that is.
> Attached is the patch.
> I will appreciate any help, even in explaining me what genlist_size does.
The function genlist_size returns the size of a "genlist" which is a
linked list of pointers. Genlists are used to implement speclists,
which are just macro-generated interfaces to the genlist functions
for specific data types (to avoid the type unsafe void pointers used
by genlists). These data structures are defined in utility/genlist.h
The particular segfault you have there is in all likelyhood caused
by an operation on a NULL list somewhere; it would help if you
looked at the entire backtrace to see the history of function calls.
Then when you have a rough idea of where the NULL list might
be, you can use gdb to step through the code or just insert some
printfs (:D) to have the program tell you how far it gets before
crashing. Once you pin point the location of the NULL access you
can trace back the code path and find what caused the list to
be NULL in the first place (you would check all the changes you
made that get activated by your new setting).
There is some information about using gdb for debugging here:
Also, I looked at your patch and it is actually not that bad at first
glance. Granted you need to setup diff to ignore all those useless
files that change every configure/make cycle, and setup your
editor to follow the freeciv coding style more closely. Of course
this is only if you intend to submit your patch for inclusion later.
Here are some more helpful pages:
Oh and by the way, you should implement new features on the
trunk branch; the "stable" 2.1.x series is only getting bugfixes
Freeciv-dev mailing list