¿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?
Respuesta
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ónEl 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;
}
¡Cosas geniales! @MattWilding: Creo que Torsten merece la recompensa más que yo. Por favor, cambie si esto todavía es posible! –
@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. –
¿Cómo se usa este script de Python en XCode? – Jonny
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!
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. –
Sí, entiendo que quieras hacerlo automáticamente ... No estoy seguro de si es posible con Xcode. Veré si encuentro algo más – Goles
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()
:
- sustituir a la llamada con
glViewport(...); CHECK_GL_ERROR()
- Reemplazar la llamada con
glDebugViewport(...);
e implementarglDebugViewport
como se muestra en (1).
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. –
- 1. Agregar un marco OpenGL en Xcode 4
- 2. ¿Cómo se agrega un punto de interrupción en Xcode?
- 3. ¿Cómo imprimir el valor de cadena desde la acción de punto de interrupción en Xcode 4?
- 4. Establecer un punto de interrupción en GDB
- 5. Cómo establecer un punto de interrupción en un proyecto xcode dependiente
- 6. Cómo eliminar puntos de interrupción en XCode
- 7. ¿Cómo puedo expandir los rastreos de pila en XCode 4
- 8. Xcode 4 final - no funcionan los puntos de interrupción en el dispositivo (ipad)
- 9. Depuración de la Excepción en XCode 4
- 10. ¿Es posible crear un punto de interrupción de datos en Xcode?
- 11. No puedo deshabilitar un punto de interrupción (fantasma)
- 12. Xcode + eliminar todos los puntos de interrupción
- 13. Configuración de punto de interrupción en NSKVODeallocateBreak
- 14. GoogleTest: cómo establecer un punto de interrupción?
- 15. cómo crear una acción de mensaje de registro de punto de interrupción en xcode?
- 16. Subproceso 1: Detenido en el punto de interrupción 1
- 17. punto de interrupción condicional en Visual Studio
- 18. gdb punto de interrupción en pthread_create
- 19. ¿Cómo puedo vincular los marcos en Xcode 4?
- 20. Xcode 4 Preview 4 muestra "Build Succeeded" pero con errores
- 21. ¿Un punto de interrupción detiene todos los hilos?
- 22. ¿Cómo puedo activar la coincidencia de paréntesis en Xcode?
- 23. pausa gdb sin punto de interrupción
- 24. Cómo deshabilitar todos los puntos de interrupción en Xcode
- 25. Poner punto de interrupción en función nombrada
- 26. Visual Studio: ¿Cómo activar una alarma cuando se golpea un punto de interrupción?
- 27. ¿Cómo puedo agregar anotaciones a los datos de captura de marcos de OpenGL ES en Xcode?
- 28. Actualizado a Xcode 4: flujo continuo de errores de símbolos duplicados que causan errores de compilación
- 29. Los puntos de corte XCode 4 no se rompen en la línea correcta
- 30. Cómo agregar un punto de interrupción condicional en Visual C++
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. –
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. –
Como referencia, el código no parece funcionar. Lancé mi uno: https://gist.github.com/3352303 – Eonil