That is clearly tedious, but what the heck. I set a breakpoint at the start of CvPlayer::doTurn, and observe the field m_eID to find out what player is running. It is a nine player game. I see id 3,4,5,6,7,8 complete successfully, then the next id is 50 (barbarian, surely), and when I F5 continue, it hangs. Since the players are shuffled, I assume it is coincidence that the id's appear in order, and I assume that id 0,1,2 would be called after the barbarian player.
I guess that means it is during the barbarian player's execution of CvPlayer::doTurn. This function is 150 lines long, so I choose one breakpoint every 50 lines. doResearch is called 50 lines in, verifyCivics is called 100 lines in, and the last line calls CvEventReporter::endPlayerTurn. All three of these breakpoints hit successfully, and when I F5 continue after the endPlayerTurn breakpoint hits, then I get the hang.
That says it is not in CvPlayer::doTurn, but rather after the barbarian finishes and before the next player starts. That would be in the function that calls CvPlayer::doTurn, which is CvPlayer::setTurnActive. But here I get confused. The game is a single player, not pbem, not hot seat, and not simultaneous team turns. If I trace out the logic in setTurnActive, *nothing happens* between the end of one player's doTurn and the start of the next player's doTurn.
Can you suggest how I may proceed to find a hang which occurs after the barbarian player's CvEventReporter::endPlayerTurn but before the next player's doTurn is called?