मुझे लिनक्स पर चल रहे 64-बिट mutli-threaded C++ एप्लिकेशन के सिग्नल हैंडलर से स्टैक ट्रेस प्रिंट करने की आवश्यकता है। हालांकि मुझे कई कोड उदाहरण मिले, उनमें से कोई भी संकलित नहीं हुआ। मेरा अवरुद्ध बिंदु ucontext_t संरचना से कॉलर (वह बिंदु जहां संकेत उत्पन्न हुआ था) पता प्राप्त कर रहा है। मुझे मिली सारी जानकारी, ईआईपी रजिस्टर को ucontext.gregs [REG_EIP] या ucontext.eip के रूप में इंगित करती है। ऐसा लगता है कि उनमें से दोनों x86- विशिष्ट हैं। मुझे इंटेल और एएमडी सीपीयू दोनों के लिए 64-बिट अनुपालन कोड चाहिए। क्या कोई मदद कर सकता है?सिग्नल हैंडलर से प्रिंटिंग स्टैक ट्रेस
उत्तर
एक स्टैक ट्रेस होने का हमेशा की तरह एक स्थानीय चर का पता लेने के लिए है, तो कुछ जादुई संख्या इसे करने के लिए, कैसे संकलक कोड उत्पन्न करता है के आधार पर जोड़ने (जो अनुकूलन विकल्प के लिए इस्तेमाल किया पर निर्भर हो सकता कोड संकलित करें), और वहां से वापस काम करें। सभी सिस्टम आश्रित, लेकिन यदि आप जानते हैं कि आप क्या कर रहे हैं तो करने योग्य।
चाहे यह सिग्नल हैंडलर में काम करता है, एक और सवाल है। मैं आपके द्वारा वर्णित प्लेटफॉर्म के बारे में नहीं जानता, लेकिन बहुत से सिस्टम सिग्नल हैंडलर के लिए अलग-अलग स्टैक स्थापित करते हैं, पर कोई लिंक बिना उपयोगकर्ता पहुंच योग्य स्मृति में बाधित स्टैक के साथ।
क्या आपका मतलब बाधित स्टैक पर कोई लिंक नहीं है? –
@wood_brian उपयोगकर्ता सुलभ स्मृति में नहीं है। (ओएस स्पष्ट रूप से जानकारी को किसी भी तरह से रखता है।) –
आपने बाधित स्टैटिक लिखा है। मैंने सोचा था कि आप बाधा ढेर मतलब था। –
एक glibc फ़ंक्शन बैकट्रैक है। मैन पेज में एक उदाहरण सूचीबद्ध है:
#define SIZE 100
void myfunc3(void) {
int j, nptrs;
void *buffer[100];
char **strings;
nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
अधिक संदर्भ के लिए मैन पेज देखें।
यह कहना मुश्किल है कि क्या यह वास्तव में सिग्नल हैंडलर से काम करने की गारंटी है, क्योंकि पॉज़िक्स केवल कुछ पुनर्वित्त कार्यों को सूचीबद्ध करता है जो काम करने की गारंटी देते हैं। याद रखें: सिग्नल हैंडलर को बुलाया जा सकता है जबकि आपकी बाकी की प्रक्रिया एक मॉलोक कॉल के बीच में सही है।
मेरा अनुमान है, यह आमतौर पर काम करता है, लेकिन यह समय-समय पर विफल हो सकता है। डीबगिंग के लिए यह काफी अच्छा हो सकता है।
यदि यह करना संभव नहीं है तो यह मुझे आश्चर्य नहीं करेगा। क्या आपने इसे 32 बिट पर करने की कोशिश की है? इसके अलावा, कौन सा distro? –
64 बिट में रजिस्टर आरआईपी है। बहुत यकीन है कि यह कहीं कहीं होगा। –
यह Red Hat 4.1.2-50 है। 32-बिट अनुप्रयोग नहीं हो सकता है क्योंकि हम 60+ जीबी – GMichael