2011-12-07 5 views
6

OpenGL関数呼び出しによってGL_NO_ERROR以外の状態が設定されたときにトリガするシンボリックブレークポイントを設定する方法はありますか?最初の証拠によると、opengl_error_breakはその目的だけに役立つことを意図していますが、壊れません。Xcode 4のOpenGLエラーでブレークポイントを起動できますか?

+0

あなたがエラーを監視し3つのフレーム毎かそこらを発射背景NSTimerを作成することができますコードを作成し、例外をスローするか、ブレークポイントを持つようにしてください。 –

+1

それはすぐに私にエラー状態を警告するのに近いでしょうが、主な目的は、エラー時にコールスタックを与えて、問題のコールを簡単に追跡できるようにすることです。 –

+0

参考のため、コードは機能していないようです。私は私のものを巻いた:https://gist.github.com/3352303 – Eonil

答えて

5

Larsのアプローチに基づいて、このエラーの追跡を自動的に行うことができます。これは、いくつかのプリプロセッサマジックとスタブ関数の生成に基づいています。

私はOpenGLヘッダーを処理する小さなPython scriptを書きました(この例ではMac OS Xを使用しましたが、iOSでも動作するはずです)。

#include "gl_debug_overwrites.h" 

ヘッダが後マクロや関数の宣言が含まれています:あなたはこのようにOpenGLを呼び出します(あなたが欲しいしかし、ヘッダに名前を付けることができます)どこ

ザ・Pythonスクリプトは、どこでも、あなたのプロジェクトに含めるために、2つのファイル、a headerを生成し、この方式:

#define glGenLists _gl_debug_error_glGenLists 
GLuint _gl_debug_error_glGenLists(GLsizei range); 

スクリプトはまた、あなたが、個別に保存してコンパイルして、プロジェクトにリンクする必要があり、同じストリームにsource fileを生成します。

そして、これは、このようなエラーをチェック_gl_debug_error_が付いている別の関数内のすべてのgl*の機能をラップします:

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

クールなもの! @MattWilding:私はTorstenが私よりも恩恵に値すると思う。これが可能ならば変更してください! –

+0

@LarsSchneider、24時間が切れたので、永遠にあなたのものです。私ができることは、緑色のチェックマークを動かすことです。両方のおかげであなたの入力。 –

+0

XcodeでこのPythonスクリプトをどのように使用しますか? – Jonny

1

問題を解決するには、capture OpenGL ES Frames(「OpenGL ESフレームをキャプチャ」までスクロールする)が、Xcodeでサポートされていると思います。少なくともこれが私のOpenGLゲームのデバッグ方法です。

エラーが発生していることがわかったときにフレームをキャプチャすることで、あまり努力することなくOpenGLスタックの問題を特定できます。

希望すると助かります!

+0

ええ、キャプチャフレームは非常にクールな機能であり、私はそれを広く使用しています。残念ながら、私はまずOpenGLがエラー状態になっていることに気づき、その後手動でフレームをキャプチャしてから、フレームを呼び出してエラーを特定してください。それは動作しますが、私は本当に自動的に壊れてしまいます。それは私にしばらく時間を節約し、それが可能であるように思われる。御時間ありがとうございます。 –

+0

ええ、私はそれを自動的にやりたいと思っています... Xcodeで可能かどうかは分かりません。 – Goles

5

デバッグモードで呼び出すたびにOpenGL呼び出しを呼び出してglGetErrorにラップします。ラッパーメソッド内で、条件付きブレークポイントを作成し、glGetErrorの戻り値がGL_NO_ERRORと異なるものであるかどうかを確認します。

詳細:

(OolongEngineプロジェクトから)プロジェクトにこのマクロを追加します。すべてのあなたのOpenGLのための

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

検索は手動で、または適切な正規表現で呼び出します。

  1. glDebugViewport(...);とコールを交換し、(1)に示すようにglDebugViewportを実装glViewport(...); CHECK_GL_ERROR()
  2. で呼び出しを置き換えます。そして、あなたはglViewport()呼び出しに示された典型的な2つのオプションがあります。
+0

これは確かにうまくいくでしょうが、条件付きでコンパイルされた 'glGetError'呼び出しをどこにでも振りかける大規模なプロジェクトに戻ってきて、まさに私がしたくないものです。私はちょうど打ち破ることができるシンボルがないことに驚いています。 –

関連する問題