20

क्या लिनक्स कर्नेल में फ़ंक्शन कॉलर प्राप्त करने का कोई तरीका है? मुझे पता है __ func __ निष्पादित कार्य नाम लौटाता है। मैं समारोह जो "__ समारोह __" कहा जाता हैलिनक्स कर्नेल में फ़ंक्शन कॉलर

+2

मुहाहाहा। हाहा ... संवेदना नहीं। –

उत्तर

37

आप __builtin_return_address(0) साथ फोन करने वाले प्राप्त कर सकते हैं के लिए देख रहा हूँ।

कॉलर का कॉलर __builtin_return_address(1) और इसी तरह से है।

यह एक जीसीसी विस्तार, जीसीसी के मैनुअल में प्रलेखित है: http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

संपादित करें: मैं शायद कहना चाहिए, तो आप फोन करने वाले का पता हो जाता है कि। आप समारोह नाम चाहते हैं तो आप %pS के साथ मुद्रित कर सकते हैं, जैसे:

printk("Caller is %pS\n", __builtin_return_address(0)); 

आप इसे प्रिंट नहीं करना चाहते हैं, तो आप उपयोग कर सकते हैं kallsyms_lookup() आदि

+8

यह कुछ प्रभावशाली जुजित्सु है। –

+0

क्या आपको इसका उपयोग करने के लिए सक्षम फ्रेम पॉइंटर्स की आवश्यकता है? – Brad

+0

हां आपको शायद फ्रेम पॉइंटर्स की आवश्यकता है। – mpe

4

चाहे या फ्रेम नहीं संकेत की जरूरत है निर्भर करता है आर्क पर, आईआईआरसी। X86 के लिए, वे निश्चित रूप से इन सुविधाओं का पूरी तरह से शोषण करने के लिए वांछित हैं। यह भी ध्यान रखें कि इस कारण से इनलाइनिंग buildin_return_address की सटीकता को कम कर सकती है।

यदि आप बस एक स्टैक डंप चाहते हैं कि यह देखने के लिए कि कुछ जगह कैसे पहुंची है, तो dump_stack() फ़ंक्शन का उपयोग बेहतर ढंग से buildin_return_address के साथ फ़ॉल करने की कोशिश करने से करें।

5

आप dump_stack() को कॉल करके संपूर्ण कॉल स्टैक सामग्री भी प्रिंट कर सकते हैं।

0

कॉलर फ़ंक्शन नाम प्राप्त करने के लिए, कोई नीचे दिए गए प्रिंटक कमांड का उपयोग कर सकता है।

प्रिंटक ("कॉलर% पीएफ \ n", __builtin_return_address (0));

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