[About] [News] [Documentation] [Screenshots]
About BuGLe
BuGLe is a tool for OpenGL debugging, implemented as a wrapper library that sits between your program and OpenGL. While still in development, it can already do the following:
- Dump a textual log of all GL calls made.
- Take a screenshot or capture a video.
- Call glGetError after each call to check for errors, and wrap glGetError so that this checking is transparent to your program.
- Capture and display statistics (such as frame rate)
- Force a wireframe mode
- Recover a backtrace from segmentation faults inside the driver, even if the driver is compiled without symbols.
In addition, there is a debugger (gldb) that lets you set breakpoints and examine backtraces. It also lets you examine OpenGL state, enable and disable filters, and drop into gdb to see what is going wrong. A GUI version of the debugger (gldb-gui) is currently in development, and a preliminary version is available with the latest releases. It features a texture viewer and a shader viewer.
You can download the source from the project page, or view the documentation online. BuGLe is also available in Gentoo portage and the BSD ports collection.
Requirements
- GCC 3.2 or later (4.0 is broken, but 4.1 works).
- FFmpeg is needed for video capture
- GNU readline is recommended for history editing in gldb
- GTK+ is required for gldb-gui
- GtkGLExt is highly recommended for gldb-gui (without it, the texture display will not work)
Example
Here is an extract from a log, generated from an application I am writing. Note that GLenums are displayed by name, and pointers are followed to the correct number of elements.
stats.fps: 22.671
stats.fragments: 52335
stats.triangles: 99732
trace.call: glXSwapBuffers(0x8117720, 0x01c00021)
trace.call: glXMakeCurrent(0x8117720, 0x01c00021, 0x8444800) = 1
trace.call: glBindBufferARB(GL_ARRAY_BUFFER, 1)
trace.call: glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE) = 0x45c3c000
trace.call: glUnmapBufferARB(GL_ARRAY_BUFFER) = GL_TRUE
trace.call: glBindBufferARB(GL_ARRAY_BUFFER, 0)
trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
trace.call: glLoadMatrixd(0xbfffe610 -> { { 0, -0.29661, 1.22295, 0 }, { 1.22295, 0, 0, 0 }, { 0, 1.18644, 0.305739, 0 }, { 0.037888, 1.61781, -1.52576, 1 } })
trace.call: glActiveTextureARB(GL_TEXTURE0)
trace.call: glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, 0xbfffe5d0 -> { 0.778524, 0.778524, 0.569631, 0 })
trace.call: glGetIntegerv(GL_MAX_TEXTURE_UNITS, 0xbfffe688 -> 4)
trace.call: glBindBufferARB(GL_ARRAY_BUFFER, 1)
trace.call: glVertexPointer(3, GL_FLOAT, 32, (nil))

