2012-11-09 17 views
10

this question और this question पर देखकर मैं देख सकता हूं कि backtrace_symbols() काम करने के लिए, किसी को -rdynamic ध्वज के साथ संकलित करना होगा।backtrace_symbols() दोनों के साथ -स्टिक और-गतिशील

मैं इसे एक परीक्षण कार्यक्रम में की कोशिश की है और यह काम करता है, लेकिन मैं एक प्रोग्राम है जो भी -static साथ संकलित किया गया है और this page का कहना है कि backtrace_symbols() जब -static संकलक/लिंकर को पारित कर दिया है काम नहीं करता है लिख रहा हूँ।

क्या इसके लिए कोई त्वरित कार्यवाही है या मेरे पास मेरे सांख्यिकीय रूप से जुड़े कार्यक्रम में कभी भी मानव-पठनीय बैकट्रैक फ़ंक्शन नहीं होगा?

उत्तर

8

उत्तर पहले से ही था: यह the same page I linked in the question में था। अंत में, मैंने सफलतापूर्वक libunwind का उपयोग किया।

#include <libunwind.h> 
#include <stdio.h> 

void do_backtrace() 
{ 
    unw_cursor_t cursor; 
    unw_context_t context; 

    unw_getcontext(&context); 
    unw_init_local(&cursor, &context); 

    while (unw_step(&cursor) > 0) 
    { 
     unw_word_t offset, pc; 
     char  fname[64]; 

     unw_get_reg(&cursor, UNW_REG_IP, &pc); 

     fname[0] = '\0'; 
     (void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset); 

     printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, pc); 
    } 
} 

int main() 
{ 
do_backtrace(); 
return 0; 
} 

मैं त्रुटियों को जोड़ने क्योंकि मैं था (फिर) कमांड लाइन के अंत में संयोजक विकल्पों जगह forgotting हो रही थी। मुझे वास्तव में समझ में नहीं आता क्यों g++/gcc कमांड लाइन विकल्पों को अनदेखा करते समय कम से कम एक चेतावनी जारी न करें। संकलित करने के लिए है सही कमांड लाइन (-g की जरूरत नहीं है):

g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86 
3

यदि आपको बिल्कुल अपने प्रोग्राम को स्थिर के रूप में संकलित करना है, तो आप फ़ंक्शन के पते खोजने के लिए backtrace() का उपयोग कर सकते हैं और फिर libdwarf का उपयोग करके डीबग जानकारी पार्स करके फ़ंक्शन नाम ढूंढ सकते हैं।

लेकिन यह एक आसान काम नहीं है, इसलिए मैं -rdynamic ध्वज का उपयोग करने का सुझाव दूंगा।

+0

', हाँ -static' मेरे कार्यक्रम में अनिवार्य है। मैंने 'libunwind' के साथ भी कोशिश की लेकिन मेरे उदाहरण प्रोग्राम उबंटू 12.04 x86 और x86_64 दोनों से लिंक नहीं करते हैं। मैं हमेशा इस तरह के रूप जोड़ने त्रुटियों हो रही है: 'अपरिभाषित संदर्भ ' अपरिभाषित संदर्भ _Ux86_get_reg' को 'अपरिभाषित संदर्भ _Ux86_get_proc_name' को बाइनरी उबंटू libunwind और साथ दोनों _Ux86_step' को ' अपरिभाषित संदर्भ _Ux86_init_local' करने के लिए नवीनतम स्वयं संकलित libunwind से डाउनलोड [यहां] (http://download.savannah.gnu.org/releases/libunwind/)। – Avio

+0

@ एवियो मैंने 'libdwarf' का उल्लेख किया है, न कि 'libunwind'। मुझे 'libunwind' – qrdl

+0

से जोड़ने में कोई समस्या नहीं थी, जितनी जल्दी हो सके मैं 'libdwarf' कोशिश करूंगा। मैं सिर्फ 'libunwind' का जिक्र कर रहा था क्योंकि यह किसी भी विशेष आवश्यकता के बिना एक और दिलचस्प विकल्प हो सकता है। आपने सफलतापूर्वक 'libunwind' से लिंक किए जाने पर किस वास्तुकला/वितरण का उपयोग किया था? – Avio

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

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