2010-02-17 24 views
5

अभी जब मेरे आवेषण में से एक एक्सकोड में ट्रिगर किया गया है, तो मुझे जोर संदेश मिलता है, और स्टैक का डंप मिलता है, जो उन संख्याओं से भरा होता है जो मेरे लिए बहुत सार्थक नहीं हैं।एक्सकोड - जोर से स्टैक ट्रेस कॉल करें?

कॉल स्टैक का पता लगाने के लिए, मुझे एप्लिकेशन को डीबग करने की आवश्यकता है, और इसे उस बिंदु तक चलाएं जहां पर जोर दिया गया था, और उम्मीद है कि यह फिर से दावा करेगा। 100% प्रतिलिपि बनाने वाली बग के लिए, यह किसी समस्या का बहुत बड़ा नहीं है, लेकिन अभी भी समय बर्बाद है।

यह बेहतर होगा अगर मुझे हर बार एक आक्रमण मारा जाता है तो कॉल स्टैक ट्रेस प्राप्त होता है।

आप एक जोरदार मैक्रो को कैसे परिभाषित करते हैं जो एक्सकोड में कॉल स्टैक ट्रेस को डंप करेगा?

उत्तर

5

NSThread में callStackSymbols नामक एक क्लास विधि है (और NSException में एक ही नाम का एक उदाहरण विधि है)। क्षमा करें, मैं नियमित रूप से अपवादों का उपयोग नहीं करता हूं और नियमित रूप से आवेषण का उपयोग नहीं करता (किसी भी तथ्य पर गर्व नहीं करता), इसलिए मुझे यकीन नहीं है कि दावा मैक्रो को क्या करना चाहिए।

#define AssertWithStackSymbols(x) \ 
do { \ 
    if (!(x)) { \ 
     NSLog (@"%s failed assertion\n%@", #x, [NSThread callStackSymbols]); \ 
     abort(); \ 
    } \ 
} while(0) 

या, जैसा कि KennyTM कृपया ने कहा, आप backtrace_symbols उपयोग कर सकते हैं। यहां तक ​​कि एक विधि भी है जो सीधे प्रतीकों को फ़ाइल डिस्क्रिप्टर, backtrace_symbols_fd पर आउटपुट करती है।

#define AssertWithStackSymbols(x) \ 
do { \ 
    if (!(x)) { \ 
     void *stack[128]; \ 
     int count; \ 
     fputs (#x " failed assertion.\n", stderr); \ 
     count = backtrace (stack, sizeof stack/sizeof (void *)); \ 
     backtrace_symbols_fd (stack, count, STDERR_FILENO); \ 
    } \ 
while (0) 
+0

ओह, उल्लेख करना भूल गया: 'कॉलस्टैकसिंबल्स' विधि केवल मैक ओएस एक्स 10.6 पर उपलब्ध है। – dreamlax

+1

ओएस एक्स 10.5 और आईफोनओएस पर आप 'backtrace_symbols (3)' का उपयोग कर सकते हैं। – kennytm

1

आईओएस 4.x पर आप [NSThread callStackSymbols] का उपयोग कर सकते हैं।

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