2013-04-05 1 views
0

J'ai un problème avec l'optimisation LTO dans FlasCC.Le programme C++ compilé avec FlasCC avec -O4 (LTO) se bloque lors de l'appel virtuel

Lorsque compilé avec -O1 résultant swf fonctionne très bien. Mais avec -O4, il s'exécute d'abord correctement, mais se bloque soudainement sur un appel de fonction virtuelle spécifique pendant plus de 15 secondes, puis Flash l'arrête.

J'ai ajouté printfs pour tracer le point exact de blocage à l'aide des journaux Flash.

Il se bloque à printf ("Program_Step: vis init") ne venant jamais dans la vraie implémentation Initialize(). Le pointeur est déclaré comme IGameVisualizer * m_pVisualizer;

code:

virtual void Program_Step(IProgramStep & step) 
    { 
     if (!m_init) 
     { 
      if (m_initCounter > 0) 
      { 
       printf("\n Program_Step : Later... %d skips left", m_initCounter); 
       --m_initCounter; 
       return; 
      } 

      printf("\n Program_Step : Init"); 
      m_init = true; 
      m_pVisualizer = Create_SlotsVisualizer_V1(); 
      printf("\n Program_Step : m_pLogic"); 
      m_pLogic = Create_SlotsLogic_Test(); 

      if (m_pVisualizer) 
      { 
       printf("\n Program_Step : vis init"); 
       m_pVisualizer->Initialize(); 
      } 

      if (m_pLogic) 
      { 
       printf("\n Program_Step : logic init"); 
       m_pLogic->Initialize(*this); 
      } 

      printf("\n Program_Step : after inits"); 
     } 

     int dt = step.GetTimeDeltaMsec(); 

     ProcessControls(dt); 

     if (m_pLogic) 
      m_pLogic->Process(dt, *this); 

     if (m_pVisualizer) 
      m_pVisualizer->Process(dt); 
    } 
+0

Vous voudrez peut-être placer la nouvelle ligne à la fin de la chaîne, ou au moins vider 'stdout', pour vous assurer qu'elle est vraiment bloquée dans l'appel' printf' ou non. –

+0

Je vois ce que vous voulez dire, je vais ajouter fflush de stdout après chaque printf, mais le vrai hang n'est pas dans printf, évidemment, parce que j'ai ajouté printfs pour trouver où le hang se produit, pas vice versa. – EyeGem

+0

Ok, j'ai ajouté fflush (stdout) après chaque printf() et j'ai tout de même le coup. Ce qui est intéressant, c'est que callstack déclare qu'il se bloque dans la sous-méthode de la classe d'implémentation, GameVisualizerImpl :: LoadConfig, mais il y a des appels printf() au tout début de GameVisualizerImpl :: Initialize() qui appelle LoadConfig() et au tout début de LoadConfig(). Mais le journal de Flash n'a pas de texte de ces printfs() ... – EyeGem

Répondre

0

D'accord, j'ai des raisons déterminées:

1) printf() n'a pas montré vraie place même après fflush()

2) l'une des bibliothèques a été compilé avec -O1, mais une partie de son code de classe est situé dans la méthode publique inline et a été compilé avec -O4 comme une partie d'une autre bibliothèque => apparemment ces deux n'étaient pas compatibles, ce qui provoquait une boucle infinie dans l'analyse du flux binaire. ..

Questions connexes