Eseguo una traccia di stack ad un certo punto nel mio programma. Una volta con la funzione libcbacktrace_symbols()
e una volta con unw_get_proc_name()
da libunwind.Offset diverso in backtrace_symbols() di libc e unw_get_proc_name() di libunwind()
backtrace_symbols() Uscita:
/home/jj/test/mylib.so(+0x97004)[0x7f6b47ce9004]
unw_get_proc_name() Uscita:
ip: 0x7f6b47ce9004, offset: 0x458e4
Qui si vede che il puntatore indirizzo istruzioni (0x7f6b47ce9004) è lo stesso e corretto . La funzione Offset 0x97004
da backtrace_symbols() è anche corretto, ma non quello che ricevo da unw_get_proc_name() (0x458e4
).
Qualcuno ha idea di cosa sta succedendo qui e cosa potrebbe causare questa differenza negli offset?
Entrambi i metodi utilizzano un codice simile come i seguenti esempi:
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);
}
Non stai controllando il valore restituito da unw_get_proc_name. Forse non ha successo e restituisce un codice di errore?Non sembra, ma IMO dovresti ancora. Oltre a non mostrare la stampa per backtrace(). Quello per libunwind potrebbe suggerire di avere le vostre impronte errate. – Krzak