2012-05-14 39 views
7

मैं ऐसे प्रोग्राम के कोर डंप में संग्रहीत फ्रेम तक पहुंच बनाना चाहता हूं जिसमें डीबग प्रतीक नहीं हैं (मैं इसे सी में करना चाहता हूं)। जब मैं प्रोग्राम खोलता हूं और जीडीबी के अंदर कोर डंप करता हूं तो मुझे कार्यों के नाम सहित एक स्टैक ट्रेस मिलता है। उदाहरण के लिए:कोर डंप (जीडीबी के बिना) से फ्रेम कैसे पढ़ा जाए?

(gdb) bt 
#0 0x08048443 in layer3() 
#1 0x08048489 in layer2() 
#2 0x080484c9 in layer1() 
#3 0x0804854e in main() 

सभी कार्यों के नाम .strtab खंड में निष्पादन योग्य में संग्रहीत हैं। मैं अलग-अलग फ्रेम के साथ स्टैक ट्रेस कैसे बना सकता हूं? बैच मोड में जीडीबी चलाना एक विकल्प नहीं है। और यह भी "जीडीबी से भागों की प्रतिलिपि की जरूरत है" भी एक बुरा विचार है क्योंकि कोड स्वतंत्र रूप से लिखा नहीं गया है।

तो मेरा प्रश्न अधिक सटीक बनाने के लिए: मुझे कोर डंप के अंदर बिंदु कहां मिल सकता है जहां मैं स्टैक जानकारी पढ़ना शुरू कर सकता हूं? क्या उन जानकारी तक पहुंचने के लिए किसी प्रकार की लाइब्रेरी है? एक संरचना मैं उपयोग कर सकते हैं? या इससे भी बेहतर, एक दस्तावेज कैसे उन सूचनाओं को कोर डंप के अंदर संरचित किया जाता है?

(मैं पहले से ही सवाल "how to generate a stack trace from a core dump file in C, without invoking an external tool such as gdb" देखा है, लेकिन बाद से वहाँ कोई वैध जवाब है, मैंने सोचा था कि मैं इसे फिर से पूछना होगा)

[संपादित करें] मैं लिनक्स 86 के तहत इस कर रहा हूँ

+3

विंडोज, लिनक्स या MacOS? x86, x86_64, पीपीसी, आर्म ....? – Flexo

+0

ओह भगवान, मुझे खेद है, भूल गया! लिनक्स, x86 – Uhlo

+0

http://www.kernel.org/doc/man-pages/online/pages/man5/core.5.html – Flexo

उत्तर

7

कॉर्डम्प में स्टैक जानकारी भी शामिल है। यदि आप इस स्टैक जानकारी का उपयोग ईबीपी और ईआईपी रजिस्टर मूल्यों के साथ coredump फ़ाइल में कर सकते हैं, तो आप स्टैक ट्रेस प्रिंट कर सकते हैं। मैंने ऐसा करने के लिए एक कार्यक्रम लिखा था। आप निम्न लिंक में प्रोग्राम पा सकते हैं।

http://www.emntech.com/programs/corestrace.c 

उपयोग: उपर्युक्त प्रोग्राम संकलित करें और जब आप इसे निष्पादित करते हैं तो कोरफाइल दें।

 $corestrace core 

आप प्रतीकों भी मुद्रित करने के लिए चाहते हैं, तो आप इस तरह कार्य करें: का कार्यक्रम है कि उत्पन्न कोर 'परीक्षण' है मान लेते हैं।

 $ nm -n test > symbols 
     $ corestrace core symbols 

नमूना उत्पादन इस तरह दिखता है:

 $ ./coretrace core symbols 

     0x80483cd foo+0x9 
     0x8048401 func+0x1f 
     0x8048430 main+0x2d 
+0

इससे बहुत मदद मिली, धन्यवाद! – Uhlo

+0

लिंक अब काम नहीं करता है, लेकिन मुझे http://emntech.blogspot.com/2012/08/printing-backtracestack-trace-using.html – mephi42

+0

पर एक प्रति मिली, इसके लिए एक गिस्ट जोड़ा गया: https: //gist.github .com/root42/c979b037f85dc4b2be1f3735afedeb1d – Arne