2009-07-19 13 views
16

पर डीबगर में तोड़ने के लिए मेरे आईफोन प्रोजेक्ट में मैक्रोज़ का दावा करने के लिए, मैं प्रोग्रामिंग रूप से डीबगर में तोड़ने का एक तरीका ढूंढ रहा हूं। विंडोज़ (एमएसवीसी ++) पर, मैं इस उद्देश्य के लिए __debugbreak() का उपयोग कर सकता हूं। इस फ़ंक्शन को आमंत्रित करने से मेरा प्रोग्राम बंद हो जाएगा, डीबगर लॉन्च होगा, और उस लाइन का कॉलस्टैक प्रदर्शित होगा जिसे __debugbreak() कहा जाता है।आईफोन

क्या आईफोन के लिए __debugbreak() के समान कुछ भी है? मैंने डीबगर() की कोशिश की है, लेकिन यह मुझे एक लिंकर त्रुटि देता है।

धन्यवाद, क्लॉस

उत्तर

0

मैं सिर्फ जगह मैं बंद करना चाहते हैं पर एक ब्रेकपाइंट निर्धारित किया है। एक्सकोड लगातार ब्रेकपॉइंट्स को याद करता है, इसलिए जब भी मैं ऐप को जीडीबी के साथ चलाता हूं, तो वह उस बिंदु पर रुक जाएगा।

यदि आप दावा विफलताओं को तोड़ना चाहते हैं, तो ब्रेकपॉइंट सेट करने के लिए एक अच्छी जगह उद्देश्य-सी रनटाइम में objc_exception_throw पर है, जो वास्तव में अपवाद फेंकता है। रन> शो> ब्रेकपॉइंट्स विंडो का उपयोग करें और "प्रतीक के लिए डबल-क्लिक करें" पंक्ति पर डबल-क्लिक करें, फिर नाम टाइप करें।

+0

मैन्युअल रूप से एक ब्रेकपाइंट स्थापित करने के लिए एक विकल्प का दावा है के लिए, क्योंकि उन का दावा नहीं है सब जगह पर हैं। मैं अपने कोड के भीतर से मांग पर ब्रेक ट्रिगर करने का एक तरीका ढूंढ रहा हूं। –

1

पहले OTHER_CFLAGS अपने डिबग लक्ष्य पर करने के लिए -DDEBUG जोड़ें; डीबग बिल्ड बनाने के दौरान यह DEBUG प्रतीक को परिभाषित करेगा।

फिर अपने उपसर्ग हैडर के लिए एक सरल ज़ोर मैक्रो जोड़ें:

#ifdef DEBUG 
#define MyAssert(val) _MyAssert(val) 
#else 
#define MyAssert(val) do { } while(0) 
#endif 

अगला एक मॉड्यूल कहीं में एक _MyAssert समारोह बनाने के लिए:

#ifdef DEBUG 
void _MyAssert(int expression) 
{ 
    if (expression == 0) { 
     NSLog(@"Assertion failed!"); // Place breakpoint here 
    } 
} 
#endif 

अंत में NSLog लाइन पर एक ब्रेकपाइंट पैदा करते हैं।

+0

मेरे लिए काम करता है। मैं यह भी ध्यान दूंगा कि ऊपर सूचीबद्ध कोड "निहित घोषणा" कंपाइलर चेतावनियां देगा। #ifdef DEBUG से ऊपर फ़ंक्शन की घोषणा जोड़ें .. शून्य _MyAssert (int val); इसके अलावा, एक आईफोन प्रोजेक्ट के लिए मैंने पाया कि मुख्य.c में फ़ंक्शन कार्यान्वयन को अच्छी तरह से काम करता है। – ohhorob

0

क्या सरल जोर() मैक्रो के साथ कुछ गड़बड़ है?

assert(pointerToTest != nil); 

ऐसी स्थिति पर आपकी प्रक्रिया को रोक देगा यदि स्थिति सत्य नहीं है। यदि डीबगर के तहत चल रहा है, तो आपको कॉल के स्टैक ट्रेस के साथ प्रस्तुत किया जाएगा जिससे असफल दावा हुआ। आप इसे हर बार जब आप एक खास कोड पथ मारा ट्रिगर करना चाहते हैं, तो आप

assert(false); 

कर सकता है मैं इन कथनों की पुष्टि करने कि सभी IBOutlets गैर शून्य जब एक खिड़की या दृश्य एक से लाया जाता है कर रहे हैं के लिए अत्यंत उपयोगी पाते हैं निब।

+0

मुझे लगता है कि समस्या यह है कि आप इस विधि से डीबगर में निष्पादन फिर से शुरू नहीं कर सकते हैं। – Dave

6

ऐप्पल के डेवलपर फ़ोरम पर एक सहायक व्यक्ति ने मुझे डिवाइस पर चलते समय asm("trap") और सिम्युलेटर पर चलते समय asm("int3") का उपयोग करने का सुझाव दिया। यदि आपने डीबग मोड (विकल्प-कमांड-वाई) में अपना प्रोग्राम शुरू किया है तो यह प्रोग्राम डीबगर में टूट जाता है।

(__builtin_trap() भी डीबगर में टूट जाता है, लेकिन आप बाद में जारी नहीं रख सकते हैं। assert(false) प्रोग्राम को एक संदेश के साथ समाप्त करता है, लेकिन डीबगर में नहीं टूटता है।)

+1

एएसएम ("जाल") मेरे लिए काम नहीं करता, एफवाईआई। यह assert.h से जोर देने जैसा ही व्यवहार करता है (जब आप ट्रिगर होते हैं तो आप जारी नहीं रख सकते हैं)। – Dave

26

संपादित

बाहर कर देता है यह भी काम करता है:

#define Debugger() { raise(SIGINT) ; }

मुझे लगता है कि यह एक ही सिद्धांत है।


मैं इस का उपयोग करें:

#define Debugger() { kill(getpid(), SIGINT) ; }

मैं इसे .. आवश्यक नहीं विधानसभा सिम्युलेटर और डिवाइस पर काम करता है लगता है!

+0

इसके अलावा, आप इसे जारी रख सकते हैं ... – nielsbot

+1

मैं पुष्टि कर सकता हूं कि यह डिवाइस और सिम्युलेटर दोनों पर पूरी तरह से काम करता है। बहुत बहुत धन्यवाद! इच्छा है कि मैं इसे स्वीकार कर सकता हूं ... – Bill

0

यदि आप डीबग में अपना प्रोग्राम चलाते हैं, तो आपके ऐप को अमान्य दावे तक पहुंचने पर डीबगर लॉन्च करना चाहिए।

इसे रोकने के लिए, क्योंकि जेन्स अल्फके ने यह कहने की कोशिश की, आपको "उद्देश्य-सी अपवादों पर रोकें" (रन मेनू के तहत) सक्षम करने की आवश्यकता है।

बनाम रिहा

डिबगिंग के बारे में अधिक जानकारी के लिए और इस बात पर ज़ोर, http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/

0

पढ़ मेरा उत्तर https://stackoverflow.com/a/3912667/473067

देखें यह आपको बताता है कि कैसे डीबगर में तोड़ने के लिए, सही ढेर फ्रेम का सही लाइन पर रोक, कुछ इनलाइन असेंबलर मैक्रोज़ का उपयोग करना।

0

एक प्राचीन धागा है, Xcode 7. के लिए इस शोध करते समय एक ही विषय क्या मेरे लिए यह हल एक सुविधा बुलाया "अपवाद बनाएं ब्रेकप्वाइंट ..."

डीबग> ब्रेकप्वाइंट> अपवाद ब्रेकप्वाइंट बनाएं था पाया। ..

यह ब्रेकपॉइंट नेविगेटर (व्यू> नेविगेटर> शो ब्रेकपॉइंट नेविगेटर के तहत) में एक विशेष ब्रेकपॉइंट डालता है।

breakpoint navigator pane showing All Exceptions breakpoint

यह अपवाद की वास्तविक फेंक पर टूट जाता है:

[ exception raise ] 

अपने कोड निष्पादन समाप्त बिना। अगर आप अपना कोड संरचित करते हैं तो आप अभी भी जारी रख सकते हैं।

डबल-क्लिक तोड़ने बिंदु मार्कर "सभी अपवाद" की मदद से आप को समायोजित कहाँ और कैसे अपवाद को तोड़ने बिंदु बंद हो जाता है के बगल में:

break point navigator showing options on for how and when breakpoint occurs