2011-12-07 8 views
6

क्या कोई तरीका है कि मैं एक प्रतीकात्मक ब्रेकपॉइंट सेट कर सकता हूं जो किसी भी OpenGL फ़ंक्शन कॉल GL_NO_ERROR के अलावा किसी अन्य राज्य को सेट करते समय ट्रिगर करेगा? शुरुआती सबूत बताते हैं कि opengl_error_break का उद्देश्य केवल उस उद्देश्य को पूरा करना है, लेकिन यह तोड़ नहीं देता है।क्या मैं एक्सकोड 4 में ओपनजीएल त्रुटियों पर ब्रेकपॉइंट ट्रिगर कर सकता हूं?

+0

आप एक पृष्ठभूमि NSTimer कि हर 3 फ्रेम आग या तो बना सकते हैं कि त्रुटि पर नज़र रखता है:

यह फिर एक और समारोह जो _gl_debug_error_ लगी होती है तो जो इस के समान त्रुटियों के लिए जाँच करता है में सभी gl* कार्यों लपेटो जाएगा कोड और यह एक अपवाद फेंक दिया है/एक ब्रेकपॉइंट है। –

+1

यह तुरंत त्रुटि की स्थिति को सतर्क करने के करीब आ जाएगा, लेकिन मुख्य लक्ष्य मुझे त्रुटि के समय कॉलस्टैक दे रहा है ताकि मैं आसानी से अपमानजनक कॉल को ट्रैक कर सकूं। –

+0

संदर्भ के लिए, कोड काम नहीं करता प्रतीत होता है। मैंने अपना एक रोल किया: https://gist.github.com/3352303 – Eonil

उत्तर

5

लार्स के दृष्टिकोण के आधार पर आप स्वचालित रूप से त्रुटियों की इस ट्रैकिंग को प्राप्त कर सकते हैं, यह कुछ प्रीप्रोसेसर जादू और स्टब फ़ंक्शन उत्पन्न करने पर आधारित है।

मैंने एक छोटा Python script लिखा जो ओपनजीएल हेडर को संसाधित करता है (मैंने उदाहरण में मैक ओएस एक्स का उपयोग किया था, लेकिन इसे आईओएस में से एक के साथ भी काम करना चाहिए)।

अजगर स्क्रिप्ट हर जगह अपनी परियोजना में शामिल करने के लिए दो फ़ाइलों, a header उत्पन्न करता है जहाँ आप इस तरह ओपन कॉल (आप शीर्ष लेख को मनचाहे नाम कर सकते हैं):

#include "gl_debug_overwrites.h" 

हेडर के बाद मैक्रो और समारोह घोषणाओं में शामिल है इस योजना:

#define glGenLists _gl_debug_error_glGenLists 
GLuint _gl_debug_error_glGenLists(GLsizei range); 

स्क्रिप्ट भी एक ही धारा में एक source file पैदा करता है जो आप अलग से बचाने चाहिए, संकलन और अपनी परियोजना के साथ लिंक।

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

कूल सामान! @ मैटविल्डिंग: मुझे लगता है कि टॉर्स्टन ने मेरे मुकाबले ज्यादा बकाया होने का हकदार है। अगर यह अभी भी संभव है तो कृपया बदलें! –

+0

@LarsSchneider, 24 घंटे की समयसीमा समाप्त हो गई, तो यह हमेशा के लिए आपका है। सबसे अच्छा मैं कर सकता हूं ग्रीन चेकमार्क ले जाया गया है। आपके इनपुट के लिए दोनों के लिए धन्यवाद। –

+0

एक्सकोड में आप इस पायथन स्क्रिप्ट का उपयोग कैसे करते हैं? – Jonny

1

मुझे लगता है कि समस्या से आपको क्या मिल सकता है capture OpenGL ES Frames ("ओपनजीएल ईएस फ्रेम्स कैप्चर करें" पर नीचे स्क्रॉल करें), जो अब एक्सकोड द्वारा समर्थित है। कम से कम इस तरह मैं अपने ओपनजीएल गेम्स को डिबग कर रहा हूं।

जब आप जानते हैं कि कोई त्रुटि हो रही है तो फ्रेम को कैप्चर करके आप ओपनजीएल स्टैक में इस मुद्दे को बहुत अधिक प्रयास किए बिना पहचान सकते हैं।

उम्मीद है कि यह मदद करता है!

+0

हाँ, फ़्रेम कैप्चरिंग एक बहुत ही अच्छी क्षमता है, और मैं इसे बड़े पैमाने पर उपयोग करता हूं। दुर्भाग्यवश, मुझे सबसे पहले नोटिस करना होगा कि OpenGL एक त्रुटि स्थिति में है, फिर मैन्युअल रूप से फ्रेम को कैप्चर करें, फिर त्रुटि को अलग करने के लिए फ्रेम के लिए कॉल चलाएं। यह काम करता है, लेकिन मैं वास्तव में बस स्वचालित रूप से तोड़ना चाहूंगा। यह मुझे कुछ समय बचाएगा, और ऐसा लगता है कि यह संभव होना चाहिए। आपके समय के लिए धन्यवाद। –

+0

हाँ, मैं समझता हूं कि आप इसे स्वचालित रूप से करना चाहते हैं ... मुझे यकीन नहीं है कि यह एक्सकोड के साथ संभव है या नहीं। देखेंगे कि मुझे कुछ और मिला है – Goles

5

डीबग मोड में प्रत्येक कॉल के बाद glGetError पर कॉल करने के लिए अपने ओपनजीएल कॉल को लपेटें। रैपर विधि के भीतर एक सशर्त ब्रेकपॉइंट बनाएं और जांचें कि glGetError का वापसी मूल्य GL_NO_ERROR से कुछ अलग है या नहीं।

विवरण:

(OolongEngine परियोजना से) अपनी परियोजना के लिए इस मैक्रो जोड़ें: आपके सभी ओपन स्वयं या एक उपयुक्त RegEx के साथ कॉल के लिए

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

खोजें। तो आपके पास दो विकल्प अनुकरणीय glViewport() कॉल के लिए दिखाया गया है:

  1. glViewport(...); CHECK_GL_ERROR()
  2. साथ कॉल बदलें glDebugViewport(...); साथ कॉल बदलें और glDebugViewport लागू रूप में दिखाया गया है (1)।
+0

यह निश्चित रूप से काम करेगा, लेकिन सशर्त रूप से संकलित 'glGetError' कॉल हर जगह छिड़कने के लिए एक बड़ी परियोजना के माध्यम से वापस जाना ठीक है जो मैं नहीं करना चाहता हूं। मुझे आश्चर्य है कि कोई प्रतीक नहीं है जिसे मैं बस तोड़ सकता हूं। –

संबंधित मुद्दे