6
votes

Puis-je déclencher un point d'arrêt sur des erreurs OpenGL dans Xcode 4?

Y a-t-il un moyen de définir un point d'arrêt symbolique qui déclenchera lorsqu'un appel de fonction OpenGL définit n'importe quel état autre que GL_NO_ERROR ? Preuves initiales suggère OpenGL_Error_break est destiné à servir à ce sujet, mais cela ne casse pas.


3 commentaires

Vous pouvez créer un arrière-plan NSTIMER qui incendie tous les 3 images ou permet de surveiller les codes d'erreur et de faire une exception / avoir un point d'arrêt.


Cela s'approcherait de me alerter immédiatement des conditions d'erreur, mais l'objectif principal est de me donner une pipetack au moment de l'erreur afin que je puisse facilement suivre l'appel incriminé.


Pour référence, le code ne semble pas fonctionner. J'ai roulé mon one: Gist.github.com/3352303


3 Réponses :


1
votes

Je pense que ce qui pourrait vous empêcher de sortir du problème consiste à Capture OpenGL es images (faites défiler jusqu'à "Capture OpenGL ES Cadres"), qui est maintenant prise en charge par XCode. Au moins c'est comme ça que je débrouge mes jeux OpenGL.

En capturant les cadres lorsque vous connaissez une erreur, vous pouvez identifier le problème dans la pile OpenGL sans trop d'effort.

espérons que cela aide!


2 commentaires

Ouais, la capture des cadres est une capacité très fraîche et je l'utilise de manière approfondie. Malheureusement, je dois d'abord remarquer que OpenGL est dans un état d'erreur, puis capturer manuellement le cadre, puis marcher les appels pour le cadre pour isoler l'erreur. Cela fonctionne, mais j'aimerais vraiment simplement vous casser automatiquement. Cela me ferait un peu de temps et semble que cela devrait être possible. Merci pour votre temps.


Oui, je comprends que vous voulez le faire automatiquement ... Je ne sais pas si cela est possible avec Xcode. Va voir si je trouve autre chose



5
votes

Enveloppez vos appels OpenGL pour appeler Glgeterror après chaque appel en mode de débogage. Dans la méthode Wrapper crée un point d'arrêt conditionnel et vérifiez si la valeur de retour de Glgeterror est quelque chose de différent de GL_NO_ERROR . .

détails:

Ajouter cette macro à votre projet (du projet Oolongengine):

#define check_gl_error () ({Glenum __Error = Glgeterror (); if (__ __ error) printf ("Opengl 0x% 04x en% S \ N", __Error, __fonction__); (__Error? Non: oui );})

Recherchez tous vos appels OpenGL manuellement ou avec une regex appropriée. Ensuite, vous avez deux options exemplaires affichés pour le glviewport () appel:

  1. Remplacez l'appel avec Glviewport (...); CHECK_GL_ERROR ()
  2. Remplacez l'appel avec GLDEEBUNVIEWPORT (...); et implémentez gldebugviewport comme indiqué dans (1).

1 commentaires

Cela fonctionnerait certainement, mais remontant à travers un grand projet de saupoudrer de manière conditionnelle glgeterror partout est exactement ce que je ne veux pas avoir à faire. Je suis surpris qu'il n'y ait pas un symbole que je peux juste casser.



6
votes

Basé sur l'approche de Lars, vous pouvez réaliser ce suivi des erreurs automatiquement, il est basé sur une magie de préprocesseur et générant des fonctions de stub.

J'ai écrit un petit script python qui traite l'en-tête OpenGL (j'ai utilisé le Mac OS X un dans l'exemple, mais il devrait également fonctionner avec celui de l'IOS). p>

Le script Python génère deux fichiers, un en-tête à inclure dans votre projet Partout où vous appelez OpenGL comme ceci (vous pouvez nommer l'en-tête, mais vous voulez nommer l'en-tête, vous le souhaitez): P>

GLuint _gl_debug_error_glGenLists(GLsizei range) {
    GLuint var = glGenLists(range);
    CHECK_GL_ERROR();
    return var;
}


4 commentaires

Truc cool! @Mattwilding: Je pense que Torsten mérite plus la prime que moi. S'il vous plaît changer si c'est toujours possible!


@Larsschneider, les 24 heures ont expiré, donc c'est à vous pour toujours. Le mieux que je puisse faire est de déplacer la coche verte. Merci à vous deux pour votre contribution.


Comment utilisez-vous ce script Python en Xcode?


@Jonny Le plus facile devrait être de simplement ajouter le en-tête et Mise en œuvre à votre projet Xcode, ils ont été générés sur un Mac.