Ich mache einen Stack-Trace an einem bestimmten Punkt in meinem Programm. Einmal mit libc 's backtrace_symbols()
Funktion und einmal mit unw_get_proc_name()
von libunwind.Verschiedene Offset in libc's backtrace_symbols() und libunwind's unw_get_proc_name()
backtrace_symbols() Ausgabe:
/home/jj/test/mylib.so(+0x97004)[0x7f6b47ce9004]
unw_get_proc_name() -Ausgabe:
ip: 0x7f6b47ce9004, offset: 0x458e4
Hier sehen Sie, dass die Befehlszeiger Adresse (0x7f6b47ce9004) gleich und richtig ist . Die Funktion Offset 0x97004
von backtrace_symbols() auch korrekt ist, aber nicht, den ich von unw_get_proc_name get() (0x458e4
).
Hat jemand eine Ahnung, was hier vor sich geht und was diesen Unterschied in Offsets verursachen könnte?
Beiden Verfahren verwenden einen ähnlichen Code wie die folgenden Beispiele:
Backtrace():
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);
}
Sie überprüfen nicht den Rückgabewert von unw_get_proc_name. Vielleicht ist es nicht erfolgreich und gibt einen Fehlercode zurück?Es scheint nicht, aber IMO sollten Sie noch. Außerdem zeigen Sie nicht den Printf für Backtrace(). Die für libunwind könnte vorschlagen, dass Sie Ihre printfs falsch beschriftet haben. – Krzak