मैं अपने अपवाद हैंडलर और डीबग फ़ंक्शंस को कॉल स्टैक बैकट्रैस प्रिंट करने में सक्षम होना चाहता हूं, मूल रूप से ग्लिब में बैकट्रैक() लाइब्रेरी फ़ंक्शन की तरह। दुर्भाग्यवश, मेरी सी लाइब्रेरी (न्यूलिब) ऐसी कॉल प्रदान नहीं करती है।कॉल स्टैक बैकट्रैक कैसे प्राप्त करें? (गहराई से एम्बेडेड, कोई पुस्तकालय समर्थन नहीं)
मैं कुछ इस तरह है:
#include <unwind.h> // GCC's internal unwinder, part of libgcc
_Unwind_Reason_Code trace_fcn(_Unwind_Context *ctx, void *d)
{
int *depth = (int*)d;
printf("\t#%d: program counter at %08x\n", *depth, _Unwind_GetIP(ctx));
(*depth)++;
return _URC_NO_REASON;
}
void print_backtrace_here()
{
int depth = 0;
_Unwind_Backtrace(&trace_fcn, &depth);
}
जो मूल रूप से काम करता है लेकिन जिसके परिणामस्वरूप निशान हमेशा पूरे नहीं हैं। उदाहरण के लिए, यदि मैं
int func3() { print_backtrace_here(); return 0; }
int func2() { return func3(); }
int func1() { return func2(); }
int main() { return func1(); }
बैकट्रैक केवल func3() और मुख्य() दिखाता है। (यह obv है एक खिलौना उदाहरण है, लेकिन मैं disassembly की जाँच की और पुष्टि की है कि इन कार्यों में पूर्ण सब यहाँ और नहीं कर रहे हैं बाहर अनुकूलित या inlined है।।)
अद्यतन: मैं पुराने ARM7 पर इस पश्व-अनुरेखन कोड की कोशिश की सिस्टम लेकिन एक ही (या कम से कम, जितना संभव हो सके समतुल्य) कंपाइलर विकल्प और लिंकर स्क्रिप्ट और यह एक सही, पूर्ण बैकट्रैस प्रिंट करता है (यानी func1 और func2 गुम नहीं हैं) और वास्तव में यह भी बूट प्रारंभ में मुख्य मुख्य को पीछे छोड़ देता है कोड। तो संभवतः समस्या लिंकर स्क्रिप्ट या कंपाइलर विकल्पों के साथ नहीं है। (इसके अलावा, disassembly से पुष्टि की है कि इस एआरएम 7 परीक्षण में कोई फ्रेम सूचक का उपयोग नहीं किया जाता है)।
कोड को फोमिट-फ्रेम-पॉइंटर के साथ संकलित किया गया है, लेकिन मेरा प्लेटफ़ॉर्म (नंगे धातु एआरएम कॉर्टेक्स एम 3) एक एबीआई को परिभाषित करता है जो किसी भी फ्रेम सूचक का उपयोग नहीं करता है। (इस प्रणाली के पिछले संस्करण में पुरानी एपीसीएस एबीआई एआरएम 7 पर मजबूर स्टैक फ्रेम और फ्रेम पॉइंटर के साथ इस्तेमाल किया गया था, और एक here जैसे बैकट्रैक का उपयोग किया गया था, जो पूरी तरह से काम करता था)।
पूरे सिस्टम को अपवाद के साथ संकलित किया गया है, जो आवश्यक मेटाडेटा सुनिश्चित करता है कि _Unwind उपयोग ELF फ़ाइल में शामिल है। (_Unwind मुझे लगता है कि अपवाद हैंडलिंग के लिए बनाया गया है)।
तो, मेरा प्रश्न है: क्या जीसीसी का उपयोग करके एम्बेडेड सिस्टम में विश्वसनीय बैकट्रैक प्राप्त करने का एक "मानक", स्वीकार्य तरीका है?
मुझे आवश्यक होने पर लिंकर स्क्रिप्ट और क्रेट 0 कोड के साथ गड़बड़ करने की कोई बात नहीं है, लेकिन टूलचैन के लिए कोई भी मौका नहीं लेना चाहता।
धन्यवाद!
http: // stackoverflow सहित कई डुप्लिकेट।कॉम/प्रश्न/77005/कैसे-से-जेनरेट-ए-स्टैकट्रैक-कब-my-gcc-c-app-crashes –
नील: क्या आपने सवाल पढ़ा है? (शीर्षक और बोल्ड मुद्रित रेखा के बगल में?) उसे बैकट्रैक मिल जाता है लेकिन इसमें कुछ बुलाए गए कार्यों को याद किया जाता है। – IanH
एंड्रॉइड एनडीके परियोजनाओं में बैकट्रैक प्रिंटिंग प्राप्त करने में यह सहायक था। – chrisvarnz