[Python] Need Debugging Help

deanej

Deity
Joined
Apr 8, 2006
Messages
4,859
Location
New York State
With my Star Trek mod I have a nasty python exception that I can't trace.

Here's an image of the error.

A link to the mod is in my signature. The DS9 scenario gets the same error but much sooner, so if you want to see it first hand you need to look there. I think it's due to large empires and construction ships, but I don't know why as I don't understand AI code.
 
Here are the steps I would go through to debug this; note that I am just looking at the source (beta3) and haven't actually installed and run it.

First, the error message says that the problem is a list index out of range and it is occuring at line 43 of CvAI.py in the function getPlayerAIInfo. Here is that function; line 43 is the final line (the return statement):

Code:
	def getPlayerAIInfo(self, iID):
		printd("self.iNumPlayerAIInfos")
		printd(self.iNumPlayerAIInfos)
		
		if (iID < 0 or iID > self.iNumPlayerAIInfos):
			fassert
			
		return self.apPlayerAIInfos[iID]
So the problem is that the value iID is outside the range of usable subscripts for the list self.apPlayerAIInfos. Assuming printd is a debug print function which outputs to PythonDbg.log, I would make the following additions to that function (the two bold lines)
Code:
	def getPlayerAIInfo(self, iID):
		printd("self.iNumPlayerAIInfos")
		printd(self.iNumPlayerAIInfos)
		
		if (iID < 0 or iID > self.iNumPlayerAIInfos):
			fassert
			
		[B]printd("iID: %d" % (iID))[/B]
		[B]printd("self.apPlayerAIInfos: %s" % (str(self.apPlayerAIInfos)))[/B]
		return self.apPlayerAIInfos[iID]
This will print out the iID value as well as the full list; you can then load up the save you were testing, trigger the error, and then examine the log to compare the two to see why the id is out of range. Two likely causes are that the id is something like -1 or that the list is smaller than it is expected to be. Once you determine which piece is the problem, you can start working backwards to find and fix the root cause.
 
In general it would be printed to the file PythonDbg.log. However, since printd() is specific to your mod, it might need to be enabled somehow. Check the definition of that function, wherever that is.

I chose it for consistency but you can also import CvUtil and use CvUtil.pyPrint(...) as that is the Firaxis-supplied debug print command or even import sys and use sys.stdout.write(...) directly.
 
I changed it to print and it works fine. I've put the debug output in this post - most of it relevant, some of it possibly not.

EDIT: I think I got the error twice on the turn in question.

Spoiler :
PY:Kurill has grown
iID: 5

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 5

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

PY:portas has grown
PY:prexnak has grown
iID: 9

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 9

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 18

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 18

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 0

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 0

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 0

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

PY:Setlik has grown
PY:Valo has grown
PY:Evora has grown
PY:City Built Event: Ty'Gokor
iID: 2

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

iID: 2

self.apPlayerAIInfos: [<CvAI.CvPlayerAIInfo instance at 0x1B89EF30>, <CvAI.CvPlayerAIInfo instance at 0x1B8A20A8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2148>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2120>, <CvAI.CvPlayerAIInfo instance at 0x1B8A21C0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2198>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2238>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2210>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2288>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2260>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22D8>, <CvAI.CvPlayerAIInfo instance at 0x1B8A22B0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2350>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2328>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2418>, <CvAI.CvPlayerAIInfo instance at 0x1B8A23F0>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2490>, <CvAI.CvPlayerAIInfo instance at 0x1B8A2468>]

PY:City Built Event: Goralis
PY:Avenal has grown
 
Twice sounds right. If you count the entries in the array, you will see that each one has 18 elements. This means that the valid indices are 0 through 17. However, twice on that turn, the function was called with an ID of 18 (the barbarian player).

How to fix it depends on what that class is used for and whether it makes sense to keep track of information for the Barbarian player. If it does make sense, change the various gc.getMAX_CIV_PLAYERS() calls to instead use gc.getMAX_PLAYERS().

On the other hand, if it doesn't make sense to worry about Barbarians, then you want to trace back through the calling functions and make sure that they don't try and access this info for Barbarians. A general approach is something like one of the following.
Code:
if (not pPlayer.isBarbarian()):
	#do normal stuff; barbarians are ignored.
Code:
if (not pPlayer.isBarbarian()):
	#do normal stuff
else:
	#do special barbarian stuff
 
Top Bottom