में अलग ऑफसेट मैं अपने कार्यक्रम में किसी बिंदु पर एक स्टैक ट्रेस बना देता हूं। एक बार libc के backtrace_symbols()
फ़ंक्शन और libunwind से एक बार।libc के backtrace_symbols() और libunwind के unw_ce_proc_name()
backtrace_symbols() उत्पादन:
/home/jj/test/mylib.so(+0x97004)[0x7f6b47ce9004]
unw_get_proc_name() उत्पादन:
ip: 0x7f6b47ce9004, offset: 0x458e4
यहां आप देख अनुदेश सूचक पता (0x7f6b47ce9004) एक ही है और सही है कि । समारोह एक मैं unw_get_proc_name() (0x458e4
) से प्राप्त backtrace_symbols() भी सही है लेकिन नहीं से 0x97004
ऑफसेट।
क्या किसी के पास कोई संकेत है कि यहां क्या हो रहा है और ऑफसेट में यह अंतर क्या हो सकता है?)
पश्व-अनुरेखन (:
दोनों ही तरीकों से एक ऐसी ही निम्न उदाहरण की तरह कोड का उपयोग
void *array[10];
size_t size;
size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
libunwind:
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);
}
आप unw_get_proc_name से वापसी मूल्य की जांच नहीं कर रहे हैं। शायद यह सफल नहीं है और एक त्रुटि कोड देता है?ऐसा प्रतीत नहीं होता है, लेकिन आईएमओ आपको अभी भी करना चाहिए। इसके अलावा आप बैकट्रैक() के लिए printf नहीं दिखा रहे हैं। Libunwind के लिए एक सुझाव दे सकता है कि आपके प्रिंटफ्स गलत तरीके से हैं। – Krzak