2008-09-01 32 views
17

एक्सकोड में हार्ड-ब्रेक का कारण बनने का निर्देश क्या है? उदाहरण के लिए विजुअल स्टूडियो के तहत मैं '_asm int 3' या 'डीबगब्रैक()' कर सकता हूं। कुछ जीसीसी कार्यान्वयन के तहत यह एएसएम ("ब्रेक 0") या एएसएम ("जाल") है।एक्सकोड '__asm ​​int 3/डीबगब्रैक()/हल्ट के बराबर है?

मैंने बिना किसी किस्मत के एक्सकोड के तहत विभिन्न combos की कोशिश की है। (इनलाइन असेंबलर ठीक काम करता है इसलिए यह वाक्यविन्यास मुद्दा नहीं है)।

संदर्भ के लिए यह एक जोर मैक्रो के लिए है। मैं पोर्टेबिलिटी के लिए assert.h में परिभाषाओं का उपयोग नहीं करना चाहता, और क्योंकि वे संस्करण XCode में एक abort() करने के लिए प्रतीत होता है।


जॉन - सुपर, चीयर्स। संदर्भ के लिए इंटेल मैक और आईफोन के लिए int 3 वाक्यविन्यास आवश्यक है।


क्रिस - अपनी टिप्पणी के लिए धन्यवाद, लेकिन कई कारणों से विभिन्न प्लेटफार्मों पर वापस पोर्ट codebases के लिए मानक ज़ोर() फ़ंक्शन से बचने के लिए कर रहे हैं। यदि आप अपने स्वयं के जोर देने की परेशानी के लिए गए हैं तो आमतौर पर आपके पास अतिरिक्त कार्यक्षमता होती है (लॉगिंग, अवांछित, उपयोगकर्ता-बातचीत) जो आप बनाए रखना चाहते हैं।

'__assert "या इसी तरह के कार्यान्वयन के माध्यम से हैंडर को प्रतिस्थापित करने का प्रयास करने का आपका सुझाव पोर्टेबल नहीं होगा। मानक' जोर 'आमतौर पर एक मैक्रो होता है और जब यह मैक पर __assert को मैप कर सकता है, । दूसरे प्लेटफार्म पर टी

उत्तर

18

http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html

asm {trap}   ; Halts a program running on PPC32 or PPC64. 

__asm {int 3}   ; Halts a program running on IA-32. 
+6

, इस 'हो जाता है __asm ​​__ (" $ 3 int ") इंटेल Macs और (शायद)' __asm ​​__ ("जाल") के लिए 'iDevices के लिए'। – zneak

+1

उपरोक्त लिंक अब मृत प्रतीत होता है। – rstackhouse

2

मैं एक Apple Forum में निम्नलिखित मिला:।

Xcode में बनाया किसी भी प्रतीकात्मक टूट के साथ नहीं आती है - लेकिन वे जोड़ने के लिए त्वरित रहे breakpoints विंडो पर जाएं और जोड़ें:

- [एन SException बढ़ाने]

10

तुम बस Debugger() के लिए एक कॉल सम्मिलित कर सकते हैं - कि (अगर यह डिबगर के तहत चलाया जा रहा है) डीबगर में अपने अनुप्रयोग बंद हो जाएगा, या अपवाद के साथ इसे रोकने के अगर यह नहीं है।

इसके अलावा, "पोर्टेबिलिटी कारणों" के लिए assert() से बचें - पोर्टेबिलिटी यह क्यों मौजूद है! यह मानक सी का हिस्सा है, और जहां भी आपको सी कंपाइलर मिल जाएगा, आपको वह मिल जाएगा। आप वास्तव में क्या करना चाहते हैं एक नया दावा हैंडलर परिभाषित करता है जो abort() पर कॉल करने के बजाय डीबगर ब्रेक करता है; वस्तुतः सभी सी कंपाइलर एक तंत्र प्रदान करते हैं जिसके द्वारा आप यह कर सकते हैं।

आमतौर पर यह बस एक समारोह या मैक्रो कि इस प्रोटोटाइप इस प्रकार को लागू करने से किया जाता है:

void __assert(const char *expression, const char *file, int line); 

यह जब एक अभिकथन अभिव्यक्ति में विफल रहता है कहा जाता है। आमतौर पर यह assert() स्वयं नहीं होता है, जो printf() के बाद abort() "करता है जो डिफ़ॉल्ट दस्तावेज व्यवहार है। इस फ़ंक्शन या मैक्रो को कस्टमाइज़ करके, आप इसका व्यवहार बदल सकते हैं।

+2

विफल लाइन पर डीबगर में ड्रॉप करने का एक पोर्टेबल तरीका क्या है? assert() आपको लाइब्रेरी कोड में छोड़ देता है ... – JBRWilkinson

+1

धन्यवाद क्रिस, लेकिन पहले - डीबगर() को हेडर में "बहिष्कृत" चिह्नित किया गया है, बिना किसी प्रतिस्थापन के किसी भी दिशा के, दूसरा - मुझे नहीं पता कि इसके खिलाफ क्या लिंक करना है इसे रखने के लिए आदेश - सामान्य "कोको" और "कोरफाउंडेशन" ढांचे में यह नहीं है - मेरे पास _Debugger –

1

वहाँ भी है निम्नलिखित समारोह है कि उपलब्ध है क्रॉस प्लेटफॉर्म सीधे हॉल्ट() विकल्प के रूप में:

#include <stdlib.h> 

void abort(void); 

हम घातक दावा के मामले में iPhone कार्यान्वयन के लिए हमारे क्रॉस प्लेटफॉर्म इंजन में उपयोग करें। निंटेंडो डीएस/वाईआई/एक्सबॉक्स 360/आईओएस आदि में क्रॉस प्लेटफ़ॉर्म ...

3

पोस्टरिटी के लिए: मेरे पास डीबगर में सही स्टैक फ्रेम पर (और वैकल्पिक रूप से) ऐप को रोकने के लिए कुछ कोड है ताकि आप संलग्न कर सकें ताकि आप संलग्न कर सकें डीबगर बस-इन-टाइम। सिम्युलेटर और डिवाइस (और संभवतः डेस्कटॉप, यदि आपको कभी इसकी आवश्यकता हो) के लिए काम करता है। विस्तृत रूप से पर सिम्युलेटर और डिवाइस में http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

2
kill(getpid(), SIGINT); 

वर्क्स पद विस्तृत।

+0

पर लापता प्रतीक के लिए एक लिंक त्रुटि है, सबसे पहले, = 'raise (SIGINT)'। दूसरा, इन्हें मुख्य धागे में अग्रेषित करने के लिए अजीब प्रवृत्ति है, इसलिए यदि आप इसे किसी अन्य धागे पर करते हैं, तो आप वास्तव में इसे नहीं रोकते हैं जहां आपने इसे उठाया था। – Ilya

2
__builtin_trap(); 

चूंकि डीबगर() की कमी हुई है, इसलिए इसे इसके बजाय काम करना चाहिए।

https://developer.apple.com/library/mac/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCONTROLLEDCRASH

जीसीसी/बजना एएसएम वाक्य रचना के साथ
+1

'__builtin_trap' आपके प्रोग्राम को 'सिगिल' के साथ दुर्घटनाग्रस्त करता है, हालांकि (इसे मुश्किल से बाधित करने के बजाय)। – zneak