2011-12-07 16 views
6

¿Hay alguna manera en que pueda establecer un punto de interrupción simbólico que se activará cuando cualquier llamada a la función OpenGL establezca un estado que no sea GL_NO_ERROR? La evidencia inicial sugiere que opengl_error_break está destinado a cumplir ese propósito, pero no se rompe.¿Puedo activar un punto de interrupción en los errores de OpenGL en Xcode 4?

+0

Se puede crear un NSTimer fondo que se activa cada 3 fotogramas o menos que los monitores de error códigos y hacer que arroje una excepción/tenga un punto de interrupción. –

+1

Eso se acercaría a alertarme de las condiciones de error de inmediato, pero el objetivo principal es darme una pila de llamadas en el momento del error para que pueda rastrear fácilmente la llamada ofensiva. –

+0

Como referencia, el código no parece funcionar. Lancé mi uno: https://gist.github.com/3352303 – Eonil

Respuesta

5

Basado en el enfoque de Lars, puede lograr este seguimiento de errores automáticamente, se basa en algunas funciones mágicas de preprocesador y generación de stub.

Escribí un pequeño Python script que procesa el encabezado OpenGL (utilicé el Mac OS X uno en el ejemplo, pero también debería funcionar con el de iOS).

guión

El Python genera dos archivos, a header incluir en su proyecto en todas partes donde se llama a OpenGL como esta (que puede nombrar sin embargo, el encabezado que desee):

#include "gl_debug_overwrites.h" 

La cabecera contiene macros y declaraciones de funciones después de este esquema:

#define glGenLists _gl_debug_error_glGenLists 
GLuint _gl_debug_error_glGenLists(GLsizei range); 

el guión también produce una source file en la misma corriente que debe guardar por separado, de compilación y enlace con su proyecto.

Esto luego envolver todos gl* funciones en otra función que tiene el prefijo _gl_debug_error_ que luego cheques por errores similares a esta:

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

¡Cosas geniales! @MattWilding: Creo que Torsten merece la recompensa más que yo. Por favor, cambie si esto todavía es posible! –

+0

@LarsSchneider, Las 24 horas han expirado, por lo que es suyo para siempre. Lo mejor que puedo hacer es mover la marca de verificación verde. Gracias a ambos por su aporte. –

+0

¿Cómo se usa este script de Python en XCode? – Jonny

1

Creo que lo que podría sacarlo del problema es capture OpenGL ES Frames (baje hasta "Capturar marcos OpenGL ES"), que ahora es compatible con Xcode. Al menos así es como estoy depurando mis juegos OpenGL.

Al capturar los marcos cuando sabe que se está produciendo un error, puede identificar el problema en la pila OpenGL sin demasiado esfuerzo.

Espero que ayude!

+0

Sí, capturar fotogramas es una capacidad genial, y la uso mucho. Desafortunadamente, primero tengo que darme cuenta de que OpenGL está en un estado de error, luego capturar manualmente el marco, luego recorrer las llamadas para el marco para aislar el error. Funciona, pero realmente me gustaría romper automáticamente. Me ahorraría algo de tiempo, y parece que debería ser posible. Gracias por tu tiempo. –

+0

Sí, entiendo que quieras hacerlo automáticamente ... No estoy seguro de si es posible con Xcode. Veré si encuentro algo más – Goles

5

Envuelva sus llamadas OpenGL para llamar al glGetError después de cada llamada en modo de depuración. Dentro del método de envoltura, cree un punto de interrupción condicional y verifique si el valor de retorno de glGetError es diferente de GL_NO_ERROR.

Detalles:

comentar esta macro a su proyecto (de proyecto OolongEngine):

#define CHECK_GL_ERROR() ({ GLenum __error = glGetError(); if(__error) printf("OpenGL error 0x%04X in %s\n", __error, __FUNCTION__); (__error ? NO : YES); })

búsqueda de todas las llamadas de OpenGL manualmente o con un RegEx apropiada. Entonces usted tiene dos opciones ejemplares mostradas por la llamada glViewport():

  1. sustituir a la llamada con glViewport(...); CHECK_GL_ERROR()
  2. Reemplazar la llamada con glDebugViewport(...); e implementar glDebugViewport como se muestra en (1).
+0

Esto ciertamente funcionaría, pero volver a través de un gran proyecto para rociar llamadas 'glGetError' compiladas condicionalmente en todas partes es exactamente lo que no quiero hacer. Me sorprende que no haya un símbolo que pueda romper. –

Cuestiones relacionadas