2011-12-07 41 views
6

有沒有什麼辦法可以設置一個符號斷點,當任何OpenGL函數調用設置除GL_NO_ERROR以外的任何其他狀態時都會觸發該符號斷點?初步證據表明opengl_error_break旨在爲此目的服務,但不會中斷。我可以在Xcode 4中觸發OpenGL錯誤的斷點嗎?

+0

您可以創建一個背景的NSTimer一個觸發間隔爲3幀左右,監控錯誤代碼並讓它拋出一個異常/有一個斷點。 –

+1

這會馬上提醒我錯誤情況,但主要目標是在發生錯誤時給我一個調用堆棧,以便我可以輕鬆追蹤違規呼叫。 –

+0

僅供參考,代碼似乎不起作用。我推出了我的:https://gist.github.com/3352303 – Eonil

回答

5

基於Lars的方法,您可以自動實現這種錯誤跟蹤,它基於一些預處理器魔術和生成存根函數。

我寫了一個小的Python script,它處理OpenGL頭(我在示例中使用了Mac OS X之一,但它也應該可以與iOS之一一​​起使用)。

的Python腳本生成兩個文件,a header在您的項目,包括無處不在您調用OpenGL的這樣的(你可以命名,但是你想的頭):

#include "gl_debug_overwrites.h" 

頭包含宏和函數聲明後這個方案:

#define glGenLists _gl_debug_error_glGenLists 
GLuint _gl_debug_error_glGenLists(GLsizei range); 

腳本也同樣流中產生source file,你應該單獨保存,編譯並與您的項目鏈接。

這一操作將包裝所有gl*功能,其中前綴_gl_debug_error_另一個函數,然後檢查類似這樣的錯誤:

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項目):

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

搜索所有你的OpenGL手動或用適當的正則表達式調用。然後,你必須爲glViewport()來電顯示兩個選項示範:

  1. 替換glViewport(...); CHECK_GL_ERROR()
  2. 通話與glDebugViewport(...);更換呼叫並如圖實施glDebugViewport(1)。
+0

這肯定會起作用,但是通過一個大型項目來遍歷有條件編譯的'glGetError'調用正是我不想做的事情。我很驚訝沒有一個我可以打破的象徵。 –