有沒有什麼辦法可以設置一個符號斷點,當任何OpenGL函數調用設置除GL_NO_ERROR
以外的任何其他狀態時都會觸發該符號斷點?初步證據表明opengl_error_break
旨在爲此目的服務,但不會中斷。我可以在Xcode 4中觸發OpenGL錯誤的斷點嗎?
回答
基於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;
}
酷東西! @MattWilding:我覺得Torsten比我更值得賞金。如果仍然有可能,請更改! –
@LarsSchneider,24小時過期,所以永遠是你的。我能做的最好的是移動綠色對號。感謝你們雙方的投入。 –
你如何在XCode中使用這個Python腳本? – Jonny
我認爲可以解決問題的是capture OpenGL ES Frames(向下滾動到「捕獲OpenGL ES框架」),現在Xcode支持該框架。至少這是我如何調試我的OpenGL遊戲。
當您知道發生錯誤時捕獲幀,您可以在沒有太多努力的情況下識別OpenGL堆棧中的問題。
希望它能幫助!
是的,捕捉幀是一個非常酷的功能,我廣泛使用它。不幸的是,我必須首先注意到OpenGL處於錯誤狀態,然後手動捕獲幀,然後遍歷幀的調用以隔離錯誤。它的工作原理,但我真的想自動打破。這會節省我一些時間,似乎應該是可能的。謝謝你的時間。 –
是的,我知道你想自動執行它......我不確定是否可以使用Xcode。將會看到我是否找到別的東西 – Goles
在調試模式下每次調用之後,將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()
來電顯示兩個選項示範:
- 替換
glViewport(...); CHECK_GL_ERROR()
- 通話與
glDebugViewport(...);
更換呼叫並如圖實施glDebugViewport
(1)。
這肯定會起作用,但是通過一個大型項目來遍歷有條件編譯的'glGetError'調用正是我不想做的事情。我很驚訝沒有一個我可以打破的象徵。 –
- 1. Xcode 4斷言錯誤
- 2. 我可以讓Xcode識別我在Xcode之外創建的LLDB斷點嗎?
- 3. 我可以在Xcode 3中運行Xcode 4項目嗎?
- 4. 我可以觸發SimpleButtonAction嗎?
- 5. Xcode 4,我可以拆分Project Navigator嗎?
- 6. Xcode中的mac的OpenGL開發。我可以強制渲染軟件嗎?
- 7. 斷點在xcode 4中不起作用
- 8. XCode 4中異常斷點的幫助
- 9. xcode 4中的斷點窗口IOS4.3
- 10. 我可以同時運行Xcode 3和Xcode 4嗎?
- 11. 我們可以同時使用Xcode 3.2.5和Xcode 4嗎?
- 12. 是否觸發錯誤中斷腳本?
- 13. Xcode 4 SFML opengl
- 14. 錯誤捕捉,我可以中斷並停止進程嗎?
- 15. Button類中的錯誤 - Windows觸發了一個斷點SDL
- 16. 我可以在斷點中重寫方法的返回值嗎?
- 17. 我可以在VS中的CreateProcess上添加斷點嗎
- 18. 我可以在包含的代碼中設置斷點嗎?
- 19. 我可以在Xcode的斷點處檢查變量
- 20. 我可以觸發API調用嗎?
- 21. 今天擴展斷點沒有在Xcode 8.3.2中觸發
- 22. 我可以在mysql中使用觸發器以用於php嗎?
- 23. 的XCode斷點條件錯誤
- 24. 的Xcode 3.2斷點錯誤信息
- 25. 在Xcode 4的錯誤
- 26. 如何在Xcode中創建可以點擊並觸發UIImageView事件的「熱點」
- 27. GetOpenFileName觸發斷點
- 28. 我可以在Xcode 4添加書籤?
- 29. 我可以在C++中捕獲錯誤的指針錯誤嗎?
- 30. 我可以在Xcode 4上獲得Mac故事板嗎?
您可以創建一個背景的NSTimer一個觸發間隔爲3幀左右,監控錯誤代碼並讓它拋出一個異常/有一個斷點。 –
這會馬上提醒我錯誤情況,但主要目標是在發生錯誤時給我一個調用堆棧,以便我可以輕鬆追蹤違規呼叫。 –
僅供參考,代碼似乎不起作用。我推出了我的:https://gist.github.com/3352303 – Eonil